0

私はCプログラミングの経験があまりありません。このコードのエラーの意味がわかりません。このコードをオンラインにする前に、5回試しました。助けてください。ここでは、リストにノードを追加する 2 つの関数と、リスト全体を表示する関数を使用して、二重にリンクされたリストを実装しています。コンパイルが成功した後、ノードを追加しようとすると、プログラムが予期せず終了します。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct node
{
    int data;
    struct node* next;
    struct node* prev;
};
void display_list(struct node* ptr);    
void add_node(struct node* ptr)
{
    if(ptr->next==NULL)
    {
        ptr=(struct node*)malloc(sizeof(struct node));
        (ptr->next)->next=NULL;
        (ptr->next)->prev=ptr;
    }
    else        
    {   //traverse the list
        while(ptr->next!=NULL)
        {
            ptr=ptr->next;
        }
        (ptr->next)=(struct node*)malloc(sizeof(struct node));
        (ptr->next)->next=NULL;
        (ptr->next)->prev=ptr;
    }
    printf("\nEnter data : ");
    scanf("%d",((ptr->next)->data));
    display_list(ptr);
}
void display_list(struct node* ptr)
{
    if(ptr->next==NULL)
    {
        printf("%d\n",ptr->data);
    }
    else
    {
        //traverse the list and display each node
        while(ptr->next!=NULL)
        {
            printf("%d--->>>---",ptr->data);
            ptr=ptr->next;
        }
            //display last node
        printf("%d",ptr->data);
    }
}
int main()
{
    int choice;
    struct node* start=NULL;
    again:
    printf("\n1) Add node");
    printf("\n2) Display list");
    scanf("%d",&choice);
    if(choice==1)
        add_node(start);
    else if(choice==2)
        display_list(start);
    else 
        goto again;
    return 0;
}
4

4 に答える 4

3

あなたのadd_node関数には、 is かどうかをチェックするステートメントifがありますが、それ自体が であるかどうかを実際にチェックすることはありません。ptr->nextNULLptr NULL

関数では、最初に を呼び出したときに引数が確かに でmainあることがわかります。したがって、その関数で初めてはであり、コードが をチェックしようとするとすぐに問題が発生します。add_nodeNULLptrNULLptr->next


コメントでよく尋ねたので、コードの再構築で私が何を意味したかを示します。

現在、あなたの実装はadd_nodeastruct node *を引数として取ります。問題は、次のような場合です。

struct node* ptr = NULL;
add_node(ptr);

引数add_nodeを適切に処理するように変更しても、それ自体の値は一度返されると変更されません。それを行う1つの方法は、代わりに取ることです。このようなもの:NULLptradd_nodeadd_nodestruct node **

void add_node(struct node ** head) {
    struct node * ptr = *head;

    // use ptr like you had before in the old implementation

    *head = ptr; // updating head.
                 // If ptr has changed, this will update head
                 // If it hasn't, then no harm
}

そうすれば、次のようなものがある場合

struct node *foo;
add_node(&foo);

*head = ptrの最後にあるその行はadd_node、変数を正しい値で更新し、今回foo 返されるときに更新されadd_nodeます。

于 2013-10-13T06:37:09.150 に答える
0

無効なポインターを逆参照しています

    ptr=(struct node*)malloc(sizeof(struct node));
    (ptr->next)->next=NULL;
    (ptr->next)->prev=ptr;

ガベージを含むptrを作成し、そのメンバーにアクセスしますptr->next->next

于 2013-10-13T19:14:50.840 に答える