基于链表的学生信息管理系统实验报告.docx
《基于链表的学生信息管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《基于链表的学生信息管理系统实验报告.docx(17页珍藏版)》请在冰点文库上搜索。
![基于链表的学生信息管理系统实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/7e685efa-b195-4b1b-bc50-17a997bc033c/7e685efa-b195-4b1b-bc50-17a997bc033c1.gif)
基于链表的学生信息管理系统实验报告
《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->numnum&&p1->next!
=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;
}
}
}
}
五、程序测试(输入、输出的截图及文件的内容)
六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空话、套话,雷同扣分)