C中的链表仅显示最后2个元素



我试图列出链接列表,但得到了一个奇怪的结果。即使我向列表中添加元素,它看起来也是NULL。函数insertFin将元素添加到列表的末尾。afchListe列出了列表的内容。我所做的是创建一个名为Node的列表,然后使用typdef Node list;给它一个别名列表。奇怪的是,我的列表总是列出最后两个元素。

#include<stdlib.h>
#include<string.h>
struct Node
{
int x;
Node *next;
};
typedef Node list;

void insertFin(list** first, int x)
{
list* nouvElem = (list*)malloc(sizeof(list));
nouvElem->x = x;
nouvElem->next = NULL;

if(*first == NULL)
{
*first = nouvElem;
}

else
{
while((*first)->next != NULL)
{
*first = (*first)->next;
}
(*first)->next = nouvElem;
}
}

void affichListe(list* first)
{
while(first != NULL)
{
printf("x = %in",first->x);
first = first->next;
}

}
int main()
{
int n;
list* l = NULL;
insertFin(&l,1);
insertFin(&l,2);
insertFin(&l,6);
insertFin(&l,7);
insertFin(&l,8);
affichListe(l);
}```

在这个循环中:

while((*first)->next != NULL)
{
*first = (*first)->next;
}

您为*first分配了新的值,从而有效地忘记了除最后一个元素之外的所有元素。

然后将一个新元素附加到最后一个元素上,因此在每次附加操作之后,l变量所指向的列表只包含最后两个元素。

修复:

list* last = *first;
while(last->next != NULL)
{
last = last->next;
}
last->next = nouvElem;

如果使用适当的const限定符声明函数,则可以避免此错误。由于您不希望insertFin函数修改l变量,因此应该告诉编译器first参数指向的变量是const(指向list的不可修改指针(:

void insertFin(list* const * first, int x)
{
....
}

然后编译器将拒绝分配:

*first = ...;

并生成错误消息。

相关内容

  • 没有找到相关文章

最新更新