附加列表 - 分段错误

时间:2011-02-02 14:03:53

标签: c linked-list segmentation-fault

我正在尝试将一个列表添加到另一个列表中。如果我传递两个列表的指针指针并只显示它们,那么代码工作正常。但是如果我使用代码到达第一个列表的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;
        }

2 个答案:

答案 0 :(得分:5)

问题在于:

while(aptr)
    aptr=aptr->next;
aptr->next=*b

当您尝试while时,aptr循环NULL将会aptr->next,您将获得SEGV。

要在到达最后一个节点(aptr->nextNULL)而不是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,

会导致分段错误。