从双向链接列表段中删除两项

时间:2018-10-15 16:54:36

标签: c doubly-linked-list

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

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

1 个答案:

答案 0 :(得分:0)

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

,这是您不能这样做

您没有发布完整的代码,但是您使用temp1 = leftP然后使用free(temp1)几乎完全是我几年前说不能做到的。

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

建议您以其他方式重用临时指针;然后在使用malloc->next之后,无论您使用->previous的指针名称​​ 是多少,然后使用该指针并将其设置为要释放的节点...保持列表完整的值。

找到了:

K&R C编程语言第二版第252页

void free ( void *p )

free释放p指向的空间;如果p为null,则不执行任何操作。 p必须是先前由calloc,malloc或realloc分配的空间的指针。