首页 > 解决方案 > 从双向链表段错误中删除两个项目

问题描述

我有一个使用双向链表的程序并简化了它们。

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

标签: cdoubly-linked-list

解决方案


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

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

从来没有想过原因,它是基于使用malloc()orcalloc()然后当使用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 分配的空间的指针。


推荐阅读