我有一个使用双向链表的程序,并简化了它们。
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;
}
}
答案 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分配的空间的指针。