学生信息系统 链表 排序学生系统数据结构C程序.docx
《学生信息系统 链表 排序学生系统数据结构C程序.docx》由会员分享,可在线阅读,更多相关《学生信息系统 链表 排序学生系统数据结构C程序.docx(22页珍藏版)》请在冰点文库上搜索。
![学生信息系统 链表 排序学生系统数据结构C程序.docx](https://file1.bingdoc.com/fileroot1/2023-6/1/8f691d15-46d6-46fd-bac4-80ce5dfdc4c2/8f691d15-46d6-46fd-bac4-80ce5dfdc4c21.gif)
学生信息系统链表排序学生系统数据结构C程序
内蒙古工业大学信息工程学院
实验报告
课程名称:
数据结构(C语言版)
实验名称:
线性表的创建和访问算法设计
实验类型:
验证性□综合性□设计性□
实验室名
班级:
学号:
姓名:
组别:
同组人:
成绩:
实验日期:
2011年5月16日
预习报告成绩:
指导教师审核(签名):
2011年5月16日
预习报告
(一)实验目的
数据结构于算法实验是计算机类本科学生计算机软件知识重要的实验环节,它将使学生从实践上学会用高级语言程序设计、实现复杂的数据结构,为大型软件设计奠定基础。
本实验以某种线性表的创建和访问算法设计作为实验内容,举一反三,全面、深刻掌握线性结构的实现方法,培养解决问题的能力。
(二)实验内容
1、编写生成线性表的函数,线性表的元素从键盘输入;
2、编写在线性表中插入元素的函数;
3、编写在线性表中删除元素的函数;
4、编写输出线性表的函数;
5、编写主函数,调用以上各函数,以便能观察出原线性表以及作了插入或删除后线性表的屏幕输出。
(三)实验要求
1、掌握线性结构的机器内表示;
2、掌握线性结构之上的算法设计和实现;
3、列表对比分析两种数据结构的相应操作的时间复杂度、空间复杂度,阐明产生差异的原因。
(四)问题描述
有一班学生上体育课排队,构成了一个单链表,链表的结点存储了学生的学号、姓名。
(五)基本要求
(1)从键盘输入学生的信息,建立学生链表。
(2)从键盘输入学生的信息,实现学生查询操作。
(3)从键盘输入学生的学号值,将学号为x的学生和其右边的学生进行交换。
(注:
不允许将链表中数据域的值进行交换)
(六)实验设计思路
实验实现9个功能,先在主函数main()设计声明每个函数,然后依次对每个函数细化,逐步调试,直到达到该函数的预期功能,即采用自顶向下,逐步细化的设计思路。
该实验全部采用单链表,设计一个学生信息系统,通过该系统一次可以完成:
1.创建学生系统2.学生系统排序3.删除学生信息4.增加学生信息5.查找学生信息6.清除学生信息7.修改学生信息8.模式查找信息9.退出学生系统等功能。
实验报告成绩:
指导教师审核(签名):
2011年5月16日
(一)部分算法流程图
1删除学生信息
2学生信息模式查找
3选择排序
(二)函数算法
函数算法具体见程序代码。
(三)调试程序出现的问题及解决的方法
编程中出现很多的编译错误,我主要采用对每个函数调试,设断点,不会的问同学,链表的选择排序,在网上搜索,运用自己的程序中,让我更好的掌握了选择排序法。
(四)实验心得体会
通过这次试验,让我更好的掌握了链表的使用,用链表解决实际问题,用模块化程序设计思路,对每个函数细化,调试,使得整个程序正确运行,达到预期结果。
(五)程序清单
//学生系统.cpp:
定义控制台使用程序的入口点。
//
#include
#include
#include
#definelen20
#defineNULL0
structstudent
{
charname[len];
charnumber[len];
};
structstdnode
{
studentdata;
stdnode*next;
};
voidcreatestd(stdnode*std)//创建学生系统
{
inti=0;charch;
do{
std->next=(stdnode*)malloc(sizeof(stdnode));
std=std->next;
printf("\t输入学生的学号和姓名:
\n\t");
scanf("%s",&std->data.number);
printf("\t");
scanf("%s",&std->data.name);
getchar();
printf("\t继续创建学生信息吗?
Y.继续N.退出\n\t");
scanf("%c",&ch);
}while(ch=='Y');
std->next=NULL;
}
voidinputstd(stdnode*std)
{
stdnode*p;
p=std->next;
if(p==NULL)printf("\t没有学生信息!
\n");
printf("\t现有学生信息如下表:
\n");
if(p!
=NULL)printf("\t╔═════╤══════╗\n");
while(p!
=NULL)
{
printf("\t║%10s│%11s║\n",p->data.number,p->data.name);
p=p->next;
if(p!
=NULL)printf("\t╟─────┼──────╢\n");
}
if(std->next!
=NULL)printf("\t╚═════╧══════╝\n");
printf("\n");
}
voidsortstd(stdnode*std)//学生系统排序
{
charch;
stdnode*pi,*pj,*pipre,*pjpre,*ptem,*pmin,*pminpre;
printf("\t选择排序方式:
A.姓名B.学号\n\t");//按升序排列用选择排序法
getchar();
scanf("%c",&ch);
if(std->next==NULL){printf("\t没有学生信息!
\n");exit(0);}
if(ch=='A')
{
pipre=std;
for(pi=std->next;pi->next!
=NULL;pi=pi->next)
{
pmin=pi;
for(pj=pi->next,pminpre=pi;pj!
=NULL;pminpre=pminpre->next,pj=pj->next)
{
if(strcmp(pmin->data.name,pj->data.name)>0)
{
pmin=pj;
pjpre=pminpre;
}
}
if(pmin->next==NULL)
{
pipre->next=pmin;
pmin->next=pi->next;
pjpre->next=pi;
pi->next=NULL;
}
else
if(pmin!
=pi)
{
pipre->next=pmin;
pjpre->next=pi;
ptem=pmin->next;
pmin->next=pi->next;
pi->next=ptem;
}
pi=pipre->next;
pipre=pipre->next;
}
}
if(ch=='B')
{
pipre=std;
for(pi=std->next;pi->next!
=NULL;pi=pi->next)
{
pmin=pi;
for(pj=pi->next,pminpre=pi;pj!
=NULL;pminpre=pminpre->next,pj=pj->next)
{
if(strcmp(pmin->data.number,pj->data.number)>0)
{
pmin=pj;
pjpre=pminpre;
}
}
if(pmin->next==NULL)
{
pipre->next=pmin;
pmin->next=pi->next;
pjpre->next=pi;
pi->next=NULL;
}
else
if(pmin!
=pi)
{
pipre->next=pmin;
pjpre->next=pi;
ptem=pmin->next;
pmin->next=pi->next;
pi->next=ptem;
}
pi=pipre->next;
pipre=pipre->next;
}
}
}
voiddeletestd(stdnode*std)//删除学生信息
{
stdnode*p,*pre=std;
intflag=1;
charch,choice[len];
p=std->next;
printf("\t选择删除方式:
A:
姓名B:
学号\n\t");
getchar();
scanf("%c",&ch);
if(ch=='A')
{
printf("\t输入删除学生的姓名:
\n\t");
scanf("%s",choice);
if(p==NULL)printf("\t没有学生信息!
\n");
while(p!
=NULL)
{
if(strcmp(p->data.name,choice)==0)
{
pre->next=p->next;
free(p);
flag=0;
printf("\t删除成功!
\n");
break;
}
pre=p;
p=p->next;
}
if(flag)printf("\t没有该学生!
\n");
}
elseif(ch=='B')
{
printf("\t输入删除学生的学号:
\n\t");
scanf("%s",choice);
if(p==NULL)printf("\t没有学生信息!
\n");
while(p!
=NULL)
{
if(strcmp(p->data.number,choice)==0)
{
pre->next=p->next;
free(p);
flag=0;
printf("\t删除成功!
\n");
break;
}
pre=p;
p=p->next;
}
if(flag)printf("\t没有该学生,请重新输入!
\n");
}
}
voidincreasestd(stdnode*std)//增加学生信息
{
stdnode*p,*p1;
p=std->next;
p1=(stdnode*)malloc(sizeof(stdnode));
printf("\t输入增加学生的学号和姓名:
\n\t");
scanf("%s",&p1->data.number);
printf("\t");
scanf("%s",&p1->data.name);
std->next=p1;
p1->next=p;
printf("\t信息添加成功!
\n");
}
voidseekstd(stdnode*std)//查找学生信息
{
stdnode*p;
charcho[len],ch;
intflag=1;
p=std->next;
if(p==NULL)printf("\t没有学生信息!
\n");
printf("\t选择查找方式:
A.名字B.学号\n\t");
getchar();
scanf("%c",&ch);
if(ch=='A')
{
printf("\t请输入姓名:
\n\t");
scanf("%s",cho);
while(p!
=NULL)
{
if(strcmp(p->data.name,cho)==0)
{
printf("\t学生的信息如下:
\n");
printf("\t姓名:
%s学号:
%s\n",p->data.name,p->data.number);
flag=0;
}
p=p->next;
}
if(flag)printf("\t没有该学生,请重新查找!
\n");
}
elseif(ch=='B')
{
printf("\t请输入学号:
\n\t");
scanf("%s",cho);
while(p!
=NULL)
{
if(strcmp(p->data.number,cho)==0)
{
printf("\t学生的信息如下:
\n");
printf("\t学号:
%s姓名:
%s\n",p->data.number,p->data.name);
flag=0;
}
p=p->next;
}
if(flag)printf("\t没有该学生,请重新查找!
\n");
}
}
voidclearstd(stdnode*std)//清空全部信息
{
stdnode*p;
p=std->next;
while(p!
=NULL)
{
std->next=p->next;
p=p->next;
}
printf("\t全部信息清空!
\n");
}
voidchangestd(stdnode*std)//修改学生信息
{
charch,seek[len];
stdnode*p;
intflag=1;
p=std->next;
if(p==NULL)printf("\t没有学生信息!
\n");
printf("\t选择修改方式:
A.名字B.学号\n\t");
getchar();
scanf("%c",&ch);
if(ch=='A')
{
printf("\t输入要修改学生的姓名:
\n\t");
scanf("%s",seek);
while(p!
=NULL)
{
if(strcmp(p->data.name,seek)==0)
{
printf("\t输入修改后学生的姓名:
\n\t");
scanf("%s",&p->data.name);
flag=0;break;
}
p=p->next;
}
if(flag==0)printf("\t学生信息修改成功!
\n");
}
elseif(ch=='B')
{
printf("\t输入要修改学生的学号:
\n\t");
scanf("%s",seek);
while(p!
=NULL)
{
if(strcmp(p->data.name,seek)==0)
{
printf("\t输入修改后学生的学号:
\n\t");
scanf("%s",&p->data.number);
flag=0;break;
}
p=p->next;
}
if(flag==0)printf("\t学生信息修改成功!
\n");
}
}
voidindex(stdnode*std)//模式查找信息
{
stdnode*p;
charseek[len],ch;
intnamelen,seeklen,i,j,flag=1;
p=std->next;
printf("\t选择匹配查找的方式:
A.名字B.学号\n\t");
getchar();
scanf("%c",&ch);
if(ch=='A')
{
printf("\t输入姓名匹配字母:
\n\t");
scanf("%s",seek);
seeklen=strlen(seek);
while(p!
=NULL)
{
i=j=0;
namelen=strlen(p->data.name);
while(i{
if(p->data.name[i]==seek[j]){i++;j++;}
else
{
i=i-j+1;j=0;
}
}
if(j>=seeklen)
{
printf("\t学生的信息如下:
\n");
printf("\t姓名:
%s学号:
%s\n",p->data.name,p->data.number);
flag=0;
}
p=p->next;
}
if(flag)printf("\t没有该学生,请重新查找!
\n");
}
if(ch=='B')
{
printf("\t输入学号匹配的数字:
\n\t");
scanf("%s",seek);
seeklen=strlen(seek);
while(p!
=NULL)
{
i=j=0;
namelen=strlen(p->data.number);
while(i{
if(p->data.number[i]==seek[j]){i++;j++;}
else
{
i=i-j+1;j=0;
}
}
if(j>=seeklen)
{
printf("\t学生的信息如下:
\n");
printf("\t学号:
%s姓名:
%s\n",p->data.number,p->data.name);
flag=0;
}
p=p->next;
}
if(flag)printf("\t没有该学生,请重新查找!
\n");
}
}
intmain()
{
intch;
stdnodestd;
do
{
printf("┌————————————————───——————————————————─┐\n");
printf("│┈┈┈☆☆欢迎使用学生信息系统☆☆┈┈┈│\n");
printf("│请选择下面操作│\n");
printf("│1.创建学生系统2.学生系统排序3.删除学生信息│\n");
printf("│4.增加学生信息5.查找学生信息6.清除学生信息│\n");
printf("│7.修改学生信息8.模式查找信息9.退出学生系统│\n");
printf("└—————————————————————————————————————─┘\n\t");
scanf("%d",&ch);
switch(ch)
{
case1:
createstd(&std);inputstd(&std);
break;
case2:
sortstd(&std);inputstd(&std);break;
case3:
deletestd(&std);inputstd(&std);break;
case4:
increasestd(&std);inputstd(&std);break;
case5:
seekstd(&std);break;
case6:
clearstd(&std);break;
case7:
changestd(&std);inputstd(&std);break;
case8:
index(&std);break;
case9:
printf("┈┈┈┈┈┈┈┈┈☆☆欢迎下次使用学生信息系统☆☆┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf("\n");break;
}
}while(ch!
=9);
return0;
}
(六)测试结果
创建学生系统
学生系统排序
模式匹配查找
增加学生信息
实验结果和实验预期结果相符,符合实验要求。