追加列表--分段错误

发布于 2024-10-15 16:28:27 字数 1031 浏览 2 评论 0原文

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

I am trying to append one list with another . If i pass a pointer-to-the-pointer of both the lists and just display them, then , the code works fine. But if i use code to reach the NULL pointer of the first list and then equate it to the first one of the second, then it gives a segmentation fault. Please let me know what the mistake is. Code is below :

#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;
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

紅太極 2024-10-22 16:28:27

问题就在这里:

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

当你跳出 while 循环时,当你尝试执行 aptr-> 时,aptr 接下来将是 NULL ;接下来你会得到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; 

The problem is here:

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

When you break out of the while loop aptr will be NULL next when you try to do aptr->next you get the SEGV.

To fix this break out of the loop when you reach the last node(aptr->next will be NULL) rather than aptr becoming NULL.

Something on these line:

// 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; 
情泪▽动烟 2024-10-22 16:28:27
while(aptr)
  aptr=aptr->next;

运行直到 aptr 为 NULL,之后

aptr->next=*b;

会导致分段错误,因为您取消引用 NULL。

while(aptr)
  aptr=aptr->next;

runs till aptr is NULL, after that

aptr->next=*b;

causes a segmentation fault since you dereference NULL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文