gpt4 book ai didi

c - 从 C 中的链接列表中删除时出现重复段错误

转载 作者:行者123 更新时间:2023-11-30 20:29:10 24 4
gpt4 key购买 nike

对于作业,我们被告知创建一个基于 C 中链表结构的字典抽象数据类型 (ADT)。

根据我使用所需功能的所有测试

尺寸插入(使用尾节点在尾部完成)删除清空

我已经编写了所有这些客户端测试,并且没有遇到任何问题。

但是当使用提供的评分脚本时,我遇到了段错误。

该脚本将一千个条目添加到“字典”

执行一些不相关的步骤

删除从901到1000的条目,意思是从链表的中间删除

我没有遇到任何问题,但下一部分会导致段错误

当脚本尝试从 900 往下删除时,在 772 处我总是遇到段错误

我尝试通过向“字典”添加 10 个条目来使用较小的样本重新创建

删除 9 和 10

然后尝试从 8 往下删除,但没有遇到同样的问题?

这是我的删除功能,任何帮助将不胜感激

void delete(Dictionary D, char* key){
Node N;
//Nodes are pointers to NodeObj's which are structs that have a key,a value, and a Node which points to //the next in the list
Node P = NULL;

N = find(D, key);//returns the desired Node


if(N == D->head){//D-> head is a field in a Dictionary struct which is a Node that has no value and //points to the first NodeObj in the list

D->head = N->next;
if(N == D->tail)D->tail = NULL;//D->tail is the same thing as head, but pointing to the last //NodeObj

}else if(N == D->tail){

D->tail = findPreviousNode(D, N->key);

}else{

P = findPreviousNode(D, N->key);
P->next = N->next;

}

N->next = NULL;
freeNode(&N);
N = NULL;
D->numItems--;



}

我省略了一些前提条件检查,确保没有任何条件被触发而导致问题

编辑:

我想我可能遗漏了一些重要信息。

在我的程序中,Dictionary 是指向 DictionaryObj 的指针的 typedef。其中包含头节点、尾节点及其大小字段。

Node 是指向 NodeObj 的指针,它具有键、值和 Node 字段,以便指向链表中的下一个 NodeObj。

因此,delete() 会传递一个指向 DictionaryObj 的指针,该 DictionaryObj 的头字段为指向第一个 NodeObj,从它们中您可以跟踪每个 NodeObj 的下一个字段。

我认为我已经涵盖了删除 DictionaryObj 的 head 字段指向的节点时的情况,方法是重新分配 head 字段以指向列表中的下一个节点,该节点是通过跟踪该 NodeObj 中的 Node 指针获得的。

最佳答案

我遇到的问题是,当我从链接列表的末尾删除时,我正确地将字典的尾节点指向要删除的前一个节点。但我并没有确保将前一个节点的“下一个”值指向 NULL,因为它后面不会有任何内容。

应该是

}else if(N == D->tail){

P = findPreviousNode(D, N->key);
D->tail = P
P->next = NULL;

}else{

关于c - 从 C 中的链接列表中删除时出现重复段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58867975/

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