在 C 列表上添加尾节点

Adding tail node on a C list

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

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;

    }
}

}

这下彻底破了:

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

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

提示:不要在循环内设置next。虽然我没有测试过,但只需将集合移到循环外就可以了:

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

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