链表 prgrm 停止工作错误

Linked List prgrm stopped working error

我正在用C写一个链表程序

问题出在创建函数上。 Create() 在第一个 运行 处完美运行。然后,当我退出菜单并再次调用创建函数时,程序崩溃并显示消息 "linkedlist has stopped working" 提示:链表是我的 prgrm 的名称。

void create()
{
    do
   {
       printf("Enter the num:");
       head=(NODE *) malloc(sizeof(NODE));
       scanf("%d",&head->num);
       head->next=NULL;
       if(start==NULL)
           start=ptr=head;
       else
       {
           ptr->next=head;
           ptr=head;
       }
       printf("Do you want to enter more elements:(1/0)");
       scanf("%d",&ch);
   }
   while(ch==1);
}

我从你的代码中观察到你正在使用 ptr 作为指向链表最后一个节点的指针,如以下 create() 函数行所示:-

if (start==NULL)
    start = ptr = head;
else
{
    ptr->next=head;
    ptr=head;
}

在显示函数中,你又在初始化

ptr = start;

然后遍历到循环的末尾,其中 ptr 变为空,如下所示:-

while(ptr!=NULL)
{
    printf("%d->",ptr->num);
    ptr=ptr->next;
}

(与 delast() 和 delany() 函数类似,您正在执行以下操作:-

free(ptr);

这将再次导致 ptr = null,从而导致 段错误 。 )

因此,当您第一次创建列表时,代码工作正常,因为 ptr 的值被保留,但是,一旦您显示列表,或删除任何元素然后再次返回创建列表(菜单选项1),ptr的值变为null,所以,

ptr->next = head;

导致分段错误

因此,一种可能的解决方案是在 create() 函数中使用一个新指针 *end 而不是 *ptr,并且永远不要使 end = null 的值;如下所示:-

void create()
{
 do{
    printf("Enter the num:");
    head=(NODE *) malloc(sizeof(NODE));
    scanf("%d",&head->num);
    head->next=NULL;
    if(start==NULL)
        start=end=head;
    else
    {
        end->next=head;
        end=head;
    }
    printf("Do you want to enter more elements:(1/0)");
    scanf("%d",&ch);
}
 while(ch==1);
}

或者,你在创建列表的时候,可以遍历到列表的末尾添加新元素,而不是直接使用结束指针(所以,不需要保存额外的结束指针)。

void create()
{
 do{
    printf("Enter the num:");
    head=(NODE *) malloc(sizeof(NODE));
    scanf("%d",&head->num);
    head->next=NULL;
    if(start == NULL)
        start = head;
    else
    {
        ptr = start;
        while (ptr->next != NULL){
            ptr = ptr->next;
        }
        ptr->next = head;
    }        
    printf("Do you want to enter more elements:(1/0)");
    scanf("%d",&ch);
}
 while(ch==1);
}