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

时间:2011-11-21 07:53:00

标签: c linked-list

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

代码如下:

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时,由于循环,它当前位于列表的最后一个元素。

2 个答案:

答案 0 :(得分:2)

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

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

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

显然有一个特殊情况:当头部是你要移除的物品时(那时你没有前一个物品) - 我会留给你弄清楚:)

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

答案 1 :(得分:0)

您的函数将始终返回NULL。只需从函数返回“list”而不是“thislist”。