将一个txt文件读入单链表。并打印列表
Reading a txt file into a single linked list. And printing the list
您好,我正在做一个大学项目,在该项目中,我必须使用 txt 文件中有关员工的数据填充链接列表。当我读入文件时,它部分填充了链表。当我打印节点时,它只打印第一组员工数据。 txt 文件上有 18 个员工详细信息。所以应该打印 18 个节点。我不知道为什么它不会,非常感谢任何帮助。 (我已经在头文件中全局声明了我的 listHead 指针。)
请参阅下面的代码
struct contact{
int employeeId;
char firstName[15];
char lastName[15];
char employeeAddress[40];
char email[25];
char department[25];
float annualSalary;
struct date
{
int day;
int month;
int year;
}doj;
struct contact *next;
};
//linked list
struct contact *listHead;
// initializes the list with a head
void initLinkList(){
// set head
listHead = (struct contact *)malloc(sizeof(struct contact));
listHead->next = NULL;
} // initLinkList
void main()
{
initLinkList();
struct contact *temp;
temp = (struct contact*)malloc(sizeof(struct contact));
temp = listHead;
FILE *cfPtr;
if ((cfPtr = fopen(FILENAME, READMODE)) == NULL){
puts("File could not be opened");
}
else{
fscanf(cfPtr, "%d %s %s %s %s %s %f %d %d %d",
&temp->employeeId,
&temp->firstName,
&temp->lastName,
&temp->employeeAddress,
&temp->email,
&temp->department,
&temp->annualSalary,
&temp->doj.day,
&temp->doj.month,
&temp->doj.year);
while (feof == 0)
{
fscanf(cfPtr, "%d %s %s %s %s %s %f %d %d %d",
&temp->employeeId,
&temp->firstName,
&temp->lastName,
&temp->employeeAddress,
&temp->email,
&temp->department,
&temp->annualSalary,
&temp->doj.day,
&temp->doj.month,
&temp->doj.year);
fflush(stdin);
temp->next = temp;
//listHead->next = temp;
printf("HELP");
}
fclose(cfPtr);
}
do{
menu();
switch (userChoice){
case 1:
add();
userChoice = NULL;
break;
case 2:
printNodes();
userChoice = NULL;
break;
case 3:
view();
userChoice = NULL;
break;
}
} while (userChoice != -1);
printf("\n\n\n");
system("pause");
}
void printNodes()
{
struct contact *temp;
temp = (struct contact*)malloc(sizeof(struct contact));
temp = listHead ;
while (temp != NULL)
{
printf("\n\nEmployee id: %d", temp->employeeId); // show the data
printf("\n\nEmployee First Name: %s", temp->firstName);
printf("\n\nEmployee Last Name: %s", temp->lastName);
printf("\n\nEmployee Adress: %s", temp->employeeAddress);
printf("\n\nEmployee Email: %s", temp->email);
printf("\n\nEmployee Department: %s", temp->department);
printf("\n\nEmployee Start Date");
printf("\n\n-------------------");
printf("\n\nDay: %d", temp->doj.day);
printf("\n\nMonth: %d", temp->doj.month);
printf("\n\nYear: %d", temp->doj.year);
temp = temp->next;
}
}
您需要解决多个问题。我会强调这些问题:
1) 在填充条目之前,您需要为每个列表项分配(malloc())。在您的情况下,您只是读取每个值并将其放入同一个条目中。您可以看到您的 while 循环中没有 malloc。
2) 一开始你为 temp 分配了 space 然后你扔掉了那段内存:
temp = (struct contact*)malloc(sizeof(struct contact));
temp = listHead;
第一行为联系人分配space,第二行将temp 重新分配给分配给head 的space。您现在刚刚分配的 space 没有指向它的指针,并且永远无法再次访问它。
3) fflush(stdin)
应该做什么。我认为应该删除它。
temp = (struct contact*)malloc(sizeof(struct contact));
temp = listHead;
内存泄漏,你覆盖了malloc
的结果
while (feof == 0) /* you mean while (feof(cfPtr) != 0) */
{
fscanf(cfPtr, "%d %s %s %s %s %s %f %d %d %d",
错了,见Why is “while ( !feof (file) )” always wrong?
使用
while (fscanf(cfPtr, "%d %s %s %s %s %s %f %d %d %d", ...) == 10) {...}
而且你需要为文件的每一行保留space一个新的contact
(使用malloc
)(这就是为什么它只打印第一组员工数据)
您好,我正在做一个大学项目,在该项目中,我必须使用 txt 文件中有关员工的数据填充链接列表。当我读入文件时,它部分填充了链表。当我打印节点时,它只打印第一组员工数据。 txt 文件上有 18 个员工详细信息。所以应该打印 18 个节点。我不知道为什么它不会,非常感谢任何帮助。 (我已经在头文件中全局声明了我的 listHead 指针。) 请参阅下面的代码
struct contact{
int employeeId;
char firstName[15];
char lastName[15];
char employeeAddress[40];
char email[25];
char department[25];
float annualSalary;
struct date
{
int day;
int month;
int year;
}doj;
struct contact *next;
};
//linked list
struct contact *listHead;
// initializes the list with a head
void initLinkList(){
// set head
listHead = (struct contact *)malloc(sizeof(struct contact));
listHead->next = NULL;
} // initLinkList
void main()
{
initLinkList();
struct contact *temp;
temp = (struct contact*)malloc(sizeof(struct contact));
temp = listHead;
FILE *cfPtr;
if ((cfPtr = fopen(FILENAME, READMODE)) == NULL){
puts("File could not be opened");
}
else{
fscanf(cfPtr, "%d %s %s %s %s %s %f %d %d %d",
&temp->employeeId,
&temp->firstName,
&temp->lastName,
&temp->employeeAddress,
&temp->email,
&temp->department,
&temp->annualSalary,
&temp->doj.day,
&temp->doj.month,
&temp->doj.year);
while (feof == 0)
{
fscanf(cfPtr, "%d %s %s %s %s %s %f %d %d %d",
&temp->employeeId,
&temp->firstName,
&temp->lastName,
&temp->employeeAddress,
&temp->email,
&temp->department,
&temp->annualSalary,
&temp->doj.day,
&temp->doj.month,
&temp->doj.year);
fflush(stdin);
temp->next = temp;
//listHead->next = temp;
printf("HELP");
}
fclose(cfPtr);
}
do{
menu();
switch (userChoice){
case 1:
add();
userChoice = NULL;
break;
case 2:
printNodes();
userChoice = NULL;
break;
case 3:
view();
userChoice = NULL;
break;
}
} while (userChoice != -1);
printf("\n\n\n");
system("pause");
}
void printNodes()
{
struct contact *temp;
temp = (struct contact*)malloc(sizeof(struct contact));
temp = listHead ;
while (temp != NULL)
{
printf("\n\nEmployee id: %d", temp->employeeId); // show the data
printf("\n\nEmployee First Name: %s", temp->firstName);
printf("\n\nEmployee Last Name: %s", temp->lastName);
printf("\n\nEmployee Adress: %s", temp->employeeAddress);
printf("\n\nEmployee Email: %s", temp->email);
printf("\n\nEmployee Department: %s", temp->department);
printf("\n\nEmployee Start Date");
printf("\n\n-------------------");
printf("\n\nDay: %d", temp->doj.day);
printf("\n\nMonth: %d", temp->doj.month);
printf("\n\nYear: %d", temp->doj.year);
temp = temp->next;
}
}
您需要解决多个问题。我会强调这些问题:
1) 在填充条目之前,您需要为每个列表项分配(malloc())。在您的情况下,您只是读取每个值并将其放入同一个条目中。您可以看到您的 while 循环中没有 malloc。
2) 一开始你为 temp 分配了 space 然后你扔掉了那段内存:
temp = (struct contact*)malloc(sizeof(struct contact));
temp = listHead;
第一行为联系人分配space,第二行将temp 重新分配给分配给head 的space。您现在刚刚分配的 space 没有指向它的指针,并且永远无法再次访问它。
3) fflush(stdin)
应该做什么。我认为应该删除它。
temp = (struct contact*)malloc(sizeof(struct contact));
temp = listHead;
内存泄漏,你覆盖了malloc
while (feof == 0) /* you mean while (feof(cfPtr) != 0) */
{
fscanf(cfPtr, "%d %s %s %s %s %s %f %d %d %d",
错了,见Why is “while ( !feof (file) )” always wrong?
使用
while (fscanf(cfPtr, "%d %s %s %s %s %s %f %d %d %d", ...) == 10) {...}
而且你需要为文件的每一行保留space一个新的contact
(使用malloc
)(这就是为什么它只打印第一组员工数据)