01/10/2018, 00:29

Lỗi k thêm được phần tử vào danh sách liên kết đơn

Ai giúp em chỉ chỗ sai bài này với ạ. Nó bị lỗi run-time và em k thể phát hiện ra chỗ nào bất hợp lí cả.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>



struct node
{
    char DATA[30];
    struct node *n;

};


struct node* Freenode (struct node* p)
{
    free(p);
}

int Emptynode(struct node* plist)
{
    if(plist==NULL) return 1;
    return 0;
}

struct node* AddHead(struct node *plist, char x[30])
{
    struct node *p;
    p=(struct node*)malloc(sizeof(struct node));
    strcpy(p->DATA,x);
    if(plist==NULL)
    {
        plist=p;
        p->n=NULL;
        return p;
    }
    else
    {
        p->n=plist;
        plist=p;
        return p;
    }

}


struct node *AddTail(struct node* plist, char x[30])
{
    struct node *p, *q;
    if(plist==NULL)
    {
        AddHead(plist,x);
        return (plist);
    }
    else
    {
        p=plist;
        q=(struct node*)malloc(sizeof(struct node));
        strcpy(q->DATA, x);
        while(p->n!=NULL) p=p->n;
        p->n=q;
        q->n=NULL;
        return q;
    }
}

void xuat(struct node* plist)
{
    if (plist)
    {
        printf("
Danh sach cac phan tu cua: 
");
        struct node *p;
        p=plist;
        do
        {
            printf("%s",p->DATA);

            p=p->n;
        }
        while(p->n!=NULL);
        printf("


");
    }
    else printf("
Danh sach rong");
}
int main()
{
    struct node *plist;
    plist=(struct node*)malloc(sizeof(struct node));
    AddHead(plist,"anh");
    xuat(plist);
}
Binh Nguyen Van viết 02:38 ngày 01/10/2018

chỗ vòng lặp while kìa bạn

Weed viết 02:42 ngày 01/10/2018

Bạn nói rõ hơn dk k?

Quân viết 02:41 ngày 01/10/2018
p=plist;
do {
    printf("%s",p->DATA);
    p=p->n;
} while(p->n!=NULL);

đoạn này quá có vấn đề ấy chứ, bạn nhìn thấy chưa.
Sẽ thế nào nếu p=p->n; mà bị null ngay trong vòng do…while. Tại sao bạn lại check p->n 1 lần nữa khi mà bạn đã pull data của next p ra rồi. Cách sửa rất đơn giản.

p = plist;
do {
    printf("%s",p->DATA);
    p = p->n;
} while (p != NULL);

hoặc an toàn hơn nữa là

p = plist;
while(p != NULL) {
    printf("%s",p->DATA);
    p = p->n;
} 
Weed viết 02:30 ngày 01/10/2018

Cám ơn bạn nhiều. Mình đang học nên lơ tơ mơ lắm. Cho mình hỏi thêm vấn đề khai báo ,khởi tạo danh sách và hàm thêm phần tử vào đầu danh sách có vấn đề j k bạn?

struct node *plist;
plist=(struct node*)malloc(sizeof(struct node));

.

struct node* AddHead(struct node *plist, char x[30])
{
    struct node *p;
    p=(struct node*)malloc(sizeof(struct node));
    strcpy(p->DATA,x);
    if(plist==NULL)
    {
        plist=p;
        p->n=NULL;
        return p;
    }
    else
    {
        p->n=plist;
        plist=p;
        return p;
    }

}
Bò Lúc Lắc viết 02:42 ngày 01/10/2018

Hi bạn.
Mình là new member.
Code ban mình sơ qua khá bình thường nhưng vài chổ thấy chưa rõ.(Lâu rồi mình không dụng C/C++ nên cú pháp cụ thể không còn nhớ rõ lắm)
1 bắt đầu từ hàm main:

int main()
{
    struct node *plist;
    plist=(struct node*)malloc(sizeof(struct node));
    AddHead(plist,"anh");
    xuat(plist);
}

bạn cấp phát ngay 1 phần tử rổng đầu tiên cho plist. Chỉ nên làm thế này

int main()
{
    struct node *plist = NULL;
    plist = AddHead(plist,"anh");//Tại hàm AddHead này phẩn tử mới cần khởi tạo
    xuat(plist);
}

2 AddHead

struct node* AddHead(struct node *plist, char x[30])
{
    struct node *p;
    p=(struct node*)malloc(sizeof(struct node));
    strcpy(p->DATA,x);
    if(plist==NULL)
    {
        //Đoạn set biến số ở đây thật ra không cần thiết.
        //khi gọi hàm AddHead(mainPList,"anh");. C sẽ tạo vùng nhớ tạm lưu lại giá trị của mainPList
        //biến plist ở đây được chính là cái vùng nhớ tạm đó.
        //nên việc set plist=p; không có tác dụng gì
        plist=p;
        p->n=NULL;
        return p;
    }
    else
    {
        p->n=plist;
        //Đoạn này cũng không cần thiết
        plist=p;
        return p;
    }

}

Tuy nhiên set trên tổng thể cấu trúc hàm thì nên sửa lại thế này

struct node* AddHead(struct node *plist, char x[30])
{
    struct node *p;
    p=(struct node*)malloc(sizeof(struct node));
    strcpy(p->DATA,x);
    p->n=plist;
    return p;
    //đơn giản hơn phải không
}

3 AddTail

struct node *AddTail(struct node* plist, char x[30])
{
//Không biết bắt đầu sau nhưng mình thấy không đúng
    struct node *p, *q;
    if(plist==NULL)
    {
        //AddHead cho plist nhưng thật ra giá trị của plist không được set lại (vì như giái thích ở trên truyền vào hàm sẽ tạo biết tạm)
        AddHead(plist,x);
        //nên return chổ này cũng giá trị cũ thôi
        return (plist);
        //nên thay bằng:
        return AddHead(plist,x);
        //đơn giản hơn phải không
    }
    else
    {
        p=plist;
        q=(struct node*)malloc(sizeof(struct node));
        strcpy(q->DATA, x);
        while(p->n!=NULL) p=p->n;
        p->n=q;
        q->n=NULL;
        //Mọi thứ đều bt cho đến khi bạn return q;
        return q;
        //nên là:
        return plist;
    }
}

Mình chỉ đóng góp chút ý kiến.

Bài liên quan
0