数据结构实验报告链表.docx
《数据结构实验报告链表.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告链表.docx(11页珍藏版)》请在冰点文库上搜索。
数据结构实验报告链表
院系:
计算机学院
实验课程:
数据结构实验
实验项目:
实验二利用链表实现学生健康系统
指导老师:
开课时间:
专业:
计算机类
班级:
学生:
学号:
实验二利用链表实现学生健康系统
1.综设实验题目
利用链表实现学生健康系统
2.中文摘要
本实验是利用链表这一经典的数据结构来实现一个学生健康系统,从而学生的健康信息和相应的个人信息可以很方便地通过这个系统进行增、删、查、改等操作。
3.关键词
链表健康系统C++
4.前言
实验目的:
想要通过链表这一数据结构来实现学生健康情况管理的几个操作功能。
实验意义:
方便相关人员对学生健康信息的管理和操作。
实验内容:
主要是新建学生健康系统、插入学生的数据、删除学生的数据、从文件读取学生健康数据、将学生的健康等信息写入到文件、查询指定学生的相关信息、在屏幕上输出学生相关信息等功能。
健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
5.实验设计
由于该实验主要涉及到链表这一存储结构,因此整个实验的关键点便在于对链表这个数据结构的建立和操作上。
常见的链表的操作有:
建立链表、往链表中插入数据、从链表中删除数据、查找链表中的元素、修改链表中的元素、销毁链表。
由此,经过对问题的仔细分析之后,发现我们所要实现的健康系统的增、删、查、改等功能与链表这一数据结构的关系是:
增加学生数据相当于往链表中的插入数据的操作;
删除学生数据相当于从链表中的删除数据的操作;
查找学生数据相当于链表中的查找元素的操作;
修改学生数据相当于链表中的修改元素的操作;
因此,我们可以直接用链表来存储所有学生的信息,每一个学生的信息集就是链表中的一个节点,这样,就使得我们的健康系统的问题归约到了链表的实现问题上了。
在这个链表的设计上,每一个节点包含有相应学生的所有信息和一个指向下一个节点的指针,学生的信息包括:
学号、姓名、出生日期、性别和健康信息,分别采用C++中的string,string,int,bool和string类型来表示。
这样的好处是学号可以很长,便于存储和表示,即使某些学校需要用到既有数字又有字母的学号也可以正常运行。
由于出生日期不会超过8位,所以直接采用int类型即可,这样可以减少程序的占用,int的占用要小于string,也提高了效率。
性别只有男女两种,所以采用bool这种二值变量来存储可以节省存储空间,其中,当sex==true时,表示此人为女性,当sex==false时,表示此人为男性,健康信息为string类型可以保证用户可以填写任意的健康信息进来。
6.实验实现
主要功能模块有:
新建学生健康表、向学生健康表插入学生信息、在健康表删除学生信息、从文件中读取健康表信息、向文件写入学生健康表信息、在健康表中查询学生信息(按学生学号来进行查找)、在屏幕中输出全部学生信息、退出。
新建学生健康表就是健康系统的构造函数,代码如下:
healthOS:
:
healthOS(){
this->table=NULL;
cout<<"Thisisahealthinformationmanagesystemforstudents"<cout<<"Pleasechoosetheactionyouwanttoperform:
"<cout<<"0:
loadalocaldatabase;"<cout<<"1:
insertastudentintothedatabase;"<cout<<"2:
deleteastudentfromthedatabase;"<cout<<"3:
searchastudentinthedatabase;"<cout<<"4:
printalltheinformationinthedatabase;"<cout<<"5:
savethechange;"<cout<<"6:
exit."<cout<<"------------------------------------"<}
构造函数初始化后,健康表就建立完成了,此时健康表中是没有学生数据的,等待用户的进一步操作。
向学生健康表插入学生信息是insert函数,代码如下:
voidhealthOS:
:
insert(string_ID,string_name,int_birthday,bool_sex,string_health){
student*temp=this->table;
table=newstudent(_ID,_name,_birthday,_sex,_health,temp);
return;
}
Insert即在链表中新建一个节点,并将参数中的学生信息作为结点的构造函数的参数传递进去,即新建的节点就包含了该学生的信息。
在健康表删除学生信息是del函数,代码如下:
voidhealthOS:
:
del(stringID){
student*temp=this->table,*last=NULL,*next_tmp=NULL;
while(temp!
=NULL){
if(temp->ID==ID){
if(last==NULL)
table=temp->next;
else
last->next=next_tmp;
deletetemp;
}
last=temp;
temp=temp->next;
next_tmp=temp->next;
}
return;
}
del函数是删除指定学号的学生,删除方法即在链表中查找学号为指定学号的节点,再将其删除。
从文件中读取健康表信息是load函数,代码如下:
voidhealthOS:
:
load(){
//getalistoffiles
DIR*d=opendir(".//data");
dirent*p=readdir(d);
charfiles[1000][260];
intcount=0;
while(p!
=NULL){
strcpy(files[count],p->d_name);
++count;
p=readdir(d);
}
closedir(d);
//nofiles
if(count<3){
cout<<"Nolocaldata!
"<return;
}
//choosealocaldata
intchosen;
cout<<"Pleasechoosealocaldatabase,orenter0tocanceltheaction:
"<for(inti=2;icout<
"<cin>>chosen;
if(cin.fail())throw0;
if(chosen>=count||chosen<0)throw1;
if(!
chosen)return;
//readthelocaldata
charpath[20]=".//data//";
strcat(path,files[chosen]);
fstreamf;
f.open(path);
studenttemp;
while(f>>(temp.ID)){
f>>temp.name>>temp.birthday>>temp.sex>>temp.health;
insert(temp.ID,temp.name,temp.birthday,temp.sex,temp.health);
}
f.close();
return;
}
该函数会先显示data目录下的所有文件,这些文件都是已保存的学生健康表数据,用户再选择要打开的健康表数据,选择方式是输入屏幕上文件所对应的编号并回车确定。
数据文件中每一行都代表着一个学生的信息。
所以在用户选择某个文件后,系统再从这个文件中一行一行地读出来,每读一行数据,就调用insert函数将该学生插入到系统的学生健康表中,这样,当全部内容都读完后,所有学生就都被读取到表中了。
向文件写入学生健康表信息是save函数,代码如下:
voidhealthOS:
:
save(){
cout<<"Pleaseinputthenameofthefile:
"<chartemp[20];
scanf("%s",temp);
charpath[15]=".//data//";
strcat(path,temp);
ofstreamf(path);
student*tmp=table;
while(tmp!
=NULL){
f<ID<<''<name<<''<birthday<<''<sex<<''<health<tmp=tmp->next;
}
f.close();
return;
}
功能与load相反,调用该函数后,会要求用户输入要保存的文件名,获取文件名后就新建并打开该文件,按顺序将表中的每一个学生的信息写入到文件中,一行写一个学生的信息,然后关闭文件。
在健康表中查询学生信息(按学生学号来进行查找)是search函数,代码如下:
student*healthOS:
:
searchByID(stringID){
student*temp=this->table;
while(temp!
=NULL){
if(temp->ID==ID)
returntemp;
temp=temp->next;
}
returnNULL;
}
查找的方式是顺序查找,从健康表的表头开始,按顺序一个一个进行检查,直到找到学号为要查找的学生的学号,就将给节点的地址返回,如果找到表尾了还没找到这个学生,就返回空指针。
在屏幕中输出全部学生信息是printAll函数,代码如下:
voidhealthOS:
:
outputAll(){
student*temp=this->table;
while(temp!
=NULL){
print(temp);
cout<temp=temp->next;
}
return;
}
voidhealthOS:
:
print(student*stu){
cout<<"ID:
"<ID<cout<<"Name:
"<name<cout<<"Birthday:
"<birthday<cout<<"Sex:
";
if(stu->sex)
cout<<"Female"<else
cout<<"Male"<cout<<"Healthinformation:
"<health<return;
}
printAll函数调用了函数print,print是打印一个学生的信息,根据传进来的学生节点的地址来找到这些信息,而printAll是按顺序访问链表,从表头开始,对每个节点都执行一次print操作,这样,就可以将所有学生的信息按顺序打印出来了。
软硬件平台:
开发软件的平台是gcc和make,即GNU套装,系统环境可以是windows也可以是linux,只需在对应系统通过make命令即可编译出相应系统下的可执行文件。
硬件平台没有特别的要求,i386、i686甚至是arm架构下均可正常运行,同样的,还是在对应系统使用make命令来完成对应系统下的编译。
7.结果及结果分析
结果如下:
程序正常运行,各个功能经过测试,都能正常完成相应的操作。
说明这个链表能正确完成链表结构所要求的功能,而健康管理信息也实现了实验的要求的功能。
8.参考文献
【1】《C++Primer》StanleyB.Lippman,JoséeLajoie,BarbaraE.Moo,2013,Addison-WesleyProfessional
【2】《TheGUNMakeBook》JohnGraham-Cumming,2015,NoStarchPress
【3】《Algorithm》RobertSedgewickandKevinWayne,2015,PrincetonUniversity
【4】《IntroductiontoAlgorithm》ThomasH.Cormen,CharlesE.Leiserson,RonaldL.Rivest,andCliffordStein,1990,MITPress