【发布时间】:2021-02-17 14:13:14
【问题描述】:
我对 C 编程还是很陌生,但遇到了一些麻烦。 我编写了一些代码来读取一个包含人们姓名、年龄、体重和身高信息的文件。文件中的每一行都代表一个新人。然后将此信息存储在结构中,然后将此结构添加到链表中。本质上,我正在尝试将此链表用作队列,每个节点都是一个结构。
这就是我正在阅读的文件的样子:(格式为年龄、体重、身高、姓名)。
20,60,170,Joe
23,70,175,Mike
我的问题是,由于某种原因,链表中的每个节点都是完全相同的,即文件文本的最后一行。因此,例如,每次我创建一个结构并将其添加到链表时,每个节点都会有名称“Mike”、年龄“23”等等。我已经玩过代码,我注意到文件读取没有问题,并且分配给结构成员的值是正确的(我打印出要检查的值)。但是,当我查看链接列表的顶部,然后出列(删除顶部),然后再次查看顶部时,值总是相同的。所以我不确定我的问题出在哪里。
注意:我写了一个通用的链表代码,链表本身没有问题,因为我已经对它进行了广泛的测试。
这是我的代码:
#include <stdio.h>
#include "macros.h"
#include <string.h>
typedef struct
{
int AGE;
int WEIGHT;
int HEIGHT;
char NAME[51];
}Person;
int main()
{
void* vdPtr;
Person* topVal;
Person person;
LinkedList* list = createLinkedList();
char line[100];
int i=0;
int numPeople=0;
FILE* fp;
int age, weight, height;
char name[51];
fp = fopen("text.txt","r");
while(fgets(line,100,fp) != NULL)/*reading file to see how many lines, and how many people*/
{
numPeople++;
}
rewind(fp);
while (i<numPeople)/*storing file data in the appropriate member for Person struct*/
{
fscanf(fp,"%d,%d,%d,%s",&age,&weight,&height,name);
person.AGE = age;
person.WEIGHT = weight;
person.HEIGHT = height;
strcpy(person.NAME,name);
insertLast(list,&person);
/*printing to see whether the values added to struct members are correct*/
printf("%d %d %d %s\n",person.AGE,person.WEIGHT,person.HEIGHT,person.NAME);
i++;
}
/*testing*/
printf("\nCount %d",getLinkedListCount(list));/*seeing how many nodes in the linkedList*/
/*using void pointer to get the top value, then typecasting it to Person pointer*/
vdPtr = viewTop(list);
topVal = (Person*)(vdPtr);
/*viewing the top person*/
printf("\ntop is %s %d",topVal->NAME,topVal->AGE);
/*deqeue*/
removeTop(list);
printf("\nCount %d",getLinkedListCount(list));
vdPtr = viewTop(list);
topVal = (Person*)(vdPtr);
printf("\ntop is %s %d",topVal->NAME,topVal->AGE);
}
谁能告诉我哪里出了问题以及如何解决它?
【问题讨论】:
-
链表中的结构是自引用的。即其中一个成员(通常是最后一个)是指向结构本身的指针。其他成员可以被认为是有效负载或数据。
标签: c struct file-io linked-list