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;
}
Ku Hiệp viết 00:09 ngày 01/10/2018

nhìn sơ qua cái hàm xóa bất kì thì thấy XoaSau1Node(l, p); -> XoaSau1Node(l, k);

Nguyễn Hoàng Nhân viết 00:19 ngày 01/10/2018

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

Ku Hiệp viết 00:15 ngày 01/10/2018

uh đúng rồi …

Ku Hiệp viết 00:09 ngày 01/10/2018

hàm xóa sau nốt p lại free§ kìa ==’, free(g);

Nguyễn Hoàng Nhân viết 00:11 ngày 01/10/2018

vẫn không được bạn ơi :((

Lưu Thành Vương viết 00:08 ngày 01/10/2018

Cái hàm XoaSau1Node

free§;

lẽ ra phải free(g); chứ nhỉ

Lưu Thành Vương viết 00:12 ngày 01/10/2018

sửa lại cái free§ là chạy được (đã test trên dev-c++)

Nguyễn Hoàng Nhân viết 00:12 ngày 01/10/2018

ok được rồi…e cảm ơn rất nhiều

Nguyễn Hoàng Nhân viết 00:05 ngày 01/10/2018

Bạn nhắc đúng rồi tại tui không nhận ra…sr nha ^.^!

Tao Không Ngu. viết 00:20 ngày 01/10/2018

This post was flagged by the community and is temporarily hidden.

Bài liên quan
0