
离线 TA的专栏
- 打卡等级:热心大叔
- 打卡总天数:233
- 打卡月天数:0
- 打卡总奖励:3508
- 最近打卡:2025-10-27 06:31:21
|
本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下
前言:与上篇文章相比,增加了文件操作,可将任意时期的的学生数据存储再文件中,菜单也随之改动,增加了文件操作一栏,是否存储到相应文件中由使用者决定
新增函数——文件操作;
- //学生数据文件储存
- //储存任意时期的学生数据
- void Store_List(Link head)
- {
- //文件操作
- ofstream ofs;
- ofs.open("Std_Information.txt",ios::out);
-
- if(head==NULL)
- {
- printf("学生为空\n");
- return;
- }
- else
- {
- Link p=head->next;
- while(p)
- {
- ofs<< "姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl;
- p=p->next;
- }
-
- }
- }
复制代码 1.头文件和预处理
- #include <stdio.h>
- #include<string.h>
- #include<malloc.h>
- #include<stdlib.h>
- #include<stdbool.h>
- #include<iostream>
- #include<fstream>//文件操作所需头文件
- using namespace std;
- #define NO_LENGTH 20
- #define NAME_LENGTH 11
- /* 定义学生结构体的数据结构 */
- typedef struct Student{
- char studentNo[NO_LENGTH];
- char studentName[NAME_LENGTH];
- int score;
- }st;
- /* 定义每条记录或节点的数据结构 */
- typedef struct node
- {
- struct Student data; //数据域
- struct node *next; //指针域
- }Node,*Link; //Node为node类型的别名,Link为node类型的指针别名
复制代码 2.定义学生结构体的数据结构
- typedef struct Student{
- char studentNo[NO_LENGTH];
- char studentName[NAME_LENGTH];
- int score;
- }st;
复制代码 3.定义每条记录或节点的数据结构
- /* 定义每条记录或节点的数据结构 */
- typedef struct node
- {
- struct Student data; //数据域
- struct node *next; //指针域
- }Node,*Link; //Node为node类型的别名,Link为node类型的指针别名
复制代码 4.函数接口代码.
1.定义提示菜单
- //定义提示菜单
- void myMenu(){
- printf("*****************************菜单*****************************\n");
- printf("***********************1 增加学生记录*************************\n");
- printf("***********************2 删除学生记录*************************\n");
- printf("***********************3 查找学生记录*************************\n");
- printf("***********************4 修改学生记录*************************\n");
- printf("***********************5 统计学生人数 ************************\n");
- printf("***********************6 显示学生记录*************************\n");
- printf("***********************7 信息文件打印*************************\n");
- printf("***********************8 退出系统 ****************************\n");
-
- }
复制代码 2.增加学生记录
- void inputStudent(Link l){
- printf("请输入学生学号:");
- scanf("%s",l->data.studentNo);
- printf("请输入学生的姓名:");
- scanf("%s",l->data.studentName);
- printf("请输入学生的成绩:");
- scanf("%s",&(l->data.score));
- //每个新创建的节点的next域都初始化为NULL
- l->next = NULL;
- system("cls");
- }
复制代码 3.输入学号接口·
- void inputStudentNo(char s[],char no[]){
- printf("请输入要%s的学生学号:",s);
- scanf("%s",no);
- }
复制代码 4.遍历表中学生
- //遍历表中学生
- void displayNode(Link head){
- if(head==NULL)
- {
- printf("学生为空\n");
- return;
- }
- else
- {
- Link p=head->next;
- while(p)
- {
- cout<<"姓名:"<<p->data.studentName<<" 学号"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl;
- p=p->next;
- }
-
- }
- // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
- system("pause");
- system("cls");
- }
复制代码 5.增加学生记录
- /* 增加学生记录 */
- bool addNode(Link head){
- Link p,q; //p,q两个节点一前一后
- Link node; //node指针指向新创建的节点
- node=(Link)malloc(sizeof(Node));
- inputStudent(node);
- q = head;
- p = head->next; //q指向head后面的第一个有效节点
- if(head->next==NULL)
- //链表为空时
- head->next = node;
- else {
- //循环访问链表中的所有节点
- while(p != NULL){
- if (node->data.studentNo < p->data.studentNo){
- //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
- q->next = node;
- node->next = p;
- return true;
- }
- else{
- //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
- q = p;
- p = p->next;
- }
- }
- //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
- q->next = node;
- }
- return true;
- system("pause");
- system("cls");
- }
复制代码 6.删除学生信息
- //删除学生信息
- bool deleteNode(Link head){
- // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false
- //输入要处理的学号
- char no[NO_LENGTH];
- inputStudentNo("删除",no);
- Link p=head->next;
- Link q=head;
- while(p)
- {
- if(strcmp(p->data.studentNo,no)==0)
- {
- cout<<"成功删除该学生"<<endl;
- q->next=p->next;
- free(p);
- system("pause");
- system("cls");
- return true;
- }
- else
- {
- q=p;
- p=p->next;
- }
- }
- cout<<"未找到该学生"<<endl;
- system("pause");
- system("cls");
- return false;
- }
复制代码 7.查找学生信息
- //查找学生信息
- bool queryNode(Link head){
- // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false
- //输入要处理的学号
- char no[NO_LENGTH];
- inputStudentNo("查找",no);
- Link p=head->next;
- while(p)
- {
- if(strcmp(p->data.studentNo,no)==0)
- {
-
- system("cls");
- cout<<"姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl;
- return true;
- }
- else
- {
- p=p->next;
- }
- }
- cout<<"未找到该学生"<<endl;
- system("cls");
- return false;
- }
复制代码 8.修改学生信息
- //修改学生信息
- bool modifyNode(Link head){
- // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
-
- //输入要处理的学号
- char no[NO_LENGTH];
- inputStudentNo("修改",no);
- Link p=head->next;
- while(p)
- {
- if(strcmp(p->data.studentNo,no)==0)
- {
- cout<<"请输入修改后的姓名"<<endl;
- cin>>p->data.studentName;
- cout<<"请输入修改后的学号"<<endl;
- cin>>p->data.studentNo;
- cout<<"请输入修改后的成绩"<<endl;
- cin>>p->data.score;
- system("cls");
- return true;
- }
- else
- {
- p=p->next;
- }
- }
- cout<<"未找到该学生,请重新输入学号"<<endl;
- system("cls");
- return false;
- }
复制代码 9.统计学生人数
- //统计学生人数
- int countNode(Link head){
- //统计学生人数,扫描链表统计节点个数,返回节点数
- Link p;
- int count = 0;
- p = head->next;
- while(p)
- {
- p=p->next;
- count++;
- }
- //填充代码
- system("cls");
- return count;
- }
复制代码 10.清空链表
- //清空链表
- void clearLink(Link head){
- Link q,p;
- p=head->next;
- q=head;
- while(p)
- {
- q->next=p->next;
- free(p);
- p=q->next;
- }
- //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
- }
复制代码 11.文件操作
- //学生数据文件储存
- //储存任意时期的学生数据
- void Store_List(Link head)
- {
- //文件操作
- ofstream ofs;
- ofs.open("Std_Information.txt",ios::out);
-
- if(head==NULL)
- {
- printf("学生为空\n");
- return;
- }
- else
- {
- Link p=head->next;
- while(p)
- {
- ofs<< "姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl;
- p=p->next;
- }
-
- }
- }
复制代码 5.main函数
- int main() {
- int select;
- int count;
- Link head; // 定义链表
- //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
- head = (Link)malloc(sizeof(Node));
- head->next = NULL;
- while(1)
- {
- myMenu();
- printf("\n请输入你的选择(0-7):"); //显示提示信息
- scanf("%d",&select);
- switch(select)
- {
- case 1:
- //增加学生记录
- if(addNode(head))
- printf("成功插入一个学生记录。\n\n");
- break;
- case 2:
- //删除学生记录
- if(deleteNode(head))
- printf("成功删除一个学生记录。\n\n");
- else
- printf("没有找到要删除的学生节点。\n\n");
- break;
- case 3:
- //查询学生记录
- if(queryNode(head))
- printf("成功找到学生记录。\n\n");
- else
- printf("没有找到要查询的学生节点。\n\n");
- break;
- case 4:
- //修改学生记录
- if(modifyNode(head))
- printf("成功修改一个学生记录。\n\n");
- else
- printf("没有找到要修改的学生节点。\n\n");
- break;
- case 5:
- //统计学生人数
- count = countNode(head);
- printf("学生人数为:%d\n\n",count);
- break;
- case 6:
- //显示学生记录
- displayNode(head);
- break;
- case 7:
- //退出前清除链表中的所有结点
- clearLink(head);
- return 0;
- default:
- printf("输入不正确,应该输入0-7之间的数。\n\n");
- system("cls");
- break;
- }
- }
- return 0;
- }
复制代码 6.学生信息管理系统总源码(可直接复制运行)
- #include <stdio.h>
- #include<string.h>
- #include<malloc.h>
- #include<stdlib.h>
- #include<stdbool.h>
- #include<iostream>
- #include<fstream>//文件操作所需头文件
- using namespace std;
- #define NO_LENGTH 20
- #define NAME_LENGTH 11
- /* 定义学生结构体的数据结构 */
- typedef struct Student{
- char studentNo[NO_LENGTH];
- char studentName[NAME_LENGTH];
- int score;
- }st;
- /* 定义每条记录或节点的数据结构 */
- typedef struct node
- {
- struct Student data; //数据域
- struct node *next; //指针域
- }Node,*Link; //Node为node类型的别名,Link为node类型的指针别名//定义提示菜单
- void myMenu(){
- printf("*****************************菜单*****************************\n");
- printf("***********************1 增加学生记录*************************\n");
- printf("***********************2 删除学生记录*************************\n");
- printf("***********************3 查找学生记录*************************\n");
- printf("***********************4 修改学生记录*************************\n");
- printf("***********************5 统计学生人数 ************************\n");
- printf("***********************6 显示学生记录*************************\n");
- printf("***********************7 信息文件打印*************************\n");
- printf("***********************8 退出系统 ****************************\n");
-
- }void inputStudent(Link l){ printf("请输入学生学号:"); scanf("%s",l->data.studentNo); printf("请输入学生的姓名:"); scanf("%s",l->data.studentName); printf("请输入学生的成绩:"); scanf("%d",&(l->data.score)); //每个新创建的节点的next域都初始化为NULL l->next = NULL; system("cls");}void inputStudentNo(char s[],char no[]){
- printf("请输入要%s的学生学号:",s);
- scanf("%s",no);
- }//遍历表中学生 void displayNode(Link head){ if(head==NULL) { printf("学生为空\n"); return; } else { Link p=head->next; while(p) { cout<<"姓名:"<<p->data.studentName<<" 学号"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; //ofs<< "姓名:"<<p->data.studentName<<" 学号"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; p=p->next; } } // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息 system("pause"); system("cls");}/* 增加学生记录 */
- bool addNode(Link head){
- Link p,q; //p,q两个节点一前一后
- Link node; //node指针指向新创建的节点
- node=(Link)malloc(sizeof(Node));
- inputStudent(node);
- q = head;
- p = head->next; //q指向head后面的第一个有效节点
- if(head->next==NULL)
- //链表为空时
- head->next = node;
- else {
- //循环访问链表中的所有节点
- while(p != NULL){
- if (node->data.studentNo < p->data.studentNo){
- //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
- q->next = node;
- node->next = p;
- return true;
- }
- else{
- //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
- q = p;
- p = p->next;
- }
- }
- //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
- q->next = node;
- }
- return true;
- system("pause");
- system("cls");
- }bool deleteNode(Link head){ // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("删除",no); Link p=head->next; Link q=head; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"成功删除该学生"<<endl; q->next=p->next; free(p); system("pause"); system("cls"); return true; } else { q=p; p=p->next; } } cout<<"未找到该学生"<<endl; system("pause"); system("cls"); return false;}//查找学生信息
- bool queryNode(Link head){
- // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false
- //输入要处理的学号
- char no[NO_LENGTH];
- inputStudentNo("查找",no);
- Link p=head->next;
- while(p)
- {
- if(strcmp(p->data.studentNo,no)==0)
- {
-
- system("cls");
- cout<<"姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl;
- return true;
- }
- else
- {
- p=p->next;
- }
- }
- cout<<"未找到该学生"<<endl;
- system("cls");
- return false;
- }//修改学生信息
- bool modifyNode(Link head){
- // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
-
- //输入要处理的学号
- char no[NO_LENGTH];
- inputStudentNo("修改",no);
- Link p=head->next;
- while(p)
- {
- if(strcmp(p->data.studentNo,no)==0)
- {
- cout<<"请输入修改后的姓名"<<endl;
- cin>>p->data.studentName;
- cout<<"请输入修改后的学号"<<endl;
- cin>>p->data.studentNo;
- cout<<"请输入修改后的成绩"<<endl;
- cin>>p->data.score;
- system("cls");
- return true;
- }
- else
- {
- p=p->next;
- }
- }
- cout<<"未找到该学生,请重新输入学号"<<endl;
- system("cls");
- return false;
- }//统计学生人数
- int countNode(Link head){
- //统计学生人数,扫描链表统计节点个数,返回节点数
- Link p;
- int count = 0;
- p = head->next;
- while(p)
- {
- p=p->next;
- count++;
- }
- //填充代码
- system("cls");
- return count;
- }//清空链表
- void clearLink(Link head){
- Link q,p;
- p=head->next;
- q=head;
- while(p)
- {
- q->next=p->next;
- free(p);
- p=q->next;
- }
- //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
- }//学生数据文件储存
- //储存任意时期的学生数据
- void Store_List(Link head)
- {
- //文件操作
- ofstream ofs;
- ofs.open("Std_Information.txt",ios::out);
-
- if(head==NULL)
- {
- printf("学生为空\n");
- return;
- }
- else
- {
- Link p=head->next;
- while(p)
- {
- ofs<< "姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl;
- p=p->next;
- }
-
- }
- }int main() { int select; int count; Link head; // 定义链表 //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据 head = (Link)malloc(sizeof(Node)); head->next = NULL; while(1) { myMenu(); printf("\n请输入你的选择(0-8):"); //显示提示信息 scanf("%d",&select); switch(select) { case 1: //增加学生记录 if(addNode(head)) printf("成功插入一个学生记录。\n\n"); break; case 2: //删除学生记录 if(deleteNode(head)) printf("成功删除一个学生记录。\n\n"); else printf("没有找到要删除的学生节点。\n\n"); break; case 3: //查询学生记录 if(queryNode(head)) printf("成功找到学生记录。\n\n"); else printf("没有找到要查询的学生节点。\n\n"); break; case 4: //修改学生记录 if(modifyNode(head)) printf("成功修改一个学生记录。\n\n"); else printf("没有找到要修改的学生节点。\n\n"); break; case 5: //统计学生人数 count = countNode(head); printf("学生人数为:%d\n\n",count); break; case 6: //显示学生记录 displayNode(head); break; case 7:Store_List(head); cout<<"打印成功"<<endl; system("pause"); system("cls"); break; case 8: //退出前清除链表中的所有结点 clearLink(head); return 0; default: printf("输入不正确,应该输入0-8之间的数。\n\n"); system("pause"); system("cls"); break; } } return 0;}
复制代码 7.测试结果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持晓枫资讯。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|