我正在尝试编写一个从链表中删除某个值并返回整个列表的函数。但是,我目前的问题是返回指向第一个项目的列表,而不是循环遍历列表后的最后一个项目。
代码如下:
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
时,由于循环,它当前位于列表的最后一个元素。
答案 0 :(得分:2)
您需要返回list
而不是thislist
。如果您将list
重命名为head
并将thislist
重命名为current
,则会更加清晰。
另外:您没有从列表中删除您的项目。你所做的只是释放一些内存并保持指向它。因此,下次迭代列表时,它可能会崩溃。
要修复它,您需要为前一个元素保留一个previous
指针。找到元素后,您需要previous->next = current->next
。只有这样才能指向当前元素并且你可以安全地释放它(除非你将指针存储在其他地方)。
显然有一个特殊情况:当头部是你要移除的物品时(那时你没有前一个物品) - 我会留给你弄清楚:)
作为旁注:一旦修复了代码,您将从列表中删除n
的所有出现 - 这可能是您想要的,也可能不是(当您找到时考虑离开while循环)你的元素)
答案 1 :(得分:0)
您的函数将始终返回NULL。只需从函数返回“list”而不是“thislist”。