- 基于链表的“学生信息管理系统”
实验内容:编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链表结点类型,包括:学号、姓名、班级、专业、3门成绩。
实验要求:
-
- main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
- 定义函数CreateList:按学号由小到大,建立有序的链表。逆序输入 n 个学生信息(调用n次input),学号大的先输入,建立带头结点的单链表。
- 定义函数Output:以指向某个学生结点的指针为参数,将学生信息格式化输出。
- 定义函数Save:将某个学生信息存入文件。
- 定义函数Fetch:从文件中随机读取某个学生的信息。
- 定义函数Search_num:查找指定学号的学生,返回指向该学生结点的指针。
- 定义函数InsertList:在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。
- 定义函数Delete_num:从链表中删除指定学号的学生。
- 定义函数Search_major _subject_score:查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。
- 定义函数Delete_ major _subject:从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。
题目如上
源代码:
#include#include #include typedef long long ll; struct Student{ char num[15];//学号 char name[15];//姓名 char major[10];//专业(computer,software,network) int classNo;//班级(1-2) int score[3];//3门课的成绩(0-2) ll numll; struct Student *next; }; typedef struct Student STU; STU *head=NULL; STU *p=NULL,*pr=NULL; int N; STU* AppendNode(STU *head)//下一元素 { STU *p=NULL,*pr=head; p=(STU*)malloc(sizeof(STU)); if(head==NULL) { head=p;//第一次创建 } else//第二次及以后 { while(pr->next!=NULL) //pr给的头指针地址,每次添加都从头开始寻找 { pr=pr->next;//直到找到尾节点停止 } pr->next=p; //给当前阶段尾节点以新创建的地址值 } p->next=NULL;//一定要给予next赋值为NULL,也就是某个阶段的尾节点一定是NULL值 return head; } void Input(STU *p) { scanf("%s %s %s %d %d %d %d",&p->num,&p->name,&p->major,&p->classNo,&p->score[0],&p->score[1],&p->score[2]); ll temp=0,ans=0; int len=strlen(p->num); for(int i=0;i num[i]-'0'; for(int j=0;j numll=ans; } void Output(STU *p) { printf("n 学号t 姓名t 专业t 班级 课程0 课程1 课程2 n"); printf("%st %st %st %dt %dt %dt %dt n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]); } void Save(STU *head) { FILE *fp; STU *p=head; fp=fopen("studentInit_save.txt","w"); if(fp==NULL) { printf("文件打开失败"); exit(0); } while(p->next!=NULL) { fprintf(fp,"%10s %10s %10st%5dt%5dt%5dt%5d n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]); p=p->next; } fprintf(fp,"%10s %10s %10st%5dt%5dt%5dt%5d n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]); fclose(fp); printf("输出完毕"); } STU *CreateList(STU *head_this) { STU *head=head_this; STU *p=head,*pr=head; printf("请输入学生的数量:"); scanf("%d",&N); printf("请输入学生信息,以学号 姓名 专业 班级 成绩0 成绩1 成绩2格式输入n"); for(int i=0;i next; } Input(p); p=head; } return p; } void Fetch(ll index) { STU *head=NULL,*p=NULL,*pr=NULL; FILE *fp=NULL; fp=fopen("studentInit.txt","r"); for(int i=0;i next; } fscanf(fp,"%s %s %s %d %d %d %d",&p->num,&p->name,&p->major,&p->classNo,&p->score[0],&p->score[1],&p->score[2]); ll temp=0,ans=0; int len=strlen(p->num); for(int i=0;i num[i]-'0'; for(int j=0;j numll=ans; p=head; } while(head->next!=NULL) { if(head->numll==index)break; head=head->next; } if(head->next==NULL&&head->numll!=index) { printf("未找到对应学生"); } else Output(head); } STU* Search_num(STU *head_this,ll num) { STU *head=head_this; STU *p=NULL; int flag=1; while(head->next!=NULL) { if(head->numll==num) { Output(head); return head; } head=head->next; } if(head->next==NULL&&head->numll==num) { Output(head); return head; } else { printf("未找到指定学号的学生"); return NULL; } } void InsertList(STU *head_this) { STU stu; STU *head=head_this; STU *p=head,*pr=NULL; pr=(STU*)malloc(sizeof(STU)); scanf("%s %s %s %d %d %d %d",&stu.num,&stu.name,&stu.major,&stu.classNo,&stu.score[0],&stu.score[1],&stu.score[2]); ll temp=0,ans=0; ll temp2=0,ans2=0; int len2; int len=strlen(stu.num); for(int i=0;i next!=NULL) { if(((p->next)->numll)>stu.numll)break; p=p->next; } //找到第一个不满足条件的前一个位置 if((head->numll)>stu.numll)//小于所有学号的,放到最前 { pr->next=head; strcpy(pr->num,stu.num); strcpy(pr->name,stu.name); strcpy(pr->major,stu.major); len2=strlen(pr->num); for(int i=0;i num[i]-'0'; for(int j=0;j score[0]=stu.score[0]; pr->score[1]=stu.score[1]; pr->score[2]=stu.score[2]; pr->classNo=stu.classNo; pr->numll=ans2; } else { pr->next=p->next;//要插入元素的下一个元素的链接 p->next=pr;//链接新元素 strcpy(pr->num,stu.num); strcpy(pr->name,stu.name); strcpy(pr->major,stu.major); len2=strlen(pr->num); for(int i=0;i num[i]-'0'; for(int j=0;j score[0]=stu.score[0]; pr->score[1]=stu.score[1]; pr->score[2]=stu.score[2]; pr->classNo=stu.classNo; pr->numll=ans2; } } void Delete_num(STU *head_this) { STU *head=head_this; STU *p=head; STU *ans=NULL; ll n; int flag=1; scanf("%lld",&n); while(p->next!=NULL) { if(flag==1&&p->numll==n) { ans=p; break; } if((p->next)->numll==n) { ans=p;//找到前一个 break; } p=p->next; flag=0; } if(flag==1) { head=head->next; } else { ans->next=(ans->next)->next; } } STU* Search_major_subject_score(STU *head_this,char *major,int n,int scorelimit) { STU *p=head_this; while(p->next!=NULL) { if((*(p->major)==*major)&&p->score[n] next; } if(p->next==NULL&&p->score[n]>=scorelimit) { printf("未找到该范围内的学生n"); return NULL; } else { Output(p); return p; } } void Delete_major_subject(STU *head_this,char *major,int n,int scorelimit) { STU *head=head_this; STU *p=head; while(p->next!=NULL) { if((*((p->next)->major)==*major)&&(p->next)->score[n] next; } p->next=(p->next)->next; } int main() { int a; printf(" ----------------------------------------------------------"); printf("n | 请输入功能编号,运行相应功能 |n"); printf(" | |n"); printf(" |1.创建链表 |n"); printf(" |2.将信息储存至studentInit_save.txt文件中 |n"); printf(" |3.读取某一个学生的信息 |n"); printf(" |4.查找指定学号的学生 |n"); printf(" |5.输入新学生信息并插入至系统 |n"); printf(" |6.删除指定学号的学生信息 |n"); printf(" |7.查找指定专业、课程,分数范围的第一个学生 |n"); printf(" |8.删除指定专业、课程,分数范围的第一个学生 |n"); printf(" |9.输出当前系统中所有学生信息 |n"); printf(" | 若输入其他数字则退出程序 |n"); printf(" | 程序运行前请先输入1以创建链表 |n"); printf(" ----------------------------------------------------------n"); while(scanf("%d",&a)!=0) { if(a<1||a>9)break; switch(a) { case 1: printf("请输入学生信息n"); head=CreateList(head); pr=head; printf("链表构造完成n"); printf("请继续输入序号使用功能n"); break; case 2: Save(head); printf("文件已经储存"); printf("n请继续输入序号使用功能n"); break; case 3: printf("输入要取出信息的学生学号n"); ll n; scanf("%lld",&n); Fetch(n); printf("n请继续输入序号使用对应功能n"); break; case 4: printf("输入需要查找的学生学号n"); ll num; scanf("%lld",&num); p=Search_num(head,num); printf("请继续输入功能序号n"); break; case 5: printf("输入需要插入的新学生信息n"); InsertList(head); printf("完成n请继续输入序号使用功能n"); break; case 6: printf("输入需要删除的学生信息n"); Delete_num(head); printf("完成n请继续输入序号使用功能n"); break; case 7: printf("输入需要查找的学生信息,以专业 课程序号 成绩最大值格式输入,以空格分隔n"); char Major[20]; int lesson,scorelimit; scanf("%s %d %d",Major,&lesson,&scorelimit); p=Search_major_subject_score(head,Major,lesson,scorelimit); printf("完成n请继续输入序号使用功能n"); break; case 8: printf("输入需要删除的学生信息,以专业 课程序号 成绩最大值格式输入,以空格分隔n"); char Major2[20]; int lesson2,scorelimit2; scanf("%s %d %d",Major2,&lesson2,&scorelimit2); Delete_major_subject(head,Major2,lesson2,scorelimit2); printf("完成n请继续输入序号使用功能n"); break; case 9: pr=head; while(pr->next!=NULL) { Output(pr); pr=pr->next; } Output(pr); break; } } return 0; }



