【问题标题】:Linked List Loop Iterations alter global variable head链表循环迭代改变全局变量头
【发布时间】: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


【解决方案1】:

您需要设置temp=temp->next 之前分配temp->nametemp->id 而不是在这样做之后,否则您将覆盖前一个节点的数据。

【讨论】:

  • 谢谢!总是过目不忘。
猜你喜欢
  • 2014-11-09
  • 2022-01-23
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多