2015-02-08 73 views
0

当我尝试使用while循环建立链接列表时,循环的第二次迭代更改全局头。这些值从文件中读入到字符串(缓冲区)中,然后进行标记以建立.name和.id的值。底部代码用于建立全局头部。链接列表循环迭代更改全局变量头

struct node{ char name[50]; int id; struct node* next; }*head;

使用print语句,我已经设计了head.name和head.id在循环的第二次迭代被改变。如果有人有任何建议,请提供,因为他们非常感激。

int read(){ 
char buffer[500]; 
char name[50]; 
int id; 
struct node *temp; 
head = NULL; 
FILE *fp = fopen("AssignmentOneInput.txt", "r"); 
if(fp == NULL){ 
    printf("Cant read.\n"); 
    return 0; 
} 
fgets(buffer, 500, fp); 
head = malloc(sizeof(struct node)); 
strcpy(head->name, strtok(buffer, ",")); 
head->id = atoi(strtok(NULL, ",")); 
temp = head; 
printf("%s\n", head->name); 
printf("%d\n", head->id); 
while(!feof(fp)){ 
    fgets(buffer, 500, fp); 
    printf("%s\n", head->name); 
    printf("%d\n", head->id); 
    temp->next = malloc(sizeof(struct node)); 
    strcpy(temp->name, strtok(buffer, ",")); 
    temp->id = atoi(strtok(NULL, ",")); 
    temp = temp->next; 
    if(temp == NULL){ 
     fclose(fp); 
     return 1; 
    } 
}} 

文件AssignmentOneInput.txt包含存储在以下格式的值虽然有大约20而不是给出1:

George Washington, 2345678 
+0

在此行之前:'temp = head;'需要将下一个字段设置为null:head-> next = NULL; – user3629249 2015-02-08 23:31:15

+1

1)feof()直到实际尝试读取文件结尾之后才设置。因此,它不应该在循环的顶部用作循环出口控制。 2)代码假设在输入文件中至少有一个完整的记录。这可能会导致代码失败。 3)对malloc()的任何调用需要总是检查返回的值以确保操作成功(!= NULL) – user3629249 2015-02-08 23:34:45

+0

1)最好使用fgets()作为while循环的控件2)使头成为特殊大小写(检查head = NULL)用于分配/设置链表中的第一个条目。 – user3629249 2015-02-08 23:36:49

回答

1

你需要分配temp->name之前设置temp=temp->nexttemp->id而不是之后,否则你会覆盖前一个节点的数据。

+0

谢谢!它总是过度的景象。 – 2015-02-08 23:05:54