在 C 语言中使用链表的队列仅将最后一个节点作为整个无限队列

Queues Using Linked List in C only take last node as a whole infinite queue

提问人:Mohammad Harouak 提问时间:11/30/2021 最后编辑:JabberwockyMohammad Harouak 更新时间:11/30/2021 访问量:39

问:

我正在做一个数据结构项目。我被要求从一个名为“ToServe.txt”的文件中获取信息。文件中的数据采用以下形式:

TicketNumberSpaceStudentIDSpaceStudentName
TicketNumberSpaceStudentIDSpaceStudentName

但是,实现以下两个函数,我只在我的队列中无限次获得最后一个学生

int Start(advisee** front, advisee** rear) {
  advisee* student, *walker;
  FILE* infp;
  student = (advisee*)malloc(sizeof(advisee));
  infp = fopen("ToServe.txt", "r");
  if(infp == NULL) {
    return 0;
  }
  while(!feof(infp)) {
    fscanf(infp, "%d", &student->ticket);
    fscanf(infp, "%d", &student->ID);
    fgets(student->name, 100, infp);
    student->next = NULL;
    enqueue(front, rear, student);
  }
  walker = *front;
  fclose(infp);
  return 1;
}
void enqueue(advisee** front, advisee** rear, advisee* ToAdd) {
    if (*front == NULL)
      *front = ToAdd;
    else
      (*rear)->next = ToAdd;
    *rear = ToAdd;
}
C 数据结构 链表队列 FEOF

评论

1赞 wildplasser 11/30/2021
while(!feof(infp)) {<<——谁教你的?stackoverflow.com/q/5431941/905902
1赞 wildplasser 11/30/2021
这回答了你的问题吗?为什么“while ( !feof (file) )”总是错的?
0赞 Mohammad Harouak 11/30/2021
@wildplasser while 条件是正确的,或者至少不是这里的问题。我尝试直接打印信息而不是创建队列,它奏效了。
3赞 trincot 11/30/2021
至于这个问题:你只为一个顾问分配空间,那么你为什么期望不止一个呢?他们都是一样的。这没有什么不同。您只需不断修改同一节点的属性即可。

答:

1赞 trincot 11/30/2021 #1

只分配了一个项目:

advisee* student = (advisee*)malloc(sizeof(advisee));

...循环只是不断改变单个 Advisee,并重复将相同的指针添加到队列中。因此,队列最终会得到指向单个建议的指针。

解决方案是在循环内移动分配。