【问题标题】:Deleting two items from doubly-linked list segfault从双向链表段错误中删除两个项目
【发布时间】:2018-10-15 16:54:35
【问题描述】:

我有一个使用双向链表的程序并对其进行了简化。

NULL [HEADPTR] [VALUEA, 1] [ValueB, 2] [ADD, VALUEA, VALUEB] ...列表的其余部分

NULL [VALUEC, 3] ...列表的其余部分。

我只是对如何删除 VALUEA 和 B 感到困惑。我可以成功删除其中的一个值,但是当我尝试删除它们时,我遇到了分段错误。我知道我删除第二个节点的逻辑是错误的。我正在使用三指针系统来查找和简化值。

while(rightP->next != NULL){
            if(rightP->critical == 'Y'){
                //printf("Found a critial\n");
                //Critical helps me find what I need to merge
                        rightP->field2 = leftP->field2 + middleP->field2;
                        //printf("MERGING ADD %d\n", rightP->field2);
                        temp1 = leftP;
                        if(leftP->prev != NULL)
                            leftP = leftP->prev;
                        else
                            leftP->prev = NULL;
                        leftP->next = temp1->next;
                        leftP->next->prev = leftP;
                        free(temp1);
                        //bad segment
                        //Yields Seg fault
                        temp2 = middleP;
                        middleP->prev = leftP;
                        middleP->next = temp2->next;
                        middleP->next->prev = middleP;
                        middleP = rightP;
                        rightP = rightP->next;
                        free(temp2);
          }
          leftP = leftP->next;
          middleP = middleP->next;
          rightP = rightP->next;
          else{
                leftP = leftP->next;
                middleP = middleP->next;
                rightP = rightP->next;
          }
}

【问题讨论】:

  • 您能否发布一个语法正确的代码?
  • 你不会同时删除 A B。你删除 A。然后你删除 B。删除 B 与删除 A 没有什么不同。

标签: c doubly-linked-list


【解决方案1】:

几年前,我在我的 K&R ansi c 书中记下了一个笔记。 你不能这样做关于你使用free(temp1);

你没有发布完整的代码,但你对temp1 = leftPfree(temp1) 的使用几乎正是我多年前记下的,说不能那样做。

从来没有想到原因,它基于使用malloc()calloc(),然后当使用free() 时,free() 的参数必须是 malloc 或 calloc 语句中使用的指针。

建议您以不同的方式重新使用临时指针;然后假设您使用malloc 的任何指针名称,然后使用该指针并将其设置为您要释放的节点...在调整->next->previous 值以保持列表完整之后.

找到了:

第 252 页,K&R The C Programming Language 第 2 版

void free ( void *p )

free 释放 p 指向的空间;如果 p 为空,它什么也不做。 p 必须是指向先前由 calloc、malloc 或 realloc 分配的空间的指针。

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 2014-06-02
    • 2011-08-18
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多