数据结构课程设计之通讯录管理系统Word格式文档下载.docx
《数据结构课程设计之通讯录管理系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之通讯录管理系统Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
*********************************************************************
*通讯录管理系统*
*1.通讯录链表的建立*
*2.通讯者结点的插入*
*3.通讯者结点的查询*
*4.通讯者结点的删除*
*5.通讯录链表的输出*
*0.退出通讯录管理系统*
请选择0—5:
使用数字0~5来选择菜单项,其他输入则不起作用,并给出错误提示。
3方案设计
3.1设计思路
本程序首先利用主函数设计菜单选择界面,主函数中根据用户选择项转入相应功能函数,如果输入错误,主函数给出相应提示。
其中用到变量j=1控制其循环运行。
在主函数中选择“通讯录链表的建立”,则转入相应函数LinkListCreateList(void),以实现通讯录链表的建立功能,录入完一条信息会提示用户是否继续录入信息然后根据用户选择继续运行;
在除却建立通讯录链表和退出功能外,其余选择项均会先判断是否已经建立通讯录链表,如果没有则会提醒用户先建立通讯录链表并返回主菜单;
选择“通讯者结点的插入”,如果已经建立通讯录链表,录入信息转入其函数voidInsertNode(LinkListhead,ListNode*p);
选择“通讯者结点的查询”,如果已经建立通讯录链表,则调用其函数ListNode*ListFind(LinkListhead)进行查询,在此函数中,会先提示用户是按照何种方式查询,待用户选择查询方式后根据用户选择进行相应查找;
选择“通讯者结点的删除”,如果已经建立通讯录链表,则转入删除函数voidDelNode(LinkListhead),在此函数中嵌套调用查找函数以便选择以何种方式进行删除;
选择“通讯录链表的输出”,如果已经建立通讯录链表,,则会通过函数voidPrintList(LinkListhead)直接输出所有通讯者信息;
选择“退出通讯录管理系统”则会提示用户是否退出,用户确认后变量j=0退出程序。
3.2设计功能
程序运行后的功能有:
(1)菜单选择界面
(2)建立通讯录记录
(3)插入联系人记录
(4)查找联系人记录(名称和编号查询)
(6)删除联系人记录
(7)输出所有联系人记录
(8)退出程序
4算法设计
为了方便了解程序的操作过程,特画出系统流程图。
通讯录管理系统的程序结构如图4.1所示:
5详细设计
5.1主函数设计
由于主函数设计的是菜单选择项,所以在程序未退出的的情况下要实现循环运行,并且要考虑到未建立通讯录链表的情况下其他功能无法实现的情况。
故在实现循环运行的功能时定义一个变量j=1,在选择退出后再将j赋值为0,要考虑判定是否建表的情况定义了一个全局变量flag1=0,建链表后flag1赋值为1。
为了达到选择各功能,采用switch判定选择项并跳转入相应功能函数。
判定是否建表语句:
if(flag1!
=1)
{printf("
请先建立表!
"
);
getchar();
system("
cls"
}
5.2功能程序设计
5.2.1建立通讯链表设计
要建立链表,首先要生成结点,因此,尾插法建立链表算法描述如下:
(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=='
)
{
p=(ListNode*)malloc(sizeof(ListNode));
/*申新结点*/
printf("
编号(4)姓名(8)性别电话(11)地址(31)\n"
-----------------------------------------------\n"
\n添加的编号:
\n"
scanf("
%s"
p->
data.num);
\n添加的姓名:
data.name);
\n性别:
data.sex);
\n电话:
data.phone);
\n地址:
data.addr);
rear->
next=p;
/*新结点连接到尾结点之后*/
rear=p;
/*尾指针指向新结点*/
继续建表?
(y/n):
&
flag);
}
rear->
next=NULL;
/*终端结点指针置空*/
returnhead;
/*返回链表头指针*/
5.2.2通讯者结点信息的插入
链表结点的插入,要求将一个通讯者记录的数据结点按其编号的次序插入有序通讯表相应位置,以保持通讯录的有序性。
插入的基本思想是:
使用两个指针变量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->
while(p2!
p1=p2;
/*p1指向刚访问过的结点*/
p2=p2->
/*p2指向表的下一个结点*/
p1->
/*插入p所指向的结点*/
p->
next=p2;
/*连接表中剩余的结点*/
5.2.3通讯者结点信息的查找
通讯录结点查找的基本思想是:
首先输入要查找的通讯者编号或姓名,从表头顺序访问表中结点。
如果查找成功,则返回一个指向查找道德通讯者信息;
若查找失败,则返回一个空的指针NULL。
具体实现如下:
/**********有序通讯录链表的查找****************/
ListNode*ListFind(LinkListhead)
ListNode*p;
charnum[5];
charname[9];
charpp;
printf("
==================\n"
a.按编号查询\n"
b.按姓名查询\n"
请选择:
"
p=head->
scanf("
pp);
if(pp=='
a'
||pp=='
A'
)
请输入要查找者的编号:
num);
while(p&
strcmp(p->
data.num,num)!
=0)p=p->
if((p==NULL))p=NULL;
/*没有查到要查找的通讯信息*/
else
b'
B'
请输入要查找者的姓名:
name);
while(p&
data.name,name)!
returnp;
5.2.4通讯者结点信息的删除
通讯录结点的删除,先调用查找函数,查询到要删除的结点,删除即可。
其实现算法如下:
/********通讯录链表上的结点删除*****************/
voidDelNode(LinkListhead)
charcho;
ListNode*p,*q;
p=ListFind(head);
/*调用查找函数*/
if(p==NULL)
没有查到要删除的通讯者!
return;
}
elseif(p!
=NULL)
真的要删除该结点吗?
(y/n)"
cho);
if(cho=='
||cho=='
Y'
{
q=head;
while((q!
=NULL)&
(q->
next!
=p))q=q->
q->
next=p->
/*删除结点*/
free(p);
/*释放被删结点空间*/
printf("
删除成功!
}
5.2.5通讯者结点信息的输出
通讯录链表的输出只要讲表头指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空为止。
因此,其输出链表的算法实现如下:
/********通讯录链表的输出函数**********/
voidPrintList(LinkListhead)
编号姓名性别联系电话地址\n"
------------------------------------------\n"
while(p!
%s,%s,%s,%s,%s\n"
data.name,p->
data.sex,p->
data.phone,p->
----------------------------------------------\n"
p=p->
/*后移一个结点*/
5.3程序源代码
#include<
stdio.h>
#include"
string.h"
stdlib.h"
intflag1=0;
typedefstruct{/*通讯录结点类型*/
/*编号*/
/*姓名*/
charsex[3];
/*性别*/
charphone[13];
/*电话*/
charaddr[31];
/*地址*/
}DataType;
typedefstructnode{/*结点类型定义*/
DataTypedata;
/*结点数据域*/
structnode*next;
/*结点指针域*/
}ListNode;
typedefListNode*LinkList;
LinkListhead;
ListNode*p;
LinkListCreateList(void);
voidInsertNode(LinkListhead,ListNode*p);
ListNode*ListFind(LinkListhead);
voidDelNode(LinkListhead);
voidPrintList(LinkListhead);
编号姓名性别电话地址\n"
----------------------------------------------------\n"
voidmain()
{
intchoice,j=1;
while(j)
\n\n\n\n\n"
\t\t\t\t通信录链表\n"
\n\t\t\t******************************"
\n\t\t\t*1.通讯录链表的建立*"
\n\t\t\t*2.通讯者结点的插入*"
\n\t\t\t*3.通讯者结点的查询*"
\n\t\t\t*4.通讯者结点的删除*"
\n\t\t\t*5.通讯录链表的输出*"
\n\t\t\t*0.退出通讯录管理系统*"
\n\t\t\t请选择菜单号(0--5):
%d"
choice);
getchar();
switch(choice)
case1:
{
printf("
**********************************\n"
*通讯录链表的建立*\n"
head=CreateList();
flag1=1;
system("
break;
}
case2:
else{
printf("
*通讯者信息的添加*\n"
***********************