通讯录管理系统数据结构课程设计.docx
- 文档编号:3175484
- 上传时间:2022-11-19
- 格式:DOCX
- 页数:33
- 大小:219.19KB
通讯录管理系统数据结构课程设计.docx
《通讯录管理系统数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统数据结构课程设计.docx(33页珍藏版)》请在冰豆网上搜索。
通讯录管理系统数据结构课程设计
数据结构课程设计论文
题目:
1.通讯录管理系统**
7.建立二叉树,层序、先序遍历
14.拓扑排序
姓名:
李东东
学号:
201110510212
班级:
11计科
(2)班
指导教师:
李娟徐星
2013年6月24日
1.通讯录管理系统
开发目的
数据结构旨在使读者学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运算,把现实世界中的问题转化为计算机内部的表示和处理。
设计目的
进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;掌握软件设计的基本内容和设计方法,并培养规范化软件设计的能力;将理论知识和实际结合起来,锻炼分析解决实际问题的能力。
设计要求
实现通讯录的建立和输出、通讯者的插入、删除和查询等几种操作功能。
用单链表作存储结构;用菜单作为应用程序的主要界面,主界面的主控菜单如下:
通讯录链表
************************************
1.通讯录链表的建立
2.通讯录结点的插入
3.通讯录结点的查询
4.通讯录结点的删除
5.通讯录链表的输出
1.退出通讯录管理系统
************************************
请选择菜单号<0~5>:
*:
使用数字0~5来选择菜单项,其他输入无效,并给出错误提示。
设计功能
程序运行后的功能有:
(1)菜单选择界面
(2)建立通讯录记录
(3)插入联系人记录
(4)查找联系人记录(名称和编号查询)
(6)删除联系人记录
(7)输出所有联系人记录
(8)退出程序
算法设计
系统流程图如图所示:
主函数设计
由于主函数设计的是菜单选择项,所以在程序未退出的的情况下要实现循环运行,并且要考虑到未建立通讯录链表的情况下其他功能无法实现的情况。
故在实现循环运行的功能时定义一个变量j=1,在选择退出后再将j赋值为0,要考虑判定是否建表的情况定义了一个全局变量flag1=0,建链表后flag1赋值为1。
为了达到选择各功能,采用switch判定选择项并跳转入相应功能函数。
判定是否建表语句:
if(flag1!
=1)
{printf("请先建立表!
");
getchar();
system("cls");}
功能程序设计
为了达到程序各项功能的实现,以及满足菜单选择项的功能,对每个功能的实现分别用了不同函数,并且有用到函数的嵌套以减少代码的重复。
建立通讯链表设计
要建立链表,首先要生成结点,因此,尾插法建立链表算法描述如下:
(1)使链表的头尾指针head、rear指向新生成的头结点(也就是尾结点);
(2)置结束标志为0(假);
(3)while(结束标志不为真)
{
P指向新生成的结点;
读入一个通讯者数据至新结点的数据域;
将新结点链到尾结点之后;
主函数设计
主函数设计
主函数设计
实现循环运行的功能时定义一个变量j=1,在选择退出后再将j赋值为0,要考虑判定是否建表的情况定义了一个全局变量flag1=0,建链表后flag1赋值为1。
为了达到选择各功能,采用switch判定选择项并跳转入相应功能函数。
判定是否建表语句:
if(flag1!
=1)
{printf("请先建立表!
");
getchar();
system("cls");}
建立通讯链表设计
要建立链表,首先要生成结点,因此,尾插法建立链表算法描述如下:
(1)使链表的头尾指针head、rear指向新生成的头结点(也就是尾结点);
(2)置结束标志为0(假);
(3)while(结束标志不为真)
{
P指向新生成的结点;
读入一个通讯者数据至新结点的数据域;
将新结点链到尾结点之后;
使尾指针指向新结点;
提示是否继续建表,读入一个结束的标志;
}
(4)尾结点的指针域置空置NULL。
具体算法实现如下:
/*******尾插法建立带头结点的通讯录链表算法*******/
LinkListCreateList(void)
{
LinkListhead=(ListNode*)malloc(sizeof(ListNode));/*申请头结点*/
ListNode*p,*rear;
charflag='y';//intflag=0;/*结束标志置0*/
rear=head;/*尾指针初始指向头结点*/
while(flag=='y')
{
p=(ListNode*)malloc(sizeof(ListNode));/*申新结点*/
printf("编号(4)姓名(8)性别电话(11)地址(31)\n");
printf("-----------------------------------------------\n");
printf("\n添加的编号:
\n");
scanf("%s",p->data.num);
printf("\n添加的姓名:
\n");
scanf("%s",p->data.name);
printf("\n性别:
\n");
scanf("%s",p->data.sex);
printf("\n电话:
\n");
scanf("%s",p->data.phone);
printf("\n地址:
\n");
scanf("%s",p->data.addr);
rear->next=p;/*新结点连接到尾结点之后*/
rear=p;/*尾指针指向新结点*/
printf("继续建表?
(y/n):
");
scanf("%s",&flag);
}
rear->next=NULL;/*终端结点指针置空*/
returnhead;/*返回链表头指针*/
}
通讯者结点信息的插入
链表结点的插入,要求将一个通讯者记录的数据结点按其编号的次序插入有序通讯表相应位置,以保持通讯录的有序性。
插入的基本思想是:
使用两个指针变量p1和p2分别指向当前访问过的结点和下一个结点,循环顺序查找链表。
寻找插入结点的位置,其中p1指向待插入位置的前一个结点。
具体实现算法如下:
(1)用p1指向原链表头结点,p2指向链表的第一个结点;
(2)while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)
{
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;/*连接表中剩余的结点*/
}
通讯者结点信息的查找
通讯录结点查找的基本思想是:
首先输入要查找的通讯者编号或姓名,从表头顺序访问表中结点。
如果查找成功,则返回一个指向查找道德通讯者信息;若查找失败,则返回一个空的指针NULL。
具体实现如下:
/**********有序通讯录链表的查找****************/
ListNode*ListFind(LinkListhead)
{
ListNode*p;
charnum[5];
charname[9];
charpp;
printf("==================\n");
printf("a.按编号查询\n");
printf("b.按姓名查询\n");
printf("==================\n");
printf("请选择:
");
p=head->next;
scanf("%s",&pp);
if(pp=='a'||pp=='A')
{
printf("请输入要查找者的编号:
");
scanf("%s",num);
while(p&&strcmp(p->data.num,num)!
=0)p=p->next;
if((p==NULL))p=NULL;/*没有查到要查找的通讯信息*/
}
else
if(pp=='b'||pp=='B')
{
printf("请输入要查找者的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!
=0)p=p->next;
}
returnp;
}
通讯者结点信息的删除
通讯录结点的删除,先调用查找函数,查询到要删除的结点,删除即可。
其实现算法如下:
/********通讯录链表上的结点删除*****************/
voidDelNode(LinkListhead)
{
charcho;
ListNode*p,*q;
p=ListFind(head);/*调用查找函数*/
if(p==NULL)
{
printf("没有查到要删除的通讯者!
\n");
return;
}
elseif(p!
=NULL)
{
printf("真的要删除该结点吗?
(y/n)");
scanf("%s",&cho);
if(cho=='y'||cho=='Y')
{
q=head;
while((q!
=NULL)&&(q->next!
=p))q=q->next;
q->next=p->next;/*删除结点*/
free(p);/*释放被删结点空间*/
printf("删除成功!
\n");
}
}
}
通讯者结点信息的输出
通讯录链表的输出只要讲表头指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空为止。
因此,其输出链表的算法实现如下:
/********通讯录链表的输出函数**********/
voidPrintList(LinkListhead)
{
ListNode*p;
p=head->next;
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("---------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 管理 系统 数据结构 课程设计