- 下面给出的程序从输入文件中的信息中添加一个带有id,标记和名称的学生节点。
- 使用addToList()
创建这些学生的链接列表#include<stdio.h>
#define MAXLINE 10
struct student{
int id;
char *name;
int marks;
struct student *next;
struct student *tail;
};
void addToList(int id,char *name,int marks,struct student *head){
struct student *node=(struct student *)malloc(sizeof(struct student));
node->id=id;
node->name=name;
node->marks=marks;
node->next=NULL;
head->tail->next=node;
head->tail=node;
printf("%d %s %d\n",head->id,head->name,head->marks);
}
int main(){
FILE *fp=fopen("C:/Users/Johny/Desktop/test.txt","r");
int id,marks;
char f,name[MAXLINE];
struct student *head;
f=fscanf(fp,"%d %s %d",&id,name,&marks);
if(f!=EOF){
head=(struct student *)malloc(sizeof(struct student));
head->id=id;
head->marks=marks;
head->name=name;
head->next=NULL;
head->tail=head;
}
printf("%d %s %d\n",head->id,head->name,head->marks);
while((f=fscanf(fp,"%d %s %d",&id,name,&marks))!=EOF)
addToList(id,name,marks,head);
return 0;
输入文件:
1 "J" 36
2 "O" 40
3 "H" 23
4 "N" 39
5 "Y" 78
正确的输出
1 "J" 36
1 "J" 36
1 "J" 36
1 "J" 36
1 "J" 36
当前输出
1 "J" 36
1 "O" 36
1 "H" 36
1 "N" 36
1 "Y" 36
结构名称字段发生了什么?为什么只有这个改变?头指针指向链表的第一个节点。预期的输出必须是正确的输出。
答案 0 :(得分:0)
错误是您没有复制,而是将name
的地址分配给node->name
。因此,所有节点的名称字段都指向您在main中声明为name
的{{1}}的相同字符串。
因为在添加功能时,您正在打印指向char name[MAXLINE];
的{{1}},而head->name
中的值是最后从文件中读取的字符串。因此,name
只打印从文件读取的最后一个字符串,name
打印字符串head->name
,head->name
j
....
要纠正它,您应该明确地分配内存和o
,如下所示。
h