链表+文件 一个初学者实现学生管理系统的心得

其实,用链表与文件写学生管理系统内容可分为两大模块:

模块一:一个完整的创建、遍历、添加、删除、修改的链表;

模块二:读取/写入数据到文件。

模块一

  一个链表,主要是malloc的正确使用。

定义一个带有结构指针的结构体,用malloc()动态开辟一个该结构体大小的内存用来作为节点,储存多个平行数据并且每动态开辟一个内存就要用这个内存里面的结构指针指向下一个开辟的内存(如果停止动态开辟内存,则需让这个指针指向NULL,作为Programmer都知道指针的潜在危险)。这个节点数量需用循环控制。malloc原型是 void* 类型,但在这里需要强制转换成结构类型使用。而且动态开辟内存不是每次都会成功,不成时mallco()会返回NULL,所以我们需要规范使用malloc()

 1 typedef struct stu //定义结构体变量
 2 {
 3         ...     //其他变量
 4     struct stu* pnext;      //结构体的内部指针
 5 }STU;
 6 STU* pNew
 7 if(NULL == (pNew = (STU*)malloc(sizeof(STU))))
 8 /*请使用if来判断,这是有必要的*/
 9 {
10     perror("error..."); 11 exit(1); 12 } 13 pNew->pnext = NULL; 14 .../*其它代码*/ 15 free(pNew); 16 pNew = NULL;/*请加上这句*/

另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。

关于添加、删除、修改需要对指针的灵活运用。

如果在头部添加/删除,则要注意head的移动;

  在中间添加/删除,则注意利用循环定位准确;

  在尾部添加/删除,则要注意新/末尾结构体里的pnext(结构指针)指向NULL。

模块二

主要在于如何把链表写进指定文件里和如何把文件里的内容如何读取到链表里。

可直接单独写一个模块函数用fprintf格式化向文件里写入

 1 void PrintToTxt()
 2 {
 3         STU* pTemp = pStu->pnext;    //pStu为头指针pTemp为移动指针
 4 
 5     if ((fp = fopen("学生信息管理.txt", "w")) == NULL)    //打开文件准备写入
 6     {
 7         printf("cannot open this file!\n");
 8         _getch();
 9         return; 10  } 11 12 while (pTemp != NULL) //开始写入,pTemp为NULL时停止写入 13  { 14 fprintf(文件指针, "输出格式", 附加参数列表); 15 pTemp = pTemp->pnext; 16  } 17  fclose(fp); 18 printf("out save!"); //写入成功 19 exit(0); 20 }

但是若要从文件中读取并且形成链表的形式,则需要先建立链表再从文件中读取数据

 1 void ScanfTxt()
 2 {
 3     pStu = (STU*)malloc(sizeof(STU)); //动态开辟内存,创建链表
 4     pStu->pnext = NULL;
 5 
 6     STU* pTemp = pStu;
 7     STU* pNew = NULL;
 8 
 9     if ((fp = fopen("学生信息.txt", "r")) == NULL) 10  { 11 printf("cannot open this file\n!"); 12  _getch(); 13 exit(0); 14  } 15 16 while (1) //读取数据,直到数据为空是跳出 17  { 18 pNew = (STU*)malloc(sizeof(STU)); 19 pNew->pnext = NULL; 20 if (fscanf(文件指针, "格式字串符", 21 输入列表)==EOF) 22  { 23 free(pNew); //释放多余开辟的内存 24 break; 25  } 26 27 pTemp->pnext = pNew; 28 pTemp = pTemp->pnext; 29  } 30  fclose(fp); 31 32 } 33 

这里并没有用到fread和fwrite

 

 

fread、fwrite是对二进制文件进行以二进制形式读写,以字节位计算长度,按照指定的长度和次数读取数据,遇到结尾或完成指定长度读取后停止。对于向文件里写入数据时所有字符都可以无效果的写入,比如遇见换行符则直接写入换行符并不会执行换行。

而fscanf、fprintf是从磁盘文件中读取数据,可以是二进制,也可以是其他形式,并且进行格式化读写。比如遇见换行符则会执行换行读写并不会读出或写入换行符。

这里用fscanf、fprintf主要利用可进行换行、格式化读写。

 

转载于:https://www.cnblogs.com/blackwhale/p/6250901.html

学生包含以下信息项:学号、姓名、学院、班级、高数成绩、英语成绩、C语言成绩、总分、平均分。 系统的主要功能包括: 1. 创建学生成绩信息文件,根据提示输入学生的各项信息,计算出总分和平均分,然后按学号对学生信息进行排序,并将排序后的学生成绩信息存储到一个二进制文件中。 2. 增加学生信息,在原有学生信息文件的基础上增加新的学生成绩信息,要求:增加后的学生信息仍按学号排序,并继续保存至原文件。 3. 删除学生信息,提示用户输入要进行删除操作的学号,如果在文件中有该信息存在,则将该学号所对应的学生信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。 4. 修改学生信息,提示用户输入要进行修改操作的学号,如果在文件中有该息存在,则将提示用户输入该学号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作。 5. 按不同条件对学生信息进行查询操作,输出满足条件的学生信息。 (1) 按学号查询,输入一个学号,输出对应的学生信息。 (2) 按姓名查询,包括精确查询(输入全名),模糊查询(输入姓)。 (3) 按学院查询,输入学院名称,输出该学院的全部学生的信息。 (4) 按班级查询,输入班级名称,输出该班级的全部学生的信息。 6. 按不同条件对学生成绩进行统计工作。 (1) 按总分对学生信息进行排序(由高到低),输出排序后的信息,并将排序后的学生信息存放到一个新的二进制文件中。 (2) 按平均分统计各个分数段的学生人数(不及格,60-69,70-79,80-89,90-100)。 (3) 分别找出3门课程成绩最高的学生,并输出他们的信息。 (4) 分别统计出3门课程的不及格率,并输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值