C链表-返回到第一个堆栈项
我试图编写一个函数,从链表中删除某个值并返回整个列表。然而,我目前的问题是返回指向第一项的列表,而不是在循环列表之后返回最后一项 代码如下所示:C链表-返回到第一个堆栈项,c,linked-list,C,Linked List,我试图编写一个函数,从链表中删除某个值并返回整个列表。然而,我目前的问题是返回指向第一项的列表,而不是在循环列表之后返回最后一项 代码如下所示: static LISTITEM *removeItem(LISTITEM *list, int n) { LISTITEM *thislist = list; while (thislist != NULL) { if (thislist->value == n) { LISTITEM *o
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
时,由于循环,它当前位于列表的最后一个元素。您的函数将始终返回NULL。只需从函数中返回“list”而不是“thislist”。您需要返回list
而不是thislist
。如果将list
重命名为head
并将thislist
重命名为current
,则会更加清晰
另外:您没有从列表中删除您的项目。你所要做的就是释放一些内存并保留指向它的指针。因此,下次您在列表上迭代时,它可能会崩溃
要修复它,您需要为上一个元素保留一个previous
指针。找到元素后,需要previous->next=current->next
。只有这样,才不会有任何东西指向当前元素,并且您可以安全地释放它(除非您也将指针存储在其他地方)
显然,有一种特殊情况:当头部是您想要移除的项目时(那么您没有以前的项目)-我将留给您来解决:)
附带说明:修复代码后,您将从列表中删除所有出现的
n
——这可能是您想要的,也可能不是您想要的(在找到元素时考虑离开while循环)您需要返回list
,而不是thislist
(除非删除第一项)此外,您还应该决定是否只删除第一次出现的n
还是全部删除。谢谢您的建议,刚刚解决了它。我删除第一个节点的解决方案是在它前面插入一个正节点,这样第一个模拟节点就变成了上一个。