C语言 单链表分段故障(核心转储)



我在c中遇到了一个单链表的问题。我创建了一个函数,它接受索引和单链表类型的清单。该函数应该从列表中取出位于索引处的元素,并返回它的一个参数。下面是我的代码:

int sellItem(int number, InvNode **inventory)
{
struct invNode *current = *inventory;
struct invNode *previous = *inventory;
number += 1;
if (inventory == NULL)
{
return -1;
}
else if (number == 1)
{
*inventory = current->next;
return (current->value);
free(current);
current = NULL;
}
else
{
while (number != 1)
{
previous = current;
current = current->next;
number--;
}
previous->next = current->next;
return (current->value);
free(current);
current = NULL;
}
}

它可以正常工作一段时间,但随后崩溃并提出分割错误。此外,索引从0开始,但我已经增加了1。

假设一个正确终止的链表,您的代码有几个缺陷,包括内存泄漏和在求值之前没有正确地进行空检查。

实际上,你真正想做的是可能是如下所示。由于给定了一个指向节点的指针,因此可以使用它来遍历列表,首先从传入的内容开始,并一路上获取每个next成员的地址,直到到达想要修剪的节点。结果是:

int sellItem(int number, InvNode **inventory)
{
int res = -1;
if (inventory)
{
while (*inventory && number-- > 0)
inventory = &(*inventory)->next;
if (*inventory)
{
InvNode *tmp = *inventory;
*inventory = tmp->next;
res = tmp->value;
free(tmp);
}
}
return res;
}

这假设inventory保存了链表的头指针的地址,从任何地方传递过来。它还假设number是零基的。例如,如果您希望列表中的第一个元素不链接,保留值,并最终释放,那么对于number,您将从调用者传递0。列表中的第二个节点是1,以此类推。就是这样。

最新更新