【发布时间】:2015-04-08 15:07:53
【问题描述】:
当我尝试使用 while 循环建立我的链表时,循环的第二次迭代会更改全局头部。这些值从文件中读入字符串(缓冲区),然后标记化以建立 .name 和 .id 的值。底部代码用于建立全局头部。
struct node{
char name[50];
int id;
struct node* next;
}*head;
使用打印语句,我设计了 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
【问题讨论】:
-
在此行之前:'temp = head;'需要设置next字段为null:head->next = NULL;
-
1) feof() 直到实际尝试读取文件末尾之后才设置。因此,它不应该在循环的顶部用作循环退出控件。 2) 代码假设输入文件中“至少”有一个完整的记录。这可能/将导致代码失败。 3) 对 malloc() 的任何调用都需要始终检查返回值以确保操作成功(!= NULL)
-
1) 最好使用 fgets() 作为 while 循环的控制 2) 将 head 作为特殊情况(检查 head=NULL)用于分配/设置链表中的第一个条目.
-
在while循环中,这一行:'temp = temp->next;'应该在基于“temp”的偏移量填充任何字段之前,而不是在设置/覆盖这些字段中的当前值之后。强烈建议在设置其他字段时始终将下一个字段设置为 NULL
标签: c loops pointers linked-list text-files