2013-11-20 140 views
0

我想弄清楚链表,我试图做一个链表,每个节点有两个项目,但我不能让它打印正确,我不是确定我做错了什么。学习链接列表C

这里是我的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 

struct node 
{ 
    int num; 
    char word[30]; 
    struct node *next; 
}; 

int main(void) 
{ 
    struct node *learn = NULL; 
    struct node *temp; 
    struct node *temp1, *p; 
    int q, i = 0; 
    char word1[30]; 

    while (i != 7) 
    { 
     printf("Enter a number: "); 
     scanf("%d", &q); 
     temp = (struct node *) malloc(sizeof(struct node)); 
     temp->num = q; 
     temp->next = NULL; 
     temp1 = p = learn; 
     while (temp1 != NULL) 
     { 
      p = temp1; 
      temp1 = temp1->next; 
     } 
     if (p != NULL) 
      p->next = temp; 
     else 
      learn = temp; 
     i++; 
    } 

    i = 0; 
    while (i != 7) 
    { 
     if (i == 0) 
     { 
      int c; 
      do 
      { 
       c = getchar(); 
      } while (c != '\n' && c != EOF); 
     } 
     printf("\nEnter a word: "); 
     fgets(word1, 30, stdin); 
     temp = (struct node*)malloc(sizeof(struct node)); 
     strcpy(temp->word, word1); 
     temp->next = NULL; 
     temp1 = p = learn; 
     while (temp1 != NULL) 
     { 
      p = temp1; 
      temp1 = temp1->next; 
     } 
     if (p != NULL) 
      p->next = temp; 
     else 
      learn = temp; 
     i++; 

    } 

    while (learn != NULL) 
    { 
     printf("%d\n", learn->num); 
     learn = learn->next; 
    } 
    while (learn != NULL) 
    { 
     printf("%s", learn->word); 
     learn = learn->next; 
    } 
} 

这是我输入:

Enter a number: 1 
Enter a number: 2 
Enter a number: 3 
Enter a number: 4 
Enter a number: 5 
Enter a number: 6 
Enter a number: 7 

输入一个单词:一个

输入一个单词:乙

输入一个单词:c

En之三一句话:d

输入一个单词:电子

输入一个单词:F

输入一个单词:摹

这里是我所得到的:

1 
2 
3 
4 
5 
6 
7 
0 
0 
0 
0 
0 
0 
0 

我知道我做错了什么,我只是不知道。

回答

0

您为列表元素分配两次内存。相反,你应该只分配一次,而在第二个循环中,你应该使用strcpy或simillar来添加字符串,或者你可以在同一个循环中同时读取数字和字符串。

2

底部的第一个while循环遍历整个列表。在第一个while循环结束时,“learn”为NULL,因此第二个循环从不打印任何东西。