基于链表的学生信息管理系统实验报告Word文件下载.docx
《基于链表的学生信息管理系统实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于链表的学生信息管理系统实验报告Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。
(8)定义函数Delete_num:
从链表中删除指定学号的学生。
(9)定义函数Search_major_subject_score:
查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。
(10)定义函数Delete_major_subject:
从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。
三、算法流程图
四、程序清单(关键语句和变量加注释)
#include<
stdio.h>
//预编译命令
stdlib.h>
string.h>
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("
请输入学生的姓名:
%s"
p->
name);
请输入学生的专业:
scanf("
major);
请输入学生的班级:
classNo);
请输入学生的成绩0:
score[0]);
请输入学生的成绩1:
score[1]);
请输入学生的成绩2:
score[2]);
}
//--------------------------------建立链表------------------------------
STU*CreateList(intn)
structstudent*head,*p,*w;
inti=0;
\n请输入第%d个学生信息\n"
n);
p=Input();
while(i<
n)
{
i++;
if(i==1)
{
head=p;
//头结点有值
p->
next=NULL;
}
else
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"
num,p->
name,p->
major,p->
classNo,p->
score[0],p->
score[1],p->
}
//-------------------------------输出所有---------------------------
voidprint(STU*head)
p=head;
if(head!
=NULL)
学号\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];
\n请输入保存文件名:
gets(filename);
if((fp=fopen(filename,"
wb"
))==NULL)
cannotopenfile\n"
return;
if(p==NULL)
链表为空"
if((fwrite(p,sizeof(STU),1,fp))!
=1)
\nwritefileerror\n"
p=p->
fclose(fp);
//----------------------------------文件查找---------------------------------
STUFetch(intn)
structstudenttem;
\n请输入打开文件名:
fp=fopen(filename,"
rb"
fseek(fp,(long)(n*sizeof(STU)),0);
fread(&
tem,sizeof(STU),1,fp);
//读取
returntem;
//-----------------------------------查找学号-------------------------------
STU*Search_num(STU*head,intnumber)
if(head==NULL)
returnNULL;
while(head->
num!
=number)//跳过不符合条件的学号
if(head->
next==NULL)
returnNULL;
head=head->
//返回的指针名为head
//---------------------------------插入链表---------------------------------------
STU*InsertList(STU*head)
STU*p1,*p2,*stu;
p1=p2=head;
stu=(STU*)malloc(sizeof(STU));
//待插入的结点
\n请输入要插入的学生信息\n"
stu=Input();
if(head==NULL)//头结点为空
head=stu;
stu->
else
while(p1->
num<
stu->
num&
&
p1->
next!
=NULL)//跳过不符合的结点
{
p2=p1;
p1=p2->
if(p1->
num>
num)
if(p1==head)//插最前面
{
stu->
next=head;
head=stu;
}
else
next=p1;
p2->
next=stu;
p1->
//插最后面
//---------------------------------------学号删除-----------------------------
STU*Delete_num(STU*head,intnumber)
STU*p1,*p2;
if(head==NULL)//头结点为空
returnNULL;
p1=head;
while(p1->
=number)//跳过不符合的点
if(p1->
next==NULL)
p2=p1;
p1=p1->
if(p1==head)//删除学号是第一个的情况
head=p1->
else
p2->
next=p1->
free(p1);
//-------------------------------------查找专业课程成绩------------------------------------
STU*Search_major_subject_score(STU*head,char*major,intnumber,intscore)
if(head==NULL)
while(head!
if((strcmp(major,head->
major)==0)&
head->
score[number]<
score)
break;
else
head=head->
//--------------------------------------删除专业课程成绩--------------------------------------
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;
p=Delete_num(head,p->
//再删除
//---------------------------------------------主函数------------------------------------------
voidmain()
{
STU*Head=NULL;
intid,num,sco;
charfilename[10];
STU*p=NULL;
STUstu;
while
(1)
***********************************************************************\n"
*欢迎使用学生成绩管理系统*\n"
1-建立有序的链表2-信息存盘\n"
3-从文件中随机读取某个学生的信息4-查找学号学生,返回该学生结点指针\n"
5-输入一个学生信息插入相应位置6-从链表中删除指定学号的学生\n"
7-查找某专业某课程成绩小于某分数的学生,返回指向该学生结点的指针\n"
8-删除某个专业的、某门课程的成绩小于某个分数的学生\n"
9-将学生信息表格化输出\n\n"
**********************输入相应编号运行系统*****************************\n"
%d"
id);
if((id<
1)||(id>
9))
break;
switch(id)
case1:
请输入学生数:
Head=CreateList(num);
case2:
if(Head==NULL)
printf("
链表未建立!
getchar();
Save(Head);
case3:
\n请问要读取第几位学生信息\n"
scanf("
getchar();
stu=Fetch(id);
Output(&
stu);
case4:
请输入要查找的学生的学号:
p=Search_num(Head,num);
if(p==NULL)
查找失败!
{printf("
Output(p);
case5:
Head=InsertList(Head);
case6:
if(Head==NULL)
请输入要删除的学生的学号:
p=Delete_num(Head,num);
if(p==NULL)
删除成员失败!
elseHead=p;
case7:
请输入学生的专业:
filename);
请输入成绩序号(0<
=n<
=2):
if(num<
0||num>
2)
成绩序号输入错误"
请输入分数:
sco);
p=Search_major_subject_score(Head,filename,num,sco);
if(p==NULL)
查找失败\n"
{printf("
Output(p);
case8:
if(num<
0||num>
2)
p=Delete_major_subject(Head,filename,num,sco);
删除失败\n"
Head=p;
case9:
print(Head);
default:
五、程序测试(输入、输出的截图及文件的内容)
六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空话、套话,雷同扣分)