gpt4 book ai didi

C 链表 - 返回第一个堆栈项

转载 作者:行者123 更新时间:2023-11-30 14:27:03 24 4
gpt4 key购买 nike

我正在尝试编写一个函数,从链接列表中删除某个值并返回整个列表。但是,我目前的问题是返回指向第一项的列表,而不是循环列表后的最后一项。

代码如下:

static LISTITEM *removeItem(LISTITEM *list, int n) {
LISTITEM *thislist = list;
while (thislist != NULL) {
if (thislist->value == n) {
LISTITEM *old;
old = thislist;
thislist = thislist->next;
free(old);
}
thislist = thislist->next;
}
return thislist;
}

代码执行没有错误,但是当我尝试打印堆栈列表时,调用此函数后它不会打印任何内容(意味着原始列表打印正常)。

我猜问题是因为当返回 thislist 时,由于循环,它当前位于列表中的最后一个元素。

最佳答案

您需要返回list而不是thislist。如果将 list 重命名为 head 并将 thislist 重命名为 current,情况会变得更清晰。

另外:您并未从列表中删除您的项目。您所做的就是释放一些内存并保留指向它的指针。因此,下次您迭代列表时,它可能会崩溃。

要修复此问题,您需要为前一个元素保留一个 previous 指针。找到元素后,您需要previous->next = current->next。只有这样,没有任何东西会指向当前元素,并且您可以安全地释放它(除非您也将指针存储在其他地方)。

显然有一种特殊情况:当头部是您想要删除的项目时(那么您没有以前的项目) - 我将把它留给您来解决:)

作为旁注:一旦修复了代码,您将从列表中删除所有出现的 n - 这可能是也可能不是您想要的(考虑保留 while 循环)当你找到你的元素时)

关于C 链表 - 返回第一个堆栈项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8208743/

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