链表循环迭代改变全局变量头
Linked List Loop Iterations alter global variable head
当我尝试使用 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
您需要在 temp=temp->next
之前设置 分配 temp->name
和 temp->id
而不是之后否则您将覆盖前一个节点的数据。
当我尝试使用 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
您需要在 temp=temp->next
之前设置 分配 temp->name
和 temp->id
而不是之后否则您将覆盖前一个节点的数据。