c - 从双向链表段错误中删除两个项目
问题描述
我有一个使用双向链表的程序并简化了它们。
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);
您没有发布完整的代码,但是您对temp1 = leftP
and 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 分配的空间的指针。
推荐阅读
- android - 如何禁用 GridView 被 PopupWindow 滚动
- php - Facade\Ignition\Exceptions\ViewException?
- javascript - 如何获取cherrypy函数的结果?
- apify - 如果运行成功,则下载最新结果
- java - ArrayList 错误:大小相同,在 remove() 之后包含“空”元素
- android - 处理 viewModel 上的内部 Transformations.switchMap
- java - Google TINK - 流式传输 AEAD 始终返回 1 KB 的输出文件
- c++ - 在对齐的内存缓冲区中为 capnp FlatArrayMessageReader 接收 zmq 消息
- flutter - 使用 Future Builder 检查 firestore 是否有文档
- javascript - 如何使用与 react 集成的 django rest 框架运行脚本