30/09/2018, 22:05
Giúp e fix lỗi bài xóa 1 node bất kì trong bài Danh Sách Liên Kết (trong C) với, chương trình không báo lỗi nhưng chạy sai :
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
//----------------------------Khai bao
struct Node
{
int Data;
struct Node *pNext;
};
typedef struct Node NODE;
struct List
{
NODE *pHead;
NODE *pTail;
};
typedef struct List LIST;
//------------------------------Khoi Tao
void KhoiTao (LIST *l)
{
(*l).pHead = (*l).pTail = NULL;
}
//-------------------------------Tao Node
NODE* TaoNode (int x) // X la du lieu nhap vao
{
NODE *p = (NODE *)malloc(sizeof(NODE)); // Cap phat
if (p == NULL)
return NULL;
p ->Data = x; //Truyen x vao node
p ->pNext = NULL; //
return p;
}
//------------------------Them Node
void ThemNode (LIST *l, NODE *p)
{
if ((*l).pHead == NULL)
(*l).pHead = (*l).pTail = p;
else
{
(*l).pTail ->pNext = p;
(*l).pTail = p;
}
}
//----------------------------Nhap du lieu vao danh sach
void InPut (LIST *l, int n)
{
int i, x;
KhoiTao (l);
for (i = 0 ; i < n ; i++)
{
printf ("Nhap vao du lieu data: ");
scanf ("%d", &x);
NODE *p = TaoNode (x);
ThemNode (l, p);
}
}
//------------------------------Xuat du lieu tu danh sach
void OutPut (LIST l)
{
NODE *p;
for (p = l.pHead ; p != NULL ; p = p ->pNext)
printf ("%5d", p ->Data);
}
//-----------------------------Giai Phong
void GiaiPhong (LIST *l)
{
NODE *p;
while ((*l).pHead == NULL)
{
p = (*l).pHead;
(*l).pHead = (*l).pHead ->pNext;
free (p);
}
}
//------------------------------Xoa Dau
void XoaDau (LIST *l)
{
NODE *p = (*l).pHead;
(*l).pHead = (*l).pHead ->pNext; //Dau tron sang ben canh
free (p);
}
//---------------------------------Xoa Cuoi
void XoaCuoi (LIST *l)
{
NODE *p, *k;
for (k = (*l).pHead ; k != NULL ; k = k ->pNext)
{
if (k == (*l).pTail)
{
(*l).pTail = p; //Cho P lam` pTail
(*l).pTail ->pNext = NULL; //Cho phan tu cuoi = NULL = Xoa;
free (k); //Giai phong k;
return;
}
p = k; //P la thang sau K
}
}
void XoaSau1Node (LIST *l, NODE *p)
{
NODE *k;
for (k = (*l).pHead ; k != NULL ; k = k ->pNext)
{
if (k ->Data == p ->Data)
{
NODE *g = k ->pNext;
k ->pNext = g ->pNext;
free(p);
return;
}
}
}
void Xoa1NodeBatKi (LIST *l, int Data)
{
if ((*l).pHead ->Data == Data)
{
XoaDau(l);
return;
}
else if ((*l).pTail ->Data == Data)
{
XoaCuoi(l);
return;
}
NODE *k, *p;
for (k = (*l).pHead ; k != NULL ; k = k ->pNext)
{
if (k ->Data == Data)
{
XoaSau1Node(l, p);
return;
}
p = k;
}
}
int main()
{
LIST l;
int n;
printf ("Nhap vao so luong data: ");
scanf ("%d", &n);
InPut(&l, n);
printf ("Du lieu vua nhap la: ");
OutPut(l);
int dt;
printf ("
Nhap vao Node can xoa: ");
scanf ("%d", &dt);
Xoa1NodeBatKi(&l, dt);
printf ("Node sau khi xoa la: ");
OutPut(l);
GiaiPhong (&l);
getch();
return 0;
}
Bài liên quan
nhìn sơ qua cái hàm xóa bất kì thì thấy XoaSau1Node(l, p); -> XoaSau1Node(l, k);
không được…sai rồi bạn ơi…hàm đó để mình lấy vị trí của node đứng trước để truyền vào hàm XoaSau1Node
uh đúng rồi …
hàm xóa sau nốt p lại free§ kìa ==’, free(g);
vẫn không được bạn ơi :((
Cái hàm XoaSau1Node
lẽ ra phải free(g); chứ nhỉ
sửa lại cái free§ là chạy được (đã test trên dev-c++)
ok được rồi…e cảm ơn rất nhiều
Bạn nhắc đúng rồi tại tui không nhận ra…sr nha ^.^!
This post was flagged by the community and is temporarily hidden.