从双向链表段错误中删除两项

Deleting two items from doubly-linked list segfault

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

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

几年前,我在我的 K&R ansi c 书中记下了一个笔记。 关于 free(temp1);

的使用,你不能这样做

你没有 post 完整的代码,但是你对 temp1 = leftP 然后 free(temp1) 的使用几乎正是我几年前记下的,说不能那样做。

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

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

找到了:

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

void free ( void *p )

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