2013-11-03 63 views
-5

我想在C中实现链接列表,其中我在列表的末尾插入节点,在插入值之后,除最后一个值之外的所有值都正在打印。下面是代码: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. Enter\n2. Show List\n3. Exit\n\n"); 
scanf("%d", &choice); 
switch(choice){ 
    case 1: 
     printf("Enter item\n"); 
     scanf("%d", &i); 
     ints = add(ints,i); 
     break; 
    case 2: 
     temp = ints; 
     while(temp->next != NULL) 
     { 
      printf("%d\n",temp->val); 
      temp=temp->next; 
     } 
     break; 
    case 3: 
    default: 
     exit(0); 

    } 
} 

return 0; 
} 
+4

时间来学习如何使用**的**调试器。 –

回答

0

此行

while(temp->next != NULL) 

明确地说:“当你的元素点止到列表结束“(即当你到达最后一个元素但在你使用它之前停止)。

而是使用

while(temp != NULL) 

它说“当你在列表中没有再停止”。

+0

不要帮助吸血鬼,男人。 – Puppy

+0

Ouch:D 嗯,我意识到这个问题有多混乱,那时我开始学习使用调试器(gdb),并且与gdb一起学习数据结构虽然有点麻烦,但是在一天结束时它的全部值得学习调试器。我现在可以合并排序链接列表,并自己修复错误(大部分),而不是在这里以stackoverflow问:) :) – UditMukherjee

+0

作为一个更真实的援助请求比大量的“这是我的作业,为我做“这个周末充满了问题。 gdb是一个学习的熊,但可以成为一个梦幻般的工具。如果您运行的是现代GDB,则可以使用基于文本的ui的命令行选项:例如'gdb -tui'。如果你正在调试'foo.exe''gdb -tui foo.exe'。祝你好运:) – kfsone

0

在你的情况2中,在你的主函数中,只要没有下一个元素,就立即离开while循环。 但是,因为这是你的最后一个元素,它不会显示。 在循环后添加另一个打印,以打印循环不包含的最后一个元素。

while(temp->next != NULL) 
    { 
     printf("%d\n",temp->val); 
     temp=temp->next; 
    } 
    break; 

成为

while(temp->next != NULL) 
    { 
     printf("%d\n",temp->val); 
     temp=temp->next; 
    } 
    printf("%d\n",temp->val); 
    break; 

或更好:

while(temp!= NULL) 
    { 
     printf("%d\n",temp->val); 
     temp=temp->next; 
    } 
    break;