如何将链表向文件 fwrite()写入或 fread()读出? 请各位牛人异士。多多指教。。。
fwrite(pstu,sizeof(struct student),1,fp);//向 fp 所指向的文件 stud 写入数据(输出)。
fread(pstu,sizeof(struct student),1,fp);//把 fp 所指向的文件 stud 里的数据读入计算机内 pstu 所指向的内存地址上。
上面两句是程序里的写入文件和读出文件语句。我想问的是。。我写得 pstu 指针指向的是动态链表。我这样向文件写入数据和读出数据是否有错。因为书上是静态的,是用 for() 语句将结构体类型数组循环写入或读出的。是否动态链表的每个结点也要这样循环写入或读出?虽然程序输出结果没错,但总感觉有点怪怪的。因为这文件的写入和读出,文件里到底写入没有也不知道,读出的到底是文件里的数据还是本来就是内存上的数据也不知道。。
还有就是怎么对动态链表进行冒泡排序,请各位能人,高手指点一下。。
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<stdlib.h>
#define NULL 0
#define LEN sizeof(struct student)
int n = 0;
struct student //定义结构体
{
int num;
char name[20];
float score[3];
float aver;
struct student *next;
};
struct student *create(void)//动态建造一个学生信息链表
{
struct student *head,*p1,*p2;
printf("请输入学生数据,当各项数据为零时,输入结束.\n");
printf("请输入第 %d 个学生的数据:\n",n+1);
p1 = (struct student *)malloc(LEN);
scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
while(p1->num != 0)
{
n = n+1;
if(n == 1)head = p1;
else p2->next = p1;
p2 = p1;
printf("请输入第 %d 个学生的数据:\n",n+1);
p1 = (struct student *)malloc(LEN);
scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
}
p2->next = NULL;
return(head);
}
void average(struct student *ahead)//结构体中的 aver 成员是这函数求出并赋值,即平均分。
{
struct student *p;
p = ahead;
if(ahead == NULL)printf("数据为空\n");
do
{
p->aver = (p->score[0]+p->score[1]+p->score[2])/3;
p = p->next;
}while(p != NULL);
}
struct student *sort(struct student *s)//按平均分从小到大,对动态链表进行排序
{
}
void print(struct student *phead)//输出函数
{
struct student *p;
p = phead;
if(phead == NULL)printf("数据为空\n");
do
{
printf("学号 %d,姓名 %s,课目1分数 %5.2f,课目2分数 %5.2f,课目3分数 %5.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
printf("%d 号同学的平均分是:%5.2f\n",p->num,p->aver);
p = p->next;
}while(p != NULL);
}
int main(void)
{
FILE *fp;//定义一个文件类型指针
struct student *pstu;//定义一个结构体类型指针
pstu = create();//创建动态学生链表。
printf("\n");
average(pstu);//求平均分函数
if((fp = fopen("stud","w")) == NULL)//以只写方式打开文件 stud。
{
printf("cannot open file\n");
exit(0);
}
fwrite(pstu,sizeof(struct student),1,fp);//向 fp 所指向的文件 stud 写入数据(输出)。
fclose(fp);//关闭文件
fp = fopen("stud","r");//打开文件 stud .
fread(pstu,sizeof(struct student),1,fp);//把 fp 所指向的文件 stud 里的数据读入计算机内 pstu 所指向的内存地址上。
print(pstu);//打印函数
fclose(fp);//关闭文件
sort(pstu);
free(pstu);//释放动态空间。即pstu所指向的动态内存空间。
getch();
return 0;
}
/*
程序运行结果:
---------------------------------------------------------------------
请输入学生数据,当各项数据为零时,输入结束.
请输入第 1 个学生的数据:
101 yang1 88 69 79
请输入第 2 个学生的数据:
102 yang2 96 59 86
请输入第 3 个学生的数据:
103 yang3 90 90 93
请输入第 4 个学生的数据:
104 yang4 89 86 93
请输入第 5 个学生的数据:
105 yang5 91 93 96
请输入第 6 个学生的数据:
0 0 0 0 0
学号 101,姓名 yang1,课目1分数 88.00,课目2分数 69.00,课目3分数 79.00
101 号同学的平均分是:78.67
学号 102,姓名 yang2,课目1分数 96.00,课目2分数 59.00,课目3分数 86.00
102 号同学的平均分是:80.33
学号 103,姓名 yang3,课目1分数 90.00,课目2分数 90.00,课目3分数 93.00
103 号同学的平均分是:91.00
学号 104,姓名 yang4,课目1分数 89.00,课目2分数 86.00,课目3分数 93.00
104 号同学的平均分是:89.33
学号 105,姓名 yang5,课目1分数 91.00,课目2分数 93.00,课目3分数 96.00
105 号同学的平均分是:93.33
---------------------------------------------------------------------
*/