数据结构单链表实现班级通讯录实验报告.docx
- 文档编号:3200720
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:26
- 大小:596.80KB
数据结构单链表实现班级通讯录实验报告.docx
《数据结构单链表实现班级通讯录实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构单链表实现班级通讯录实验报告.docx(26页珍藏版)》请在冰点文库上搜索。
数据结构单链表实现班级通讯录实验报告
哈尔滨师范大学
数据结构课程设计报告
设计题目通讯录管理系统
设计地点A区三号实验楼405室
起止时间2010年8月25日至2010年9月30日
指导教师李英梅
所在系(部)计算机科学与技术系
班级计算机08专升本班
学生姓名及学号
2010097361杨善明
2010097361赵峰
2010097361钟明强
2010年9月13日
具体任务
随着当今社会的发展,人们的人际关系交往不断增多,在不同的时间,不同的地点处理不同的事情,有时却很难搞清楚每个同学之间的联系方式,尤其是对经常旷课的学生来说,更是难以联系,遇到紧要的事情时,却联系不上本人,所以通讯录能够便捷的给我们带来所需要的相关信息。
随着计算机的普及,人们的生活摆脱了传统式的记事本、电话簿,越来越多的靠计算机来帮助人们记住这些事情,使我们的生活变得简便。
那么,这就需要有一个通讯录管理系统,教师可以方便的通过自己电脑的通讯录管理系统,随时来查阅自己所需要的信息,而不必大费周折去翻开那些繁琐的记事本。
班级通讯录管理系统是一个专门针对存储学生联系方式以及一些简单个人信息的实用管理系统,它方便了教师对众多学生信息的存储和快速查阅的功能,大大减少了查找过程的时间。
班级通讯录管理系统主要功能分为四个模块:
添加学生信息、查询学生信息、删除学生信息、查看全部学生信息
添加学生信息:
录入学生的基本信息如学号,姓名,性别,出生年,月,日,联系地址,电话,QQ 等。
如果任何信息输入错误会有提示相应提示,并要注重新输入,直到输入正确。
全部信息输入完毕后会提示“该生已输入完毕,是否继续输入(y/n)”。
查询学生信息:
可对系统中已录入的信息进行查询,如要查询的学号为123的信息,这时会直接列出学号为123学生的全部信息。
如果学号输入不符合要求,系统会要求重新输入,然后列出学号正确的学生信息。
或者学号输入符合规定,也在系统中没有该学号的学生,也会给出相应的提示“您输入的学号不存在!
”。
删除学生信息:
可对系统中已存在的信息按学号进行删除。
如果学号输入不符合要求,系统会要求重新输入,输入正确后,系统会列出该学号正确的学生信息,并将该记录删除,给出相应提示“删除成功!
”。
或者学号输入符合规定,也在系统中没有该学号的学生,也会给出相应的提示“无此学号!
”。
查看全部学生信息:
选择此项功能会将系统中全部学生记录以列表形式打印到屏幕上。
方便操作的查看。
概要设计
2.1单链表结构
变量名
数据类型
描述
num
int
学号
name
char
姓名
sex
Int
性别
year
Int
年
month
Int
月
day
Int
日
address
char
联系地址
tell
char
电话
int
2.2系统结构图
详细设计
3.1单链表的编写
开发项目时,以单链表的形式来组织、封装一些常用的方法,以便提高代码的重用率,大大方便了代码的管理。
本系统创建了一个单链表:
list。
主要用来定义学生基本信息。
3.2定义单链表的程序
typedefstructlist
{
intyear,month,day,qq,num,sex;
chartel[20];
charname[10];
charaddress[100];
structlist*next;
}node,*link;
3.3操作函数的定义
3.3.1菜单输出函数voiddisplay()
3.3.2结果输入函数voidprint()
3.3.3插入信息函数voidins()
3.3.4删除数据函数voiddeletestu()
3.3.5信息查询函数voidsearchstu()
3.4增加学生信息
增加学生信息运行结果如图所示:
实现思想:
录入完一条信息后,会提示输入完毕,是否继续输入,Y继续输入,N便是回主菜单。
实现思想:
先申请一个学生的链表空间,然后输出提示输入相关信息。
由于考虑到班级人数一般不超过1000人,因此在输入时判断小于100或大于999的均是不合法的学号,需重新输入。
在输入性别时也作了限定,只能输入1或2,1代表男生,2代表女生。
信息输入完毕后,将指向list单链表的指针向后移动一个单位。
时间复杂度为O
(1)。
3.5删除学生信息
修改学生信息运行如图所示:
此时,输入您要删除的学生的学号即可,出现如下图所示:
实现思想:
在删除数据时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。
否则提示输入要删除的学生的学号,在输入学号后,先判断学号是否合法,再判断系统中有无此学号,若无则提示系统中无此记录。
否则将删除该学号的学生信息。
时间复杂度为O(S)。
3.6查询学生信息
查询学生信息运行结果如图所示:
此时会提示输入您 要查找的学号,输入正确的学号,显示对应学号信息,结果如下图所示:
实现思想:
在查询数据时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。
否则根据学号查询,需要先判断学号是否合法,然后判断系统中有无此学号,最后输出相应的信息。
时间复杂度为O(s)。
3.7查看全部学生信息
查看全部学生信息运行结果如图所示:
实现思想:
在查看全部学生数据时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。
否则根据把系统中的全部信息以列表的形式输出。
时间复杂度为O(S)。
3.8退出
查看全部学生信息运行结果如图所示:
实现思想:
选择0键退出系统,退出时会有相应该的提示,感谢您 使用本系统,并且Pressanykeytocontinue,按任意键退出。
调试分析
4.1添加学生信息
在实现添加记录时,首先是这要这样考虑,第一次输入和第二次输入的效果是不一样的。
当第一次输入需要用指针delptr把第一个结点记录下来,这样方便以后的删除,查询和浏览操作。
第二次输入时则不需要记录。
所以在第一次输入代码中加入一个全局开关变量,这样就保证了程序的稳定性。
并且在添加学生记录这段程序中,还需要进行一些相关的判断,来检查输入的数据是否合法,如果不合法需要用户重新输入数据。
4.2删除学生信息
在删除学生这一块,遇到了比较大的问题,就是在执行删除命令时,总出现错误,无论删除第几条数据,系统只删除第二条记录,并没有达到想要的效果。
经过了两个下午的研究,和查阅相关的资料,终于把这个问题解决了,最后的删除程序如下:
voiddeletestu()
{
intno,i=0;
cout<<"请输入您要删除的学号:
";
cin>>no;
q=delptr;
if(no==q->num)
{
delptr=q->next;
deleteq;
i=1;
cout<<"删除成功!
";
}
if(!
i)
{
while(q)
{
if(q->next)
{
if(no==q->next->num)
{
temp=q->next;
q->next=q->next->next;
deletetemp;
i=1;
cout<<"删除成功!
";
break;
}
}
else
{
break;
}
q=q->next;
}
}
if(!
i)
{
cout<<"无此学号!
";
}
}
4.3查询学生信息
查询这一块的程序,实现得比较简单,因为在前面插入记录程序段中已经做了铺垫,所以当执行查询时,用户输入学号,然后让指针回到表头,从头到尾查询一遍,如有相应的记录则直接显示出来,如果没有查到,则显示无此学号。
4.4查看全部学生信息
实现方法与查询学生信息大概一致,且稍微简单,如用户选择这项功能,指针回到表头ptr=delptr;然后利用循环语句将系统中所有学生信息以列表的形式表现出来。
使用户清晰的了解全班的学生信息。
测试结果
5.1添加学生信息运行结果截图:
5.2删除学生信息运行结果截图:
5.3查询学生信息运行结果截图:
5.4查看全部学生信息运行结果截图:
5.4退出系统运行结果截图:
源程序附录
#include
usingnamespacestd;
typedefstructlist
{
intyear,month,day,qq,num,sex;
chartel[20];
charname[10];
charaddress[100];
structlist*next;
}node,*link;
linknewnode,ptr,delptr,q,temp;//声明表结构指针
ints=0;
staticintputt=0;//putt记录是否为第一个输入的元素,因为要记录头结点位置
voiddisplay()
{
cout< cout<<"**********<班级通讯录管理系统>**********"< cout<<"\t1: 添加学生信息"< cout<<"\t2;删除学生信息"< cout<<"\t3;查询学生信息"< cout<<"\t4;查看全部学生信息"< cout<<"\t0;退出系统"< cout<<"****************************************"< } voidprint() { cout<<"**********<班级全部学生信息表>**********"< ptr=delptr;//让ptr回到表头 while(ptr! =NULL) {cout<<"学号: "< cout<<"姓名: "< if(ptr->sex==1) cout<<"\t性别: "<<"男"; else cout<<"\t性别: "<<"女"; cout<<"\t出生日期: "< cout<<"联系地址: "< "< "< endl< ptr=ptr->next;//ptr依序往后走访表 } } voidins() { intcsex; if(putt==0) { cout<<"请输入学生数据: "< delptr=newnode;//建立新结点 if(! delptr){ cout<<"[Error! ! 内存申请失败! ]"< exit (1); } cout<<"请输入学号: "; cin>>delptr->num; while(delptr->num<100||delptr->num>=999) { cout<<"学号输入错误,请重新输入学号(100-999): "< cin>>delptr->num; } cout<<"请输入姓名: "; cin>>delptr->name; cout<<"请输入性别(1男/2女): "; cin>>delptr->sex; while(delptr->sex! =1&&delptr->sex! =2) { cout<<"性别输入错误,请重新输入性别(1男/2女): "< cin>>delptr->sex; } cout<<"下面输入出生日期: "< cout<<"请输入年: "; cin>>delptr->year; while(delptr->year<1900||delptr->year>2010) { cout<<"出生年份输入错误,请重新输入年份(1900-2010): "< cin>>delptr->year; } cout<<"请输入月: "; cin>>delptr->month; while(delptr->month<1||delptr->month>12) { cout<<"出生月份输入错误,请重新输入月份(1-12): "< cin>>delptr->month; } cout<<"请输入日: "; cin>>delptr->day; while(delptr->day<1||delptr->day>31) {cout<<"出生日期输入错误,请重新输入日期: "< cin>>delptr->day; } cout<<"请输入联系地址: "; cin>>delptr->address; cout<<"请输入电话: "; cin>>delptr->tel; cout<<"请输入QQ: "; cin>>delptr->qq; delptr->next=NULL; ptr=delptr; putt=1; s++; } else {cout<<"请输入学生数据: "< newnode=newnode; //建立新结点 if(! newnode){ cout<<"[Error! ! 内存申请失败! ]"< exit (1); } cout<<"请输入学号: "; cin>>newnode->num; while(newnode->num<100||newnode->num>=999) {cout<<"学号输入错误,请重新输入学号(100-999): "< cin>>newnode->num; } cout<<"请输入姓名: "; cin>>newnode->name; cout<<"请输入性别(1男/2女): "; cin>>newnode->sex; while(newnode->sex! =1&&newnode->sex! =2) {cout<<"性别输入错误,请重新输入性别(1男/2女): "< cin>>newnode->sex; } cout<<"下面输入出生日期: "< cout<<"请输入年: "; cin>>newnode->year; while(newnode->year<1900||newnode->year>2010) { cout<<"出生年份输入错误,请重新输入年份(1900-2010): "< cin>>newnode->year; } cout<<"请输入月: "; cin>>newnode->month; while(newnode->month<1||newnode->month>12) {cout<<"出生月份输入错误,请重新输入月份(1-12): "< cin>>newnode->month; } cout<<"请输入日: "; cin>>newnode->day; while(newnode->day<1||newnode->day>31) {cout<<"出生日期输入错误,请重新输入日期: "< cin>>newnode->day; } cout<<"请输入联系地址: "; cin>>newnode->address; cout<<"请输入电话: "; cin>>newnode->tel; cout<<"请输入QQ: "; cin>>newnode->qq; newnode->next=NULL; ptr->next=newnode;//把新结点加在表后面 ptr=ptr->next;//让ptr保持在表的最后面 s++; } } voiddeletestu() { intno,i=0; cout<<"请输入您要删除的学号: "; cin>>no; q=delptr; if(no==q->num) { delptr=q->next; deleteq; i=1; cout<<"删除成功! "; } if(! i) { while(q) { if(q->next) { if(no==q->next->num) { temp=q->next; q->next=q->next->next; deletetemp; i=1; cout<<"删除成功! "; break; } } else { break; } q=q->next; } } if(! i) {cout<<"无此学号! ";} } voidsearchstu() { ptr=delptr;//回到表头 intno,p=0; cout<<"请输入您要查找的学号: "; cin>>no; while(no<1||no>1000) { cout<<"您输入的学号不正确,请再次输入! "< cin>>no; } while(ptr! =NULL) { if(ptr->num==no) { cout<<"学号: "< cout<<"姓名: "< "< "< year<<"年"< cout<<"联系地址: "< "< "< < p=1; break; } ptr=ptr->next;//ptr依序往后走访表 } if(p==0) cout<<"您输入的学号不存在! "< } voidmain() { charkey,confirmkey; while (1) { display(); cout<<"请选择操作(1-4),退出(0)"< cin>>key; switch(key) { case'0': {cout<<"感谢您使用本系统! "< exit (1); } case'1': { ins(); cout<<"该生已输入完毕,是否继续输入? (y/n)"; cin>>confirmkey; while(confirmkey=='y'||confirmkey=='Y') {ins(); cout<<"该生已输入完毕,是否继续输入(y/n)"; cin>>confirmkey; } };break; case'2': {deletestu();};break; case'3': {searchstu();};break; case'4': { print(); };break; } } } 收获及体会 四个星期的数据结构课程设计,从头到尾的实践和体验下来,对于我们来说学到的不仅是那些知识,更多的是团队和合作。 写到最后的收获及体会时感触颇深,也许学校安排的课程设计有着更深层的意义。 它不仅让我们综合那些理论知识来运用到设计和创新,还让我们知道了一个团队凝聚在一起所能发挥出的巨大潜能! 通过这次课程设计,使我们学到了一些以前没有学过的知识,使我们对数据结构程序设计有了更深层次的认识和理解,懂得了灵活运用。 在计算机飞速发展的今天,懂得一门计算机语言技术是非常必要的。 同时,我们也清醒的认识到,只要自己肯努力,愿意去付出劳动,就能够得到属于我们自己所期望的东西。 这次课程设计遇到的问题远比我们想象的多,没想到这项看起来很简单的课题却是需要非常多的耐心和精力,在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。 为了让自己的设计更加完善,查阅这方面的资料是非常必要的,同时也是必不可少的。 在这次课程设计中我们运用到了以前所学的专业课知识,如c++、数据结构等。 在设计的同时,我们还发现了自己的不足之处,对以前所学的知识理解的不够深刻、掌握的不够牢固。 而且即使感觉自己的理论上已经掌握,但运用到实践过程中仍有意想不到的困难,比如删除那一块的程序,经过一番努力才得以解决。 这也激发了我们今后努力学习的兴趣。 最后,在此由衷的向我们的指导老师李英梅表示感谢,是她的悉心指导和严格要求,才使我们的课程设计有了较为完善的一面,才有了我们能力的提高,并在老师的帮助下得到了充分的锻炼。 参考文献 [1]严蔚敏《数据结构》清华大学出版社2003年 [2]XX知道 [3]XX百科 [4]XX文库
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 单链表 实现 班级 通讯录 实验 报告