gpt4 book ai didi

c - 从双向链表段错误中删除两个项目

转载 作者:行者123 更新时间:2023-11-30 16:27:10 25 4
gpt4 key购买 nike

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

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 = leftPfree(temp1) 几乎正是我几年前记下的内容,说不能这样做。

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

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

找到了:

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

void free (void *p)

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

关于c - 从双向链表段错误中删除两个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52821392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com