# Đề tài: mat gia tri khi thay doi thu tu goi ham...

1. Thành viên mới
Ngày gia nhập
04 2012
Bài viết
23

## mat gia tri khi thay doi thu tu goi ham...

InsertBottom(&plist,x); x++;//(1)
InsertTop(&plist,x); // (2) khi nhu the nay thi khi goi ham gia tri hien thi la 9 8
//con khi doi cho (2) cho (1) thi gia tri hien ra tren man hin h chi la 9 thui....? minh khog hieu....... moi nguoi giai thich zum nha......bai nay minh lay tu mot bai tren dien dan mang ve nghien cuu

Code:
``` #include<iostream.h>
#include<conio.h>
#include <stdio.h>
#include <stdlib.h>
/*
*/
typedef struct Number
{
int number;
struct Number *next;
} *NODE;

/**All Function**/
void Init(NODE *plist) {*plist = NULL;}

int Empty(NODE plist)
{
if (plist == NULL) return 1;
return 0;
}

void InsertTop(NODE *plist, int x)
{
NODE p = (NODE) malloc (sizeof(struct Number));
p->number = x;
p->next = NULL;
if (Empty(*plist)) *plist = p;
else
{
p->next = *plist;
*plist = p;
}
}

void InsertBottom(NODE *plist, int x)
{
NODE p = (NODE) malloc (sizeof(struct Number));
p->number = x;
p->next = NULL;
if (Empty(*plist)) *plist = p;
else
{
NODE q = *plist;
while (q != NULL) q = q->next;
q = p;
}
}

void InsertPos(NODE *plist, NODE pos, int x)
{
NODE p = (NODE) malloc (sizeof(struct Number));
p->number = x;
p->next = pos->next;
pos->next = p;
}

void DeleteTop(NODE *plist, int *x)
{
if (!Empty(*plist))
{
NODE p = *plist;
*plist = (*plist)->next;
*x = p->number;
free(p);
}
}// day la ham lay va xoa va giai phong bo nho

void DeleteBottom(NODE *plist, int *x)
{
if (!Empty(*plist))
{
NODE p = *plist, q;
while (p->next != NULL)
{
q = p;
p = p->next;
}
*x = p->number;
free(p);
q->next = NULL;
}
}

void DeletePos(NODE *plist, NODE pos, int *x)
{
NODE p = *plist;
while (p->next != pos) p = p->next;
p->next = pos->next;
*x = pos->number;
free(pos);
}

void DeleteALL(NODE *plist)
{
NODE p;
while (!Empty(*plist))
{
p = *plist;
*plist = (*plist)->next;
free(p);
}
}

void Display(NODE plist)
{
NODE p = plist;
while (p != NULL)
{
printf("%6d",p->number);
p = p->next;
}
}
int main()
{
NODE plist;
Init(&plist);
int x=8;

InsertBottom(&plist,x);  x++;//(1)
InsertTop(&plist,x);    // (2) khi nhu the nay thi khi goi ham gia tri hien thi la 9 8
//con khi  doi cho (2) cho (1) thi gia tri hien ra tren man hin h chi la 9 thui....? minh khog hieu....... moi nguoi giai thich zum nha......bai nay minh lay tu mot bai tren dien dan mang ve nghien cuu

Display(plist);
getch();
return 0;
}```

2. Thành viên mới
Ngày gia nhập
04 2012
Bài viết
23
khong ai giai dap gium y kien cua minh ak...........?

3. Nguyên bản được gửi bởi dungc13
khong ai giai dap gium y kien cua minh ak...........?
Sai là phải. Bạn xem nè.
Ban đầu, bạn có x = 8. Thực hiện. TH1 :
Code:
```InsertBottom(&plist,x);
x++;
InsertTop(&plist,x);```
Chạy.
Code:
```void InsertBottom(NODE *plist, int x)
{
NODE p = (NODE) malloc (sizeof(struct Number));
p->number = x;
p->next = NULL;
if (Empty(*plist)) *plist = p;
else
{
NODE q = *plist;
while (q != NULL) q = q->next;
q = p;
}
}```
Lệnh if(Empty(*plist)) sẽ được thực hiên (vì con trỏ plist ban đầu rỗng) sau đó thực hiên *plist = p;
Con trỏ plist trỏ đến 8.
Thực hiện x ++ => x = 9. Sau đó là hàm InsertTop(&plist,x) được thực hiên.
Code:
```void InsertTop(NODE *plist, int x)
{
NODE p = (NODE) malloc (sizeof(struct Number));
p->number = x;
p->next = NULL;
if (Empty(*plist)) *plist = p;
else
{
p->next = *plist;
*plist = p;
}
}```
Bỏ qua lệnh if (plist đã trỏ đến 8), thực hiện else, con trỏ next của 9 trỏ đến vùng địa chỉ của 8. 9 -> 8, plist trỏ lên 9.
TH2 : x = 8
Code:
```InsertTop(&plist,x);
x ++;
InsertBottom(&plist,x);```
Code:
```void InsertTop(NODE *plist, int x)
{
NODE p = (NODE) malloc (sizeof(struct Number));
p->number = x;
p->next = NULL;
if (Empty(*plist)) *plist = p;
else
{
p->next = *plist;
*plist = p;
}
}```
Tương tự TH1, con trỏ plist trỏ đến 8.
Tương tự x ++; => x = 9;
Code:
```void InsertBottom(NODE *plist, int x)
{
NODE p = (NODE) malloc (sizeof(struct Number));
p->number = x;
p->next = NULL;
if (Empty(*plist)) *plist = p;
else
{
NODE q = *plist;
while (q != NULL) q = q->next;
q = p;
}
}```
Tương tự, bỏ qua if, thực hiên else.
Chạy hết vòng lặp while, q = NULL, sau đó gán q = p. <-- Sai
Ở đây, con trỏ next của phần tử cuối ds (ở đây là 8, nó vừa là phần tử đầu, vừa là phần tử cuối ds) chưa trỏ đến địa chỉ của p nên khi thực hiện Display(plist); không cho ra 9.
Hàm InsertBottom() này bạn sửa lại là
Code:
```void InsertBottom(NODE *plist, int x)
{
NODE p = (NODE) malloc (sizeof(struct Number));
p->number = x;
p->next = NULL;
if (Empty(*plist)) *plist = p;
else
{
NODE q = *plist;
while (q->next != NULL) q = q->next;
q->next = p;
}
}```
Đã được chỉnh sửa lần cuối bởi pato24193 : 09-01-2013 lúc 03:36 PM.

4. Thành viên mới
Ngày gia nhập
04 2012
Bài viết
23
thank bạn nhìu.... ? mình thấy mình còn kém quá.....? bạn thật giỏi

#### Quyền hạn của bạn

• Bạn không thể gửi đề tài mới
• Bạn không thể gửi bài trả lời
• Bạn không thể gửi các đính kèm
• Bạn không thể chỉnh sửa bài viết của bạn