gpt4 book ai didi

c - 如何按升序创建链表

转载 作者:行者123 更新时间:2023-12-02 00:04:05 25 4
gpt4 key购买 nike

我得到一个名为“head”的稀疏数组,它是二维的,有一个索引和一个值。所以像:(3, 100) (6,200) (8,100)

  1. 我必须按升序将一个节点(值、索引)插入到这个稀疏数组中。因此,如果给我 (2,100),列表应该如下所示:(2, 100) (3,100) (6,200) (8,100)

同样,如果我得到 (4,200),它应该返回(3,100) (4,200) (6,200) (8,100)

条件 1:如果索引相同,则我必须添加值

所以如果我得到 (3,100),那么我应该返回(3,200) (6,200) (8,100)

条件 2:如果索引相同,且值为零,则应删除该值。所以如果数组是 (3,-100),我必须返回

(6,200) (8,100)

Node * List_insert_ascend(Node * head, int value, int index)
{
Node * node = List_create(value, index); //this creates an empty node, "node"

if (index < (head->index)) //node's index is less, e.g. (1,100)
{node -> next = head;} //this inserts "node" before "head"
if (index == (head->index))
{
node = head;
head->value = head->value + value; //Condition 1
while ((head->value)==0) //Condition 2
{
Node *p = head->next;
head = p;

}
}
return node;

}

我的理解是,当我创建 head->next 新的 head 时,应该去掉原来的条目。

但是 0 值索引继续保留在列表中。结果是(3,0) (6,200) (8,100)

如果有人可以帮助我弄清楚我做错了什么(甚至可能是为什么),我将不胜感激。

最佳答案

您的代码中有未定义的行为。

当你做的时候

Node *p = head->next;
head = p;
free(p);

您实际上是在释放 both headp 指向的节点。然后取消引用 head 会导致未定义的行为。

但这不是唯一的问题。另一个是您实际上并没有取消链接您正在释放的节点。先前的 head->next(在重新分配 head 及其后续释放之前)指针仍然指向现在空闲的节点。

关于c - 如何按升序创建链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19525562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com