我正在尝试在 C 中实现链表,我在列表末尾插入节点,插入值后,除了最后一个值之外的所有值都正在打印。这是代码:
list_t *add(list_t *l,int e)
{
list_t *head;
if(l == NULL)
{
l = malloc(sizeof(list_t));
l->val = e;
l->next = NULL;
return l;
}
head = l;
while(l->next != NULL)
l=l->next;
l->next = malloc(sizeof(list_t));
l=l->next;
l->val = e;
l->next = NULL;
return head;
}
这是主函数的实现:
int main()
{
list_t *ints=NULL;
list_t *temp;
int i, choice;
while(1){
printf("1. Entern2. Show Listn3. Exitnn");
scanf("%d", &choice);
switch(choice){
case 1:
printf("Enter itemn");
scanf("%d", &i);
ints = add(ints,i);
break;
case 2:
temp = ints;
while(temp->next != NULL)
{
printf("%dn",temp->val);
temp=temp->next;
}
break;
case 3:
default:
exit(0);
}
}
return 0;
}
此行
while(temp->next != NULL)
明确表示"当你到达指向列表末尾的元素时停止"(即当你到达最后一个元素时停止,但在你使用它之前)。
而是使用
while(temp != NULL)
上面写着"当您不再在列表中时停止"。
在你的情况 2 中,在你的主函数中,一旦没有下一个元素,你就退出了 while 循环。但由于这是您的最后一个元素,因此不会显示。在循环之后添加另一个打印,以打印循环不包含的最后一个元素。
while(temp->next != NULL)
{
printf("%dn",temp->val);
temp=temp->next;
}
break;
成为
while(temp->next != NULL)
{
printf("%dn",temp->val);
temp=temp->next;
}
printf("%dn",temp->val);
break;
或更好:
while(temp!= NULL)
{
printf("%dn",temp->val);
temp=temp->next;
}
break;