基于链表的学生信息管理系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《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<>
struct student
{
int num;//学号
char name[15];//姓名
char major[10];//专业(computer,software,network)int classNo;//班级(1-2)
int score[3];//3门课的成绩(0-2)
struct student *next;
};
typedef struct student 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->score[0]);
printf("请输入学生的成绩1:");
scanf("%d",&p->score[1]);
printf("请输入学生的成绩2:");
scanf("%d",&p->score[2]);
return p;
}
//--------------------------------建立链表------------------------------ STU*CreateList(int n)
{
struct student*head,*p,*w;
int i=0;
printf("\n请输入第%d个学生信息\n",n);
p=Input();
while(i<n)
{
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;
}
}
return head;
}
//-------------------------------输出------------------------------
void Output(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]);
}
//-------------------------------输出所有---------------------------
void print(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;
}
}
//--------------------------------储存--------------------------------
void Save(STU*p)
{
FILE*fp;
char filename[20];
printf("\n请输入保存文件名:\n");
gets(filename);
if((fp=fopen(filename,"wb"))==NULL)
{
printf("cannot open file\n");
return;
}
if(p==NULL)
printf("链表为空");
while(p!=NULL)
{
if((fwrite(p,sizeof(STU),1,fp))!=1)
printf("\nwrite file error\n");
p=p->next;
}
fclose(fp);
}
//----------------------------------文件查找--------------------------------- STU Fetch(int n)
{
FILE*fp;
struct student tem;
char filename[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);
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=(STU*)malloc(sizeof(STU));//待插入的结点
printf("\n请输入要插入的学生信息\n");
stu=Input();
if(head==NULL)//头结点为空
{
head=stu;
stu->next=NULL;
}
else
{
while(p1->num<stu->num&&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;
}
}
return head;
}
//---------------------------------------学号删除-----------------------------
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;
else
p2->next=p1->next;
free(p1);
return head;
}
//-------------------------------------查找专业课程成绩------------------------------------ STU *Search_major_subject_score(STU *head,char *major,int number,int score) {
if (head==NULL)
return NULL;
while(head!=NULL)
if ((strcmp(major,head->major)==0) && head->score[number]<score)
break;
else
head=head->next;
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);//先查找
if (p==NULL)
return p;
else
p=Delete_num(head,p->num);//再删除
return p;
}
//---------------------------------------------主函数------------------------------------------
void main ()
{
STU *Head = NULL;
int id,num,sco;
char filename[10];
STU *p = NULL;
STU stu;
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)
{
case 1:
{
printf("请输入学生数:");
scanf(" %d",&num);
Head = CreateList(num);
break;
}
case 2:
{
if (Head==NULL)
{
printf("链表未建立!\n");
break;
}
getchar();
Save(Head);
break;
}
case 3:
{
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;
}
case 4:
{
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;
}
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("%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;
}
case 8:
{
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;
}
case 9:
{
if (Head==NULL)
{
printf("链表未建立!\n");
break;
}
print(Head);
break;
}
default:
{
break;
}
}
}
}
五、程序测试(输入、输出的截图及文件的内容)
六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空话、套话,雷同扣分)。