Добавление списка - ошибка сегментации - PullRequest
1 голос
/ 02 февраля 2011

Я пытаюсь добавить один список в другой. Если я передаю указатель на указатель обоих списков и просто отображаю их, то код работает нормально. Но если я использую код для достижения нулевого указателя в первом списке, а затем приравниваю его к первому из второго, то это дает ошибку сегментации. Пожалуйста, дайте мне знать, в чем ошибка. Код ниже:

#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 ]

5 голосов
/ 02 февраля 2011

Проблема здесь:

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; 
2 голосов
/ 02 февраля 2011
while(aptr)
  aptr=aptr->next;

работает до тех пор, пока aptr не станет NULL, после этого

aptr->next=*b;

вызовет ошибку сегментации, поскольку вы разыменовываете NULL.

...