链表 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);
}
我正在用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);
}