《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#includestructstudent{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(in){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-numstu-num&&p1-next!=NULL)//跳过不符合的结点{p2=p1;p1=p2-next;}if(p1-numstu-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;elsep2-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]score)break;elsehead=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;elsep=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((id1)||(id9))break;switch(id){case1:{printf(请输入学生数:);scanf(%d,&num);Head=CreateList(num);break;}case2:{if(Head==NULL