《基于链表的学生信息管理系统实验报告(共11页).docx》由会员分享,可在线阅读,更多相关《基于链表的学生信息管理系统实验报告(共11页).docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上C语言程序设计实训2报告设 计 题 目: 基于链表的学生信息管理系统 学 院 名 称: 信息科学技术学院 专 业: 软件工程 班 级: x班 姓 名: xxx 学 号 xxx 提 交 日 期: 2014年6月 一、实验内容编写并调试程序,实现学校各专业班级学生信息的管理。定义学生信息的链表结点类型,包括:学号、姓名、班级、专业、3门成绩。 二、实验要求 (1)main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。(2)定义函数CreateList:按学号由小到大,建立有序的链表。逆序输入 n 个学生信息(调用n次input),学号大的先输入,建
2、立带头结点的单链表。(3)定义函数Output:以指向某个学生结点的指针为参数,将学生信息表格化输出。(4)定义函数Save:将某个学生信息存入文件。(5)定义函数Fetch:从文件中随机读取某个学生的信息。(6)定义函数Search_num:查找指定学号的学生,返回指向该学生结点的指针。(7)定义函数InsertList:在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。(8)定义函数Delete_num:从链表中删除指定学号的学生。(9)定义函数Search_major _subject_score:查找某个专业的、某门课程的成绩小于某个分数的学生
3、,返回指向该学生结点的指针。(10)定义函数Delete_ major _subject:从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。三、算法流程图四、程序清单(关键语句和变量加注释)#include/ 预编译命令#include#includestruct studentint num;/学号char name15;/姓名char major10;/专业(computer,software,network)int classNo;/班级(1-2)int score3;/3门课的成绩(0-2)struct student *next;typedef struct student
4、STU;/-输入-STU *Input()STU *p;if( (p=(STU*)malloc(sizeof(STU)=NULL)printf(头结点建立错误!n); return p; 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-score0);printf(请输入学生的成绩1:);sc
5、anf(%d,&p-score1);printf(请输入学生的成绩2:);scanf(%d,&p-score2);return p;/-建立链表-STU*CreateList(int n)struct student*head,*p,*w;int i=0;printf(n请输入第%d个学生信息n,n);p=Input();while(inext=NULL;elseprintf(n请输入第%d个学生信息n,n-i+1);w=Input();head=w;w-next=p;p=w;return head;/-输出-void Output(STU *p)printf(%dt%st%st%dt%dt%
6、dt%dn,p-num,p-name,p-major,p-classNo,p-score0,p-score1,p-score2);/-输出所有-void print(STU *head)STU *p;p=head;if(head!=NULL)printf(学号t姓名t专业 t班级t成绩0t成绩1t成绩2tn);while(p!=NULL) Output(p);p=p-next;/-储存-void Save(STU*p)FILE*fp;char filename20;printf(n请输入保存文件名:n);gets(filename);if(fp=fopen(filename,wb)=NULL)
7、printf(cannot open filen);return;if(p=NULL)printf(链表为空);while(p!=NULL)if(fwrite(p,sizeof(STU),1,fp)!=1)printf(nwrite file errorn);p=p-next;fclose(fp);/-文件查找-STU Fetch(int n)FILE*fp;struct student tem;char filename20;printf(n请输入打开文件名:n);gets(filename);fp=fopen(filename,rb);fseek(fp,(long)(n*sizeof(ST
8、U),0);fread(&tem,sizeof(STU),1,fp);/读取fclose(fp);return tem;/-查找学号-STU *Search_num(STU *head,int number) if (head=NULL) return NULL;while(head-num!=number)/跳过不符合条件的学号if (head-next=NULL)return NULL; head=head-next;return head;/返回的指针名为head/-插入链表-STU*InsertList(STU*head)STU*p1,*p2,*stu;p1=p2=head;stu=(
9、STU*)malloc(sizeof(STU);/待插入的结点printf(n请输入要插入的学生信息n);stu=Input();if(head=NULL)/头结点为空head=stu;stu-next=NULL;elsewhile(p1-numnum&p1-next!=NULL)/跳过不符合的结点p2=p1;p1=p2-next;if(p1-numstu-num)if(p1=head)/插最前面stu-next=head;head=stu;elsestu-next=p1;p2-next=stu;elsep1-next=stu;/插最后面stu-next=NULL;return head;/-
10、学号删除-STU *Delete_num (STU *head,int number) STU *p1,*p2; if ( head=NULL) /头结点为空return NULL; p1=head;while(p1-num!=number)/跳过不符合的点if (p1-next=NULL) return NULL;p2=p1;p1=p1-next;if (p1=head) /删除学号是第一个的情况head=p1-next;elsep2-next=p1-next; free(p1);return head;/-查找专业课程成绩-STU *Search_major_subject_score(S
11、TU *head,char *major,int number,int score)if (head=NULL)return NULL;while(head!=NULL)if (strcmp(major,head-major)=0) & head-scorenumbernext;return head;/-删除专业课程成绩-STU *Delete_major_subject(STU *head,char *major,int number,int score) STU *p=NULL;p=Search_major_subject_score(head,major,number,score);/
12、先查找if (p=NULL)return p;else p=Delete_num(head,p-num);/再删除return p;/-主函数-void main () STU *Head = NULL;int id,num,sco;char filename10;STU *p = NULL;STU stu;while(1) printf(*n); printf(* 欢迎使用学生成绩管理系统 *n); printf(*n);printf(1-建立有序的链表 2-信息存盘n);printf(3-从文件中随机读取某个学生的信息 4-查找学号学生,返回该学生结点指针n); printf(5-输入一个
13、学生信息插入相应位置 6-从链表中删除指定学号的学生n);printf(7-查找某专业某课程成绩小于某分数的学生,返回指向该学生结点的指针n);printf(8-删除某个专业的、某门课程的成绩小于某个分数的学生n);printf(9-将学生信息表格化输出nn);printf(*输入相应编号运行系统*n);scanf( %d,&id);if(id9)break;switch (id)case 1:printf(请输入学生数:);scanf( %d,&num);Head = CreateList(num);break;case 2:if (Head=NULL)printf(链表未建立!n);bre
14、ak;getchar();Save(Head);break;case 3:printf(n请问要读取第几位学生信息n);scanf(%d,&id);getchar();stu=Fetch(id);printf(学号t姓名t专业 t班级t成绩0t成绩1t成绩2tn);Output(&stu);break;case 4:if (Head=NULL)printf(链表未建立!n);break;printf(请输入要查找的学生的学号:);scanf( %d,&num);p = Search_num(Head,num);if (p=NULL)printf(查找失败!n);elseprintf(学号t姓名
15、t专业 t班级t成绩0t成绩1t成绩2tn);Output(p);break;case 5:Head=InsertList(Head);break;case 6:if ( Head = NULL)printf(链表未建立!n);break;printf(请输入要删除的学生的学号:);scanf( %d,&num);p = Delete_num(Head,num);if ( p=NULL)printf(删除成员失败!n);else Head = p;break;case 7:if (Head=NULL)printf(链表未建立!n);break;printf(请输入学生的专业:);scanf(%
16、s,filename);printf(请输入成绩序号(0 = n =2):);scanf( %d,&num);if (num2)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成绩0t成绩1t成绩2tn);Output(p);break;case 8:if (Head=NULL)printf(链表未建立!n);break;pri
17、ntf(请输入学生的专业:);scanf(%s,filename);printf(请输入成绩序号(0 = n =2):);scanf( %d,&num);if (num 2)printf(成绩序号输入错误);break;printf(请输入分数:);scanf( %d,&sco);p=Delete_major_subject(Head,filename,num,sco);if (p=NULL)printf(删除失败n);elseHead = p;break;case 9:if (Head=NULL)printf(链表未建立!n);break;print(Head);break;default:break;五、程序测试(输入、输出的截图及文件的内容)六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空话、套话,雷同扣分)专心-专注-专业