用c语言链表的形式表示这个学生管理系统
2条回答 默认 最新
- qfl_sdu 2021-07-02 10:03关注
代码如下:如有帮助,请帮忙采纳一下,谢谢。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NMBSCORE 3 struct StNode { int num; //学号 char name[20]; //姓名 char sex; //性别 int age; //年龄 int grade; //班级 int score[NMBSCORE]; //成绩 StNode* next; }; //读取文件 struct StNode* ReadFile(const char* filename,struct StNode* head) { struct StNode* node,*tmp; FILE* fp; int i; if ((fp = fopen(filename,"r")) == 0) { printf("文件打开失败\n"); return 0; } while(!feof(fp)) { node = (struct StNode*)malloc(sizeof(struct StNode)); fscanf(fp,"%d%20s %c%4d%4d",&node->num,node->name,&node->sex,&node->age,&node->grade); for(i=0;i<NMBSCORE;i++) fscanf(fp,"%4d",&node->score[i]); fscanf(fp,"\n"); node->next = 0; if (head == 0) { head = node; tmp = head; }else { tmp->next = node; tmp = node; } } fclose(fp); return head; } //录入信息 struct StNode* Input(struct StNode* head) { struct StNode* p,*node; int i; system("cls"); node = (struct StNode*)malloc(sizeof(struct StNode)); //录入信息 printf("请输入学号:"); scanf("%d",&node->num); printf("请输入姓名:"); scanf("%s",node->name); printf("请输入性别:"); scanf(" %c",&node->sex); printf("请输入年龄:"); scanf(" %d",&node->age); printf("请输入班级:"); scanf(" %d",&node->grade); printf("请输入%d门课程的成绩:",NMBSCORE); for(i=0;i<NMBSCORE;i++) scanf("%d",&node->score[i]); node->next = 0; if (head == 0) { head = node; // }else { p = head; while(p->next) p = p->next; //新建节点 p->next = node; } system("pause"); return head; } //显示所有学生信息 void showAll(struct StNode* head) { struct StNode* p; int i=1,j; system("cls"); p = head; while(p) { printf("学生%d学号:%d\n",i,p->num); printf("学生%d姓名:%s\n",i,p->name); printf("学生%d性别:%c\n",i,p->sex); printf("学生%d年龄:%d\n",i,p->age); printf("学生%d班级:%d\n",i,p->grade); printf("学生%d的成绩:",i); for(j=0;j<NMBSCORE;j++) printf("%d ",p->score[j]); printf("\n"); i++; p = p->next; } system("pause"); } //查询信息 void Find(struct StNode* head) { int opt; struct StNode* p = head; int id,j; char name[20]={0}; system("cls"); printf("1.按学号查询\n"); printf("2.按姓名查询\n"); scanf("%d",&opt); switch(opt) { case 1: printf("请输入学号:"); scanf("%d",&id); while(p) { if(p->num == id) { printf("学生学号:%d\n",p->num); printf("学生姓名:%s\n",p->name); printf("学生性别:%c\n",p->sex); printf("学生年龄:%d\n",p->age); printf("学生班级:%d\n",p->grade); printf("学生成绩:"); for(j=0;j<NMBSCORE;j++) printf("%d ",p->score[j]); printf("\n"); break; } p = p->next; } if(p==0) printf("查无此人\n"); break; case 2: printf("请输入姓名:"); scanf("%s",name); while(p) { if(strcmp(p->name,name) ==0) { printf("学生学号:%d\n",p->num); printf("学生姓名:%s\n",p->name); printf("学生性别:%c\n",p->sex); printf("学生年龄:%d\n",p->age); printf("学生班级:%d\n",p->grade); printf("学生成绩:"); for(j=0;j<NMBSCORE;j++) printf("%d ",p->score[j]); printf("\n"); break; } p = p->next; } if(p==0) printf("查无此人\n"); break; } system("pause"); } //修改学生信息 void ModInfo(struct StNode* head) { struct StNode* node = 0; int id,i; system("cls"); printf("请输入需要修改信息的学生学号:"); scanf("%d",&id); node = head; while(node) { if(node->num == id) break; else node = node->next; } if(node == 0) printf("查无此人\n"); else { memset(node->name,0,20); printf("请输入姓名:"); scanf("%s",node->name); printf("请输入性别:"); scanf(" %c",&node->sex); printf("请输入年龄:"); scanf(" %d",&node->age); printf("请输入班级:"); scanf(" %d",&node->grade); printf("请输入%d门课程的成绩:",NMBSCORE); for(i=0;i<NMBSCORE;i++) scanf("%d",&node->score[i]); } system("pause"); } //删除学生信息 void DeleteInfo(struct StNode* head) { struct StNode* node,*pre; int id,i; system("cls"); printf("请输入需要删除信息的学生学号:"); scanf("%d",&id); if (head->num == id) { node = head->next; free(head); head = node; printf("该学生信息已经删除\n"); system("cls"); return; }else { pre = head; node = head->next; while(node) { if (node->num == id) { pre->next = node->next; free(node); node = 0; printf("该学生信息已经删除\n"); system("pause"); return; }else { pre = node; node = node->next; } } printf("查无此人\n"); system("pause"); } } //学生信息统计 void Tongji(struct StNode* head) { struct StNode* node; int opt = 0; int count = 0; char ch; int grade; system("cls"); printf("1.按照性别统计\n"); printf("2.按照年级统计\n"); scanf("%d",&opt); switch(opt) { case 1: printf("请输入性别:"); scanf(" %c",&ch); node = head; count = 0; while(node) { if(node->sex == ch) count++; node = node->next; } printf("数量:%d\n",count); break; case 2: printf("请输入年级:"); scanf("%d",&grade); node = head; count = 0; while(node) { if(node->grade == grade) count++; node = node->next; } printf("数量:%d\n",count); break; } system("pause"); } //学生信息保存 void Save(const char* name,struct StNode* head) { struct StNode* node; FILE* fp; int i; system("cls"); if ((fp = fopen(name,"w")) == 0) { printf("文件打开失败\n"); system("pause"); return; } node = head; while(node) { fprintf(fp,"%d%20s %c%4d%4d",node->num,node->name,node->sex,node->age,node->grade); for(i=0;i<NMBSCORE;i++) fprintf(fp,"%4d",node->score[i]); fprintf(fp,"\n"); node = node->next; } fclose(fp); printf("文件保存成功!\n"); system("pause"); } int main() { struct StNode* head = 0; int opt = 0; int bgo = 1; char* filename = "students.txt"; head = ReadFile(filename,head); //读取文件 while(bgo) { system("cls"); printf("--------------学生信息管理系统---------------|\n"); printf("| 1.录入学生信息 |\n"); printf("| 2.显示所有学生信息 |\n"); printf("| 3.学生信息查询 |\n"); printf("| 4.学生信息修改 |\n"); printf("| 5.学生信息删除 |\n"); printf("| 6.学生信息统计 |\n"); printf("| 7.学生信息保存 |\n"); printf("| 0.退出系统 |\n"); printf("----------------------------------------------\n"); scanf("%d",&opt); switch(opt) { case 0: bgo = 0; break; case 1: head = Input(head); break; case 2: showAll(head); break; case 3: Find(head); break; case 4: ModInfo(head); break; case 5: DeleteInfo(head); break; case 6: Tongji(head); break; case 7: Save(filename,head); break; } } return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥15 stable diffusion
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
- ¥15 perl MISA分析p3_in脚本出错
- ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
- ¥15 ubuntu虚拟机打包apk错误