c语言文件读写_学生信息管理系统(C语言\单向链表\文件读写)

bab4a416312915f5a4b34ff6a8503dd1.png

最近在复习数据结构,早上刚复习完链表,就想到了学生信息管理系统这个经典的大作业,然后呢,花了一早上加一中午的功夫给重新实现了一遍,里面可能会有写的不好的地方,但也代表了我实现的一些想法,在这里我将分享出来。

我是在Ubuntu上用vim写的,当然了这些代码window下也可以运行。文章最后有完整代码。

一 实现功能

1、查看学生信息

2、添加学生信息。

3、删除学生信息

4、修改学生信息

5、保存学生信息到文件

6、刷新学生信息(从文件中恢复学生信息)

0、退出系统

二 表示学生的数据结构

struct 

三 实现菜单

void meum()
{printf("n   *****************************   n");printf("         学生信息管理系统          n");printf("   *****************************   n");printf("           系统菜单功能            n");printf("   *****************************   n");printf("          1.查看学生信息           n");printf("          2.添加学生信息           n");printf("          3.删除学生信息           n");printf("          4.修改学生信息           n");printf("          5.保存学生信息           n");printf("          6.刷新学生信息           n");printf("          0.退出系统               n");
}

四 实现增加学生的功能

void creat_node(LinkList *L)
{char name;LinkList *node=NULL;LinkList *temp=L->next;  //作为链表连接的中间点node=(LinkList *)malloc(sizeof(LinkList));  //分配内存if(node==NULL){printf("分配普通节点内存出错!");exit(1);}memset(node,0,sizeof(LinkList));printf("n请输入学生序号:");scanf("%d",&node->data.number);printf("n请输入学生名:");scanf("%s",node->data.name);printf("n请输入学生成绩:");scanf("%d",&node->data.score);printf("n请输入学生年龄:");scanf("%d",&node->data.age);L->next=node;                                                                                                                                          node->next=temp;
}

五 显示学生信息

void show_student(LinkList *L)
{LinkList *p=L->next;int i=0;printf("n    **************************      n");printf("            学生信息                n");printf("    **************************      n");printf("   序号    姓名    成绩    年龄 n");while(p){printf("      %d      %s      %d      %d     n",p->data.number,p->data.name,p->data.score,p->data.age);i++;                                                                                                                                                 p=p->next;}
}

六 删除学生

可以选择

1、按序号删除。

2、按姓名删除。

void delete_student(LinkList *L)
{int x=0;int number;char name[10];LinkList *temp,*pre;temp=L->next;while(1){printf("n    请选择:");printf("n    1.按序号删除!");printf("n    2.按姓名删除!");printf("n    请输入选择:");scanf("%d",&x);if(x==1 || x==2)break;else printf("n   输入错误,请重新输入!");}if(x==1)            //根据输入的序号找到学生并删除{printf("n    请输入要删除的学生序号:");scanf("%d",&number);while(temp->data.number!=number && temp->next!=NULL){pre=temp;temp=temp->next;}if(temp->data.number==number){pre->next=temp->next;free(temp);}else{printf("n    没有所要删除的学生序号!");}}else if(x==2)      //根据输入的姓名找到学生并删除{printf("n     请输入要删除的学生名字:");scanf("%s",name);while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL){pre=temp;temp=temp->next;}if(strcmp(temp->data.name,name)==0){pre->next=temp->next;free(temp);}else{printf("n     没有要删除的学生姓名!");}}
}

七 修改学生信息

首先找到学生,然后对找到的学生信息进行修改。

可以选择按序号和按姓名来找学生。

找到学生后,可以选择修改学生的任意一项信息。

void modify_student(LinkList *L)
{int x=0;int number;char name[10];LinkList *temp;temp=L->next;while(1){printf("n    请选择:");printf("n    1.知道要修改学生的序号!");printf("n    2.知道要修改学生的名字!");                                                                                                             printf("n    请输入选择:");scanf("%d",&x);if(x==1 || x==2)break;elseprintf("n   输入错误,请重新输入!");}if(x==1){printf("n    请输入要修改学生的序号:");scanf("%d",&number);while(temp->data.number!=number && temp->next!=NULL){temp=temp->next;}if(temp->data.number==number){printf("n     已经找到要修改学生的信息!");}else{printf("n    没有要修改学生的序号!");}}else if(x==2){printf("n     请输入要修改学生的名字:");scanf("%s",name);while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL){temp=temp->next;}if(strcmp(temp->data.name,name)==0){printf("n     已经找到要修改学生的信息!");}else{printf("n     没有要修改学生的姓名!");}}printf("n     ************************");printf("n   姓名:%s  序号:%d  成绩:%d  年龄:%d",temp->data.name,temp->data.number,temp->data.score,temp->data.age);do{printf("n     请选择:");printf("n     1.修改序号!");printf("n     2.修改名字!");printf("n     3.修改成绩!");printf("n     4.修改年龄!");printf("n     请输入选择:");scanf("%d",&x);}while(x<1 || x>4);if(x==1){printf("n     请输入修改后的序号:");scanf("%d",&temp->data.number);}if(x==2){printf("n     请输入修改后的名字:");scanf("%s",temp->data.name);}if(x==3){printf("n     请输入修改后的成绩:");scanf("%d",&temp->data.score);}if(x==4){printf("n     请输入修改后的年龄:");scanf("%d",&temp->data.age);}}

八 保存到文件

void save(LinkList *L)
{FILE *fp;int i=0;LinkList *temp;                                                                                                                                        temp=L->next;if((fp=fopen("student.txt","a"))==NULL){printf("n     无法打开文件!");exit(1);} while(temp!=NULL){i++;fprintf(fp,"%d %s %d %d n",temp->data.number,temp->data.name,temp->data.score,temp->data.age);printf("n     第%d个已经保存!",i);temp=temp->next;}fclose(fp);
}

九 从文件中恢复

void refresh(LinkList *L)
{FILE *fp;LinkList *node=NULL;                                                          LinkList *temp=L->next;node=(LinkList *)malloc(sizeof(LinkList));if(node==NULL){printf("分配普通节点内存出错!");exit(1);}memset(node,0,sizeof(LinkList));  fp=fopen("student.txt","r");if(fp==NULL){printf("n     无法打开文件!");exit(1);}while(!feof(fp)){fscanf(fp,"%d %s %d %d",&node->data.number,node->data.name,&node->data.score,&node->data.age);L->next=node;node->next=temp;temp=node;node=(LinkList *)malloc(sizeof(LinkList));if(node==NULL){printf("分配普通节点内存出错!");exit(1);}memset(node,0,sizeof(LinkList));}                                                                                                                                                      printf("n     已经成功刷新学生信息!");
}

十 主函数

主函数中先创建一个头节点(不保存学生信息,便于操作空链表),然后进入主菜单,功能选择模块被我独立成一个函数,代码在主函数后面。

void main()
{ int i;LinkList *L=NULL;L=(LinkList *)malloc(sizeof(LinkList));if(L==NULL){ printf("分配头节点内存出错!");exit(1);}memset(L,0,sizeof(LinkList));L->next=NULL;int stop=1;while(1){ meum();choice(&stop,L);if(stop==0)break;printf("n     下一步操作:");printf("n     1.返回主界面");printf("n     2.退出系统");printf("n     请输入操作:");scanf("%d",&i);if(i==2)break;}
}
void choice(int *stop,LinkList *L)
{int num;printf("nn          请输入菜单选项:");scanf("%d",&num);switch (num){case 0: *stop=0; break;case 1: show_student(L); break;case 2: creat_node(L); break;case 3: delete_student(L); break;case 4: modify_student(L); break;case 5: save(L); break;case 6: refresh(L); break;default: printf("      请在0-6中间选择n");}
}

十一 优化建议

上面有一些写法可以进行优化的,但是因为这只是一个小项目没必要分那么多函数(分了引用次数也十分有限),并且这样更符合我的思路(一功能一模块),就没有进行优化。可以优化的如下:

1、将有复用的代码段独立写成函数,减少代码函数,例如选择和分配节点空间那里独立成函数。

2、将部分较长的函数进行功能分割,便于阅读。

十二 扩展建议

一、增加排序功能。

二、增加代码修改后写回文件时的检验是否修改的功能。

三、扩展界面。

十四 全部代码

#include<stdio.h>                                                                                                                                        
#include<stdlib.h>
#include<string.h>struct student
{ char name[10];int score;int number;int age;
};
struct LNode
{ struct student data;struct LNode *next;
};
typedef struct LNode LinkList;void meum();
void choice(int *stop,LinkList *L);
void creat_node(LinkList *L);
void show_student(LinkList *L);
void delete_student(LinkList *L);
void modify_student(LinkList *L);
void save(LinkList *L);
void refresh(LinkList *L);void main()
{ int i;LinkList *L=NULL;L=(LinkList *)malloc(sizeof(LinkList));if(L==NULL){ printf("分配头节点内存出错!");exit(1);}memset(L,0,sizeof(LinkList));L->next=NULL;int stop=1;while(1){ meum();choice(&stop,L);if(stop==0)break;printf("n     下一步操作:");printf("n     1.返回主界面");printf("n     2.退出系统");printf("n     请输入操作:");scanf("%d",&i);if(i==2)break;}
}void choice(int *stop,LinkList *L)
{int num;printf("nn          请输入菜单选项:");scanf("%d",&num);switch (num){case 0: *stop=0; break;case 1: show_student(L); break;case 2: creat_node(L); break;case 3: delete_student(L); break;case 4: modify_student(L); break;case 5: save(L); break;case 6: refresh(L); break;default: printf("      请在0-6中间选择n");}
}void meum()
{printf("n   *****************************   n");printf("         学生信息管理系统          n");printf("   *****************************   n");printf("           系统菜单功能            n");printf("   *****************************   n");printf("          1.查看学生信息           n");printf("          2.添加学生信息           n");printf("          3.删除学生信息           n");printf("          4.修改学生信息           n");printf("          5.保存学生信息           n");printf("          6.刷新学生信息           n");printf("          0.退出系统               n");
}void creat_node(LinkList *L)
{char name;LinkList *node=NULL;LinkList *temp=L->next;  //作为链表连接的中间点node=(LinkList *)malloc(sizeof(LinkList));  //分配内存if(node==NULL){printf("分配普通节点内存出错!");exit(1);}memset(node,0,sizeof(LinkList));printf("n请输入学生序号:");scanf("%d",&node->data.number);printf("n请输入学生名:");scanf("%s",node->data.name);printf("n请输入学生成绩:");scanf("%d",&node->data.score);printf("n请输入学生年龄:");scanf("%d",&node->data.age);L->next=node;                                                                                                                                          node->next=temp;
}void show_student(LinkList *L)
{LinkList *p=L->next;int i=0;printf("n    **************************      n");printf("            学生信息                n");printf("    **************************      n");printf("   序号    姓名    成绩    年龄 n");while(p){printf("      %d      %s      %d      %d     n",p->data.number,p->data.name,p->data.score,p->data.age);i++;                                                                                                                                                 p=p->next;}
}void delete_student(LinkList *L)
{int x=0;int number;char name[10];LinkList *temp,*pre;temp=L->next;while(1){printf("n    请选择:");printf("n    1.按序号删除!");printf("n    2.按姓名删除!");printf("n    请输入选择:");scanf("%d",&x);if(x==1 || x==2)break;else printf("n   输入错误,请重新输入!");}if(x==1)            //根据输入的序号找到学生并删除{printf("n    请输入要删除的学生序号:");scanf("%d",&number);while(temp->data.number!=number && temp->next!=NULL){pre=temp;temp=temp->next;}if(temp->data.number==number){pre->next=temp->next;free(temp);}else{printf("n    没有所要删除的学生序号!");}}else if(x==2)      //根据输入的姓名找到学生并删除{printf("n     请输入要删除的学生名字:");scanf("%s",name);while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL){pre=temp;temp=temp->next;}if(strcmp(temp->data.name,name)==0){pre->next=temp->next;free(temp);}else{printf("n     没有要删除的学生姓名!");}}
}void modify_student(LinkList *L)
{int x=0;int number;char name[10];LinkList *temp;temp=L->next;while(1){printf("n    请选择:");printf("n    1.知道要修改学生的序号!");printf("n    2.知道要修改学生的名字!");                                                                                                             printf("n    请输入选择:");scanf("%d",&x);if(x==1 || x==2)break;elseprintf("n   输入错误,请重新输入!");}if(x==1){printf("n    请输入要修改学生的序号:");scanf("%d",&number);while(temp->data.number!=number && temp->next!=NULL){temp=temp->next;}if(temp->data.number==number){printf("n     已经找到要修改学生的信息!");}else{printf("n    没有要修改学生的序号!");}}else if(x==2){printf("n     请输入要修改学生的名字:");scanf("%s",name);while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL){temp=temp->next;}if(strcmp(temp->data.name,name)==0){printf("n     已经找到要修改学生的信息!");}else{printf("n     没有要修改学生的姓名!");}}printf("n     ************************");printf("n   姓名:%s  序号:%d  成绩:%d  年龄:%d",temp->data.name,temp->data.number,temp->data.score,temp->data.age);do{printf("n     请选择:");printf("n     1.修改序号!");printf("n     2.修改名字!");printf("n     3.修改成绩!");printf("n     4.修改年龄!");printf("n     请输入选择:");scanf("%d",&x);}while(x<1 || x>4);if(x==1){printf("n     请输入修改后的序号:");scanf("%d",&temp->data.number);}if(x==2){printf("n     请输入修改后的名字:");scanf("%s",temp->data.name);}if(x==3){printf("n     请输入修改后的成绩:");scanf("%d",&temp->data.score);}if(x==4){printf("n     请输入修改后的年龄:");scanf("%d",&temp->data.age);}}void save(LinkList *L)
{FILE *fp;int i=0;LinkList *temp;                                                                                                                                        temp=L->next;if((fp=fopen("student.txt","a"))==NULL){printf("n     无法打开文件!");exit(1);} while(temp!=NULL){i++;fprintf(fp,"%d %s %d %d n",temp->data.number,temp->data.name,temp->data.score,temp->data.age);printf("n     第%d个已经保存!",i);temp=temp->next;}fclose(fp);
}void refresh(LinkList *L)
{FILE *fp;LinkList *node=NULL;                                                          LinkList *temp=L->next;node=(LinkList *)malloc(sizeof(LinkList));if(node==NULL){printf("分配普通节点内存出错!");exit(1);}memset(node,0,sizeof(LinkList));  fp=fopen("student.txt","r");if(fp==NULL){printf("n     无法打开文件!");exit(1);}while(!feof(fp)){fscanf(fp,"%d %s %d %d",&node->data.number,node->data.name,&node->data.score,&node->data.age);L->next=node;node->next=temp;temp=node;node=(LinkList *)malloc(sizeof(LinkList));if(node==NULL){printf("分配普通节点内存出错!");exit(1);}memset(node,0,sizeof(LinkList));}                                                                                                                                                      printf("n     已经成功刷新学生信息!");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java计算棋盘上的麦粒

java计算棋盘上的麦粒 /*** java计算棋盘上的麦粒* 棋盘16格&#xff0c;第一个格子一个麦粒&#xff0c;以后每个格子都是上一个格子里麦粒的两倍* 每个麦粒0.0001克&#xff0c;问麦粒的总重量&#xff0c;麦粒的总数量*/ public class Test26 {public static void main(Str…

python编程 迷你世界_迷你编程下载-迷你世界迷你编程下载 v1.0官方版--pc6下载站...

迷你世界迷你编程是一款图形化编程软件&#xff0c;可以帮助青少年学习基础的编程知识&#xff0c;提高逻辑思维能力&#xff0c;迷你世界迷你编程还能让用户直观的感受到编程效果&#xff0c;对编程产生兴趣。。相关软件软件大小版本说明下载地址 迷你世界迷你编程是一款图形化…

java简单密码验证程序

java简单密码验证程序 package demo01;import java.util.Scanner;/*** java模拟密码验证问题* 从键盘上录入6位密码&#xff0c;验证密码是不是6位&#xff0c;如果不是6位提示用户重新录入* 直到录入时6位为止* 并模拟验密码是否正确&#xff0c;三次以内输入密码显示欢迎&am…

python程序设计sgnx_Python中符号函数的数值积分

我是Python新手&#xff0c;所以我的一些问题或想法可能是愚蠢的&#xff0c;但是。。。在 我想画一个分布D&#xff08;x&#xff09;。m和s2是一些给定的实数。有人告诉我&#xff0c;绘制D&#xff08;x&#xff09;图的最好方法是写一个函数&#xff0c;它可以解出每个x的积…

java求1000内的水仙花数

java求1000内的水仙花数 /*** java求1000内的水仙花数*/ public class Test29 {public static void main(String[] args) {for (int num 100; num < 1000; num) {int i num % 10;int j num / 10 % 10;int k num / 100;if (i * i * i j * j * j k * k * k num) {Syst…

java控制关键字continue,break,return

java控制关键字continue&#xff0c;break&#xff0c;return /*** break 可以停止循环继续执行 只能停止最内层的循环* 如果想停止外层for循环 需要给外层循环做标记* continue 停止当前循环一次 从下一次继续* return 停止当前方法&#xff0c;回到主调方法*/ public class …

python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

#写在前面 已经有一个礼拜多没写博客了&#xff0c;因为沉醉在了《妙味》这部小说里&#xff0c;里面讲的是一个厨师苏秒的故事。现实中大部分人不会有她的天分。我喜欢她的性格&#xff1a;总是想着去解决问题&#xff0c;好像从来没有怨天尤人过。我还喜欢里面那些描写味道的…

cmd如何默认以管理身份运行

一&#xff0c;cmd如何默认以管理身份运行 1&#xff0c;是不是每次打开cmd窗口都是这样的 这代表默认情况下不是以管理员身份运行的&#xff0c;而是用户身份。 博主是个很懒的人&#xff0c;从来都会想办法以最简单有效的方法处理&#xff0c;不想每次通过win键加r输入cmd&…

cmd中输入net start mysql 提示:服务名无效

cmd中输入net start mysql 提示&#xff1a;服务名无效 1&#xff0c;首先你需要找到下图&#xff0c;看你要启动的的mysql是不是叫mysql还是叫目前最新版本的mysql80 怎么找下面这张图呢&#xff1f;路径是&#xff1a;右键“我的电脑”&#xff0c;点击管理&#xff0c;点击…

net start mysql 发生系统错误 5。 拒绝访问。的解决方法

net start mysql 发生系统错误 5。 拒绝访问。的解决方法 发生的问题&#xff0c;由于默认情况下cmd是以用户身份运行的&#xff0c;出现此类问题是由于没有权限。运行cmd时需要以管理员身份运行 以管理员身份运行后再输入命令net start mysql80即可 那么如何设置默认情况下以…

npm的常用使用技巧

npm是一个强大的工具&#xff0c;可以帮助你管理Node.js项目中的依赖项。以下是一些有用的npm使用技巧&#xff1a; 使用npm install命令&#xff1a;这个命令可以安装项目的依赖项。如果你想安装一个特定的版本&#xff0c;你可以使用npm install <package><version…

如何设置MySQL的环境变量

如何设置MySQL的环境变量 1&#xff0c;右击“我的电脑”&#xff0c;点击属性&#xff0c;点击高级系统设置&#xff0c;点击环境变量。 2&#xff0c;在系统变量栏&#xff0c;找到Path&#xff0c;双击&#xff0c;点击新建&#xff0c; 内容为你的mysql中bin目录的路径&a…

MySQL启动、连接,退出,关闭命令学习

MySQL启动、连接&#xff0c;退出&#xff0c;关闭命令学习 1&#xff0c;启动MySQL服务 net start mysql80 2&#xff0c;连接MySQL mysql -h127.0.0.1 -u用户名 -p密码 回车&#xff0c;出现下面一堆东西就说明是好的。 说明: -h: 主机名&#xff0c;表示要连接的数据库…

coordinatorlayout_一篇文章学会Coordinatorlayout+AppbarLayout

点击上方蓝字关注 ??来源&#xff1a; 奔跑吧李博https://www.jianshu.com/p/cd93da2b7a24前言现如今&#xff0c;折叠式布局在App中相当常见&#xff0c;给人一种科技感&#xff0c;充满良好的用户体验。CoordinatorlayoutAppbarLayoutCollapsingToolbarLayout这三个臭皮匠…

一行python代码值多少钱_一行python代码

Life is short, just use Python. 自从08年接触Python&#xff0c;就有爱不释手的感觉&#xff0c;逐渐地&#xff0c;有些不忍地疏远了Perl 和Shell编程&#xff0c;因为python 的优雅么&#xff1f; 不全是&#xff0c;主要是可以高效开发吧。 那一行代码可以干什么呢&#x…

数据库MySQL相关操作||创建数据库、显示所有数据库、切换数据库、显示数据库下的数据库表、删除数据库

数据库MySQL相关操作||创建数据库、显示所有数据库、切换数据库、显示数据库下的数据库表、删除数据库 1&#xff0c;创建数据库 create databases mydb&#xff1b; 记得加&#xff1b;&#xff08;分号&#xff09; 2&#xff0c;显示所有数据库 show databases; 3&…

在yuv域如何降低画面亮度_家庭影院投影机错误地调节了亮度和对比度会得到怎么样的画面?...

家有影院&#xff0c;可以跟据你的房间和使用习惯设计家庭影院方案&#xff0c;并且还能让你以最优惠的价格买到它们。总之&#xff0c;一切关于家庭影院的问题&#xff0c;我们都可以帮你搞定。解决问题的方式从一对一咨询开始&#xff0c;如有需要&#xff0c;添加家有影院设…

MySQL创建数据库表student

MySQL创建数据库表student 1&#xff0c;创建数据库 create database mydb&#xff1b; 2&#xff0c;查看所有数据库 show databases; 3&#xff0c;使用数据库 use mydb; 4&#xff0c;创建数据库表student create table student(sno int(6),name varchar(12),sex char(2)…

java遍历数组练习(for循环、foreach)

java遍历数组练习&#xff08;for循环、foreach&#xff09; /* * 遍历数组 for循环 foreach * */ public class Test01 {public static void main(String[] args) {int[] arr {11,3,45,6,78,89,23,4};//for循环遍历数组for (int index 0;index<arr.length;index){Sys…

mybatis generator 打印出来表了 但是没有生成未见_Python丨深度学习中使用生成器加速数据读取与训练...

1、什么是生成器我们可以把生成器理解为一个高端的列表。生成器就是一个集算法和列表还有依次读取于一体的功能。因为如果列表存储的内容过多就会造成内存的浪费。但是如果“列表”内的元素可以通过某种规则展示出来、且我们只需要前几项的元素&#xff0c;我们就可以通过使用生…