我正在尝试将一个列表添加到另一个列表中。如果我传递两个列表的指针指针并只显示它们,那么代码工作正常。但是如果我使用代码到达第一个列表的NULL指针,然后将它等同于第二个列表中的第一个,那么它会给出一个分段错误。请让我知道错误是什么。代码如下:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node* next;
}*Head,*New;
void display(struct node **p)
{
struct node *curptr;
curptr=*p;
if(curptr==NULL)
printf("list is empty");
else
{
while(curptr)
{
printf("->%d",curptr->data);
curptr=curptr->next;
}
}
}
void combine(struct node **a,struct node **b)
{
//display(&(*a));
struct node *aptr;
aptr=*a;
while(aptr)
aptr=aptr->next;
aptr->next=*b;
*b=NULL;
display(&(*a));
//display(&(*a));
//display(&(*b));
}
void main()
{
Head=NULL;
New=NULL;
int choice;
while(1)
{
case 9:
{
printf("Combining two lists");
combine(&Head,&New);
break;
}
答案 0 :(得分:5)
问题在于:
while(aptr)
aptr=aptr->next;
aptr->next=*b
当您尝试while
时,aptr
循环NULL
将会aptr->next
,您将获得SEGV。
要在到达最后一个节点(aptr->next
为NULL
)而不是aptr
成为NULL
时解决此问题。
这些内容:
// if fist list does not exist.
if(*a == NULL) {
*a = *b;
return;
}
struct node *aptr;
aptr=*a;
// loop till you reach the last node of fist list.
while(aptr->next)
aptr=aptr->next;
// append.
aptr->next=*b;
*b=NULL;
答案 1 :(得分:2)
while(aptr)
aptr=aptr->next;
运行直到aptr为NULL,之后
aptr->next=*b;
由于您取消引用NULL,会导致分段错误。