c语言把单向链表写入txt,如何将链表向文件 fwrite()写入或 fread()读出? 请各位牛人异士。多多指教。。。...

已结贴√

问题点数:20 回复次数:12

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

如何将链表向文件 fwrite()写入或 fread()读出? 请各位牛人异士。多多指教。。。

fwrite(pstu,sizeof(struct student),1,fp);//向 fp 所指向的文件 stud 写入数据(输出)。

fread(pstu,sizeof(struct student),1,fp);//把 fp 所指向的文件 stud 里的数据读入计算机内 pstu 所指向的内存地址上。

上面两句是程序里的写入文件和读出文件语句。我想问的是。。我写得 pstu 指针指向的是动态链表。我这样向文件写入数据和读出数据是否有错。因为书上是静态的,是用 for() 语句将结构体类型数组循环写入或读出的。是否动态链表的每个结点也要这样循环写入或读出?虽然程序输出结果没错,但总感觉有点怪怪的。因为这文件的写入和读出,文件里到底写入没有也不知道,读出的到底是文件里的数据还是本来就是内存上的数据也不知道。。

还有就是怎么对动态链表进行冒泡排序,请各位能人,高手指点一下。。

#include

#include

#include

#include

#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

---------------------------------------------------------------------

*/

搜索更多相关主题的帖子:

计算机 结构体 如何 动态

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值