我试图列出链接列表,但得到了一个奇怪的结果。即使我向列表中添加元素,它看起来也是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 = ...;
并生成错误消息。