数据结构课程设计 通讯录管理.docx
- 文档编号:12709463
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:14
- 大小:147.87KB
数据结构课程设计 通讯录管理.docx
《数据结构课程设计 通讯录管理.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 通讯录管理.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计通讯录管理
实验课程名称数据结构课程设计
专业班级10级计科
(2)班
学生姓名赵腾松
学号10410902044
指导教师冯韵
2012至2013学年第1学期第1至9周
目录
1概述3
1.1现状分析3
1.2实现意义3
2系统分析3
3概要设计3
3.1算法的设计3
3.2通讯录系统图4
4详细设计4
4.1主菜单模块设计4
4.2通讯录建立模块设计4
4.3通讯录插入模块设计5
4.4通讯录查询模块设计6
4.5通讯录删除模块设计7
4.6通讯录输出模块设计8
6运行与测试9
6.2通讯录模块的插入10
6.3按编号查找通讯录10
6.5通讯录的输出11
7总结与心得11
8参考文献11
1概述
1.1现状分析
课程设计是实践教学中的重要环节,它以某一门课程为基础,涉及和课程相关的各方面知识,是一门独立于课程外的特殊课程。
课程设计就是让所有同学对课程更全面的应用。
本次实验项目“通讯录管理”就是针对数据结构的一门应用较为广泛的系统管理方法。
1.2实现意义
本次实验应用性能很好,结构清楚,能随时添加、删除、查找联系人;并且可以用姓名、编号两种方式;操作更精确,以人性化的方式展现出来,效果十分突出。
2系统分析
编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出等功能。
每个记录包含姓名、电话号码、住址等个人基本信息。
用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。
本程序为使用方便,几乎不用特殊的命令,只需按提示输入即可,适合更多的用户使用。
对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
3概要设计
3.1算法的设计
本实验从整体上分为七大模块:
(1)输入联系人信息;
(2)查找联系人信息;(3)显示联系人信息;(4)增加联系人信息;(5)删除联系人信息;(6)存储联系人信息;(7)退出通讯录管理。
3.2通讯录系统图
4详细设计
4.1主菜单模块设计
编写一个主控菜单驱动程序,输入0—5以进入相应选择项。
1.实现循环和功能选择
假设输入选择用变量sn储存,它作为menu_select函数的返回值提供给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
2.得到sn的合理值
设计一个函数用来输出提示信息和处理信息输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select。
对于sn输入值,在switch中case语句对应数字0—5,对于不符合要求的输入,提示输入错误并要求重新输入。
4.2通讯录建立模块设计
我们知道的建立链表有两种方法,一种为头插入法,一种为尾插入法。
头插入法是每次将新插入的结点插在链表的表头,而尾插入法是将新插入的结点插入在链表的尾部。
我们这里用尾插入法描述算法。
(1)使链表的头尾指针head、rear指向新生成的头结点(也是尾结点);
(2)置结束标志为0(假);
(3)while(结束标志不为真)
{
P指向新生结点;
读入一个通讯者数据至新结点的数据域;
将新结点链接到尾结点之后;
使为指针指向新结点;
提示:
是否结束建表,读入一个结束标志;
}
(4)尾结点指针域置空值NULL。
具体算法如下:
/************************************/
/*用尾插入法建立通讯录链表函数*/
/************************************/
LinkListCreateList(void)
{//尾插入法建立带头结点的通讯录链表算法
LinkListhead=(ListNode*)malloc(sizeof(ListNode));//申请头结点
ListNode*p,*rear;
intflag=0;//结束指标置0
rear=head;//尾指针初始化指向头结点
while(flag==0)
{p=(ListNode*)malloc(sizeof(ListNode));//申请新结点
printf("编号
(1)姓名
(2)性别电话(4)地址(5)\n");
printf("-----------------------------------------------------------\n");
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
rear->next=p;//新结点连接到尾结点之后
rear=p;//尾指针指向新结点
printf("结束建表吗?
(1/0):
");
scanf("%d",&flag);//读入一个标志数据
}
rear->next=NULL;//终端结点指针域置空
returnhead;//返回链表头指针
}
4.3通讯录插入模块设计
插入结点的基本思想是:
使用两个指针变量p1和p2分别指向当前访问过的结点和下一个待访问的结点,循环顺序查找链表,寻找插入结点的位置,其中p1指向待插入结点的前一个结点。
(1)用p1指向原链表头结点,p2指向链表的第一个结点;
(2)while(p2=NULL&&p2->data.num
{
p1=p2;//p1指向刚访问过的结点;
p2=p2->next;//p2指向表的下一个结点
(3)插入新结点。
具体算法如下:
/****************************/
/*在通讯录链表head中插入结点*/
/****************************/
voidInsertNode(LinkListhead,ListNode*p)
{
ListNode*p1,*p2;
p1=head;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;//p1指向刚访问过的结点
p2=p2->next;//p2指向表的下一个结点
}
p1->next=p;//插入p所指向的结点
p->next=p2;//连接表中剩余部分
}
4.4通讯录查询模块设计
查询的基本思想是:
首先输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。
如查找成功,则返回一个指向查找到的通讯者信息的结点;若查找失败,则返回一个空的指针值NULL。
当按编号好查找时,如需要查找的通讯者编号不在表中,则不一定需要循环才比较到表尾,因为表是按编号递增有序的;而当按姓名查找时,这要循环比较到表尾,才能确定查不到的情况。
具体算法如下:
/***********************************/
/*有序通讯录链表上的查找*/
/***********************************/
ListNode*ListFind(LinkListhead)
{//有序通讯录链表上的查找
ListNode*p;
charnum[5];
charname[9];
intxz;
printf("================\n");
printf("1.按编号查询\n");
printf("2.按姓名查询\n");
printf("================\n");
printf("请选择:
");
p=head->next;//假定通讯录表带有结点
scanf("%d",&xz);
if(xz==1){
printf("请输入要查找者的编号:
");
scanf("%s",num);
while(p&&strcmp(p->data.num,num)<0)
p=p->next;
if(p==NULL||strcmp(p->data.num,num)>0)
p=NULL;//没有查到要查找的通讯者
}
else
if(xz==2){
printf("请输入要查找者的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!
=0)
p=p->next;
}
returnp;
}
4.5通讯录删除模块设计
删除的基本思想是:
先调用查找函数,查询到要删除的结点,删除结点即可。
算法如下:
/*****************************/
/*通讯录链表上的结点的删除*/
/*****************************/
voidDelNode(LinkListhead)
{
charjx;
ListNode*p,*q;
p=ListFind(head);//调用查找函数
if(p==NULL){
printf("没有查到要删除的通讯者!
\n");
return;}
printf("%s%s%s%s%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
printf("真的要删除该结点吗?
(y/n):
");
scanf("%s",&jx);
if(jx=='y')
{q=head;
while(p!
=NULL&&q->next!
=p)
q=q->next;
q->next=p->next;//删除结点
free(p);//释放被删除的结点空间
printf("通讯者已被删除!
\n");
return;}
printf("通讯者没有被删除!
\n");
}
4.6通讯录输出模块设计
输出的基本思想是:
只要将表头的指针赋给一个指针变量p,然后用p想后扫描,直到表尾,p为空值。
具体算法如下:
/**********************************/
/*通讯录链表的输出函数*/
/**********************************/
voidPrintList(LinkListhead)
{
ListNode*p;
p=head->next;//因为链表带头结点,使p指向链表开始结点
printf("编号姓名性别联系电话地址\n");
printf("----------------------------------\n");
while(p!
=NULL)
{
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
printf("----------------------------------\n");
p=p->next;//后移一个结点
}
}
6运行与测试
6.1通讯录链表的建立
6.2通讯录模块的插入
6.3按编号查找通讯录
6.4按编号删除通讯录
6.5通讯录的输出
7总结与心得
在本次实验中遇到了很多问题,因为我的数据结构学得不好,很多东西只是一知半解。
链表是什么我也不很清楚,于是查了一些资料,和同学一起解决问题,慢慢的把一些错误找出来并改正了。
我认为学习最重要的是发现问题,解决问题。
自己解决不了的和同学一起解决,这样才能学到更多东西。
8参考文献
[1]《数据结构课程设计》苏仕华等编著机械工业出版社
[2]《数据结构》(C语言版)严蔚敏吴伟民编著清华大学出版社
[3]《C程序设计》(第三版)谭浩强著清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 通讯录管理 数据结构 课程设计 通讯录 管理
