在链表元素相减时出现分段错误

4
我正在尝试从两个连续节点中减去一个并将结果放入它们之前的新节点。 但我遇到了分段错误,然后程序停止响应。
这里的`LinkList`是一个结构体。
void subtract_node(LinkList **p)
{
    LinkList *q,*temp=NULL,*r;
    int i=0;
    q=r=*p;
    temp=(LinkList*)malloc(sizeof(LinkList));
    while(q!=NULL)
    {
        temp->item=q->next->item-q->item;
        temp->next=q;
        if(i==0)
        {
            *p=r=temp;
            r=r->next->next;
            q=q->next->next;
        }
        else
        {
            r->next=temp;
            temp=r;
            r=r->next->next;
            q=q->next->next;
        }
        printf("%d",i++);
    }
}

让别人在你的代码中找错并不是特别有效的方法。你应该使用调试器(或添加打印语句)来隔离问题,然后构建一个最小测试用例 - Oliver Charlesworth
你可以给我们结构定义本身,而不是写“这里LinkList是一个结构体”。 - Bernd Elkemann
当你的列表中有奇数个节点时,你认为算法会在结尾发生什么? - WhozCraig
1个回答

1

在链表中,如果您不先对next指针的内容进行null检查,就不能对其进行解引用。具体来说,这个表达式

q->next->item - q->item

q->nextNULL 时会失败。你在循环头部检查了 q 是否为 NULL,但你还需要检查 q->next 以避免崩溃:

while((q!=NULL) && (q->next != NULL)) {
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接