基于链表的学生信息管理系统实验报告.docx
- 文档编号:5703775
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:17
- 大小:18.12KB
基于链表的学生信息管理系统实验报告.docx
《基于链表的学生信息管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《基于链表的学生信息管理系统实验报告.docx(17页珍藏版)》请在冰点文库上搜索。
基于链表的学生信息管理系统实验报告
《C语言程序设计实训2》报告
设计题目:
基于链表的学生信息管理系统
学院名称:
信息科学技术学院
专业:
软件工程
班级:
x班
姓名:
xxx学号xxx
提交日期:
2014年6月
一、实验内容
编写并调试程序,实现学校各专业班级学生信息的管理。
定义学生信息的链表结点类型,包括:
学号、姓名、班级、专业、3门成绩。
二、实验要求
(1)main函数:
以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
(2)定义函数CreateList:
按学号由小到大,建立有序的链表。
逆序输入n个学生信息(调用n次input),学号大的先输入,建立带头结点的单链表。
(3)定义函数Output:
以指向某个学生结点的指针为参数,将学生信息表格化输出。
(4)定义函数Save:
将某个学生信息存入文件。
(5)定义函数Fetch:
从文件中随机读取某个学生的信息。
(6)定义函数Search_num:
查找指定学号的学生,返回指向该学生结点的指针。
(7)定义函数InsertList:
在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。
(8)定义函数Delete_num:
从链表中删除指定学号的学生。
(9)定义函数Search_major_subject_score:
查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。
(10)定义函数Delete_major_subject:
从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。
三、算法流程图
四、程序清单(关键语句和变量加注释)
#include<>//预编译命令
#include<>
#include<>
structstudent
{
intnum;//学号
charname[15];//姓名
charmajor[10];//专业(computer,software,network)
intclassNo;//班级(1-2)
intscore[3];//3门课的成绩(0-2)
structstudent*next;
};
typedefstructstudentSTU;
//--------------------------------输入--------------------------------
STU*Input()
{
STU*p;
if((p=(STU*)malloc(sizeof(STU)))==NULL)
{printf("头结点建立错误!
\n");
returnp;
}
printf("请输入学生的学号:
");
scanf("%d",&p->num);
printf("请输入学生的姓名:
");
scanf("%s",p->name);
printf("请输入学生的专业:
");
scanf("%s",p->major);
printf("请输入学生的班级:
");
scanf("%d",&p->classNo);
printf("请输入学生的成绩0:
");
scanf("%d",&p->score[0]);
printf("请输入学生的成绩1:
");
scanf("%d",&p->score[1]);
printf("请输入学生的成绩2:
");
scanf("%d",&p->score[2]);
returnp;
}
//--------------------------------建立链表------------------------------
STU*CreateList(intn)
{
structstudent*head,*p,*w;
inti=0;
printf("\n请输入第%d个学生信息\n",n);
p=Input();
while(i { i++; if(i==1) { head=p;//头结点有值 p->next=NULL; } else { printf("\n请输入第%d个学生信息\n",n-i+1); w=Input(); head=w; w->next=p; p=w; } } returnhead; } //-------------------------------输出------------------------------ voidOutput(STU*p) { printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]); } //-------------------------------输出所有--------------------------- voidprint(STU*head) { STU*p; p=head; if(head! =NULL) printf("学号\t姓名\t专业\t班级\t成绩0\t成绩1\t成绩2\t\n"); while(p! =NULL) { Output(p); p=p->next; } } //--------------------------------储存-------------------------------- voidSave(STU*p) { FILE*fp; charfilename[20]; printf("\n请输入保存文件名: \n"); gets(filename); if((fp=fopen(filename,"wb"))==NULL) { printf("cannotopenfile\n"); return; } if(p==NULL) printf("链表为空"); while(p! =NULL) { if((fwrite(p,sizeof(STU),1,fp))! =1) printf("\nwritefileerror\n"); p=p->next; } fclose(fp); } //----------------------------------文件查找--------------------------------- STUFetch(intn) { FILE*fp; structstudenttem; charfilename[20]; printf("\n请输入打开文件名: \n"); gets(filename); fp=fopen(filename,"rb"); fseek(fp,(long)(n*sizeof(STU)),0); fread(&tem,sizeof(STU),1,fp);//读取 fclose(fp); returntem; } //-----------------------------------查找学号------------------------------- STU*Search_num(STU*head,intnumber) { if(head==NULL) returnNULL; while(head->num! =number)//跳过不符合条件的学号 { if(head->next==NULL) returnNULL; head=head->next; } returnhead;//返回的指针名为head } //---------------------------------插入链表--------------------------------------- STU*InsertList(STU*head) { STU*p1,*p2,*stu; p1=p2=head; stu=(STU*)malloc(sizeof(STU));//待插入的结点 printf("\n请输入要插入的学生信息\n"); stu=Input(); if(head==NULL)//头结点为空 { head=stu; stu->next=NULL; } else { while(p1->num =NULL)//跳过不符合的结点 { p2=p1; p1=p2->next; } if(p1->num>stu->num) if(p1==head)//插最前面 { stu->next=head; head=stu; } else { stu->next=p1; p2->next=stu; } else { p1->next=stu;//插最后面 stu->next=NULL; } } returnhead; } //---------------------------------------学号删除----------------------------- STU*Delete_num(STU*head,intnumber) { STU*p1,*p2; if(head==NULL)//头结点为空 returnNULL; p1=head; while(p1->num! =number)//跳过不符合的点 { if(p1->next==NULL) returnNULL; p2=p1; p1=p1->next; } if(p1==head)//删除学号是第一个的情况 head=p1->next; else p2->next=p1->next; free(p1); returnhead; } //-------------------------------------查找专业课程成绩------------------------------------ STU*Search_major_subject_score(STU*head,char*major,intnumber,intscore) { if(head==NULL) returnNULL; while(head! =NULL) if((strcmp(major,head->major)==0)&&head->score[number] break; else head=head->next; returnhead; } //--------------------------------------删除专业课程成绩-------------------------------------- STU*Delete_major_subject(STU*head,char*major,intnumber,intscore) { STU*p=NULL; p=Search_major_subject_score(head,major,number,score);//先查找 if(p==NULL) returnp; else p=Delete_num(head,p->num);//再删除 returnp; } //---------------------------------------------主函数------------------------------------------ voidmain() { STU*Head=NULL; intid,num,sco; charfilename[10]; STU*p=NULL; STUstu; while (1) { printf("***********************************************************************\n"); printf("*欢迎使用学生成绩管理系统*\n"); printf("***********************************************************************\n"); printf("1-建立有序的链表2-信息存盘\n"); printf("3-从文件中随机读取某个学生的信息4-查找学号学生,返回该学生结点指针\n"); printf("5-输入一个学生信息插入相应位置6-从链表中删除指定学号的学生\n"); printf("7-查找某专业某课程成绩小于某分数的学生,返回指向该学生结点的指针\n"); printf("8-删除某个专业的、某门课程的成绩小于某个分数的学生\n"); printf("9-将学生信息表格化输出\n\n"); printf("**********************输入相应编号运行系统*****************************\n"); scanf("%d",&id); if((id<1)||(id>9)) break; switch(id) { case1: { printf("请输入学生数: "); scanf("%d",&num); Head=CreateList(num); break; } case2: { if(Head==NULL) { printf("链表未建立! \n"); break; } getchar(); Save(Head); break; } case3: { printf("\n请问要读取第几位学生信息\n"); scanf("%d",&id); getchar(); stu=Fetch(id); printf("学号\t姓名\t专业\t班级\t成绩0\t成绩1\t成绩2\t\n"); Output(&stu); break; } case4: { if(Head==NULL) { printf("链表未建立! \n"); break; } printf("请输入要查找的学生的学号: "); scanf("%d",&num); p=Search_num(Head,num); if(p==NULL) printf("查找失败! \n"); else {printf("学号\t姓名\t专业\t班级\t成绩0\t成绩1\t成绩2\t\n"); Output(p);} break; } case5: { Head=InsertList(Head); break; } case6: { if(Head==NULL) { printf("链表未建立! \n"); break; } printf("请输入要删除的学生的学号: "); scanf("%d",&num); p=Delete_num(Head,num); if(p==NULL) printf("删除成员失败! \n"); elseHead=p; break; } case7: { if(Head==NULL) { printf("链表未建立! \n"); break; } printf("请输入学生的专业: "); scanf("%s",filename); printf("请输入成绩序号(0<=n<=2): "); scanf("%d",&num); if(num<0||num>2) { printf("成绩序号输入错误"); break; } printf("请输入分数: "); scanf("%d",&sco); p=Search_major_subject_score(Head,filename,num,sco); if(p==NULL) printf("查找失败\n"); else {printf("学号\t姓名\t专业\t班级\t成绩0\t成绩1\t成绩2\t\n"); Output(p); } break; } case8: { if(Head==NULL) { printf("链表未建立! \n"); break; } printf("请输入学生的专业: "); scanf("%s",filename); printf("请输入成绩序号(0<=n<=2): "); scanf("%d",&num); if(num<0||num>2) { printf("成绩序号输入错误"); break; } printf("请输入分数: "); scanf("%d",&sco); p=Delete_major_subject(Head,filename,num,sco); if(p==NULL) printf("删除失败\n"); else Head=p; break; } case9: { if(Head==NULL) { printf("链表未建立! \n"); break; } print(Head); break; } default: { break; } } } } 五、程序测试(输入、输出的截图及文件的内容) 六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空话、套话,雷同扣分)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 学生 信息管理 系统 实验 报告