【问题标题】:Adding tail node on a C list在 C 列表上添加尾节点
【发布时间】:2018-04-05 19:15:45
【问题描述】:

这是我在列表末尾添加元素的函数,但我暂时找不到修复循环的方法,你能给我一些提示/规则以使这个函数工作吗?

void insCoda(t_lista *l, TipoElemLista elem){
t_lista ultimo;
t_lista temp;


temp=(node *)malloc(sizeof(node));
temp->contenuto=elem;
temp->next= NULL;

if(*l==NULL)
{
    *l=temp;
    printf("Dentro if");
}else{

    ultimo=*l;
    while(ultimo->next!=NULL)
    {
        ultimo=ultimo->next;
        ultimo->next=temp;

    }
}

}

【问题讨论】:

  • 假设 t_lista 是 node * 因为您没有提供这些定义。在将新元素附加到列表的末尾之前,您不会迭代到列表的末尾。你把它放在ultimo->next->next 循环的每次迭代,而不是只是循环到最后,然后把temp 放在最后。
  • 当然,调试器............

标签: c list tail


【解决方案1】:

这是彻底坏了:

ultimo=*l;
while(ultimo->next!=NULL)
{
    ultimo=ultimo->next;
    ultimo->next=temp;
}

在输入时,您将ultimo 设置为(可能)列表的头部。然后你将它前进到下一个节点(ultimo=ultimo->next),并立即将该节点的next 指针设置为新分配的节点(ultimo->next=temp)。除了 oops,您的下一个操作是测试您刚刚设置的内容是否为 NULL(它不是,除非 malloc 失败)。所以你处理你的新节点,并将它的next 设置为它自己。现在你处于无限循环中。如果你不进入循环(因为你的头是唯一的节点,所以循环条件立即失败),你根本就不会插入新节点(这很好,因为这会让你免于无限循环)。

提示:不要在循环内设置next。虽然我还没有测试,但只需将集合移出循环即可:

ultimo=*l;
while(ultimo->next!=NULL)
{
    ultimo=ultimo->next;
}
ultimo->next=temp;

所以现在你遍历到最后一个节点,然后让你的新节点成为最后一个节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多