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
还是全部删除。谢谢您的建议,刚刚解决了它。我删除第一个节点的解决方案是在它前面插入一个正节点,这样第一个模拟节点就变成了上一个。