精品通讯录管理系统数据结构毕业论文Word文档格式.docx
《精品通讯录管理系统数据结构毕业论文Word文档格式.docx》由会员分享,可在线阅读,更多相关《精品通讯录管理系统数据结构毕业论文Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
使用数字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。
使尾指针指向新结点;
提示是否继续建表,读入一个结束的标志;
}
(4)尾结点的指针域置空置NULL。
具体算法实现如下:
*******尾插法建立带头结点的通讯录链表算法*******
LinkListCreateList(void)
{
LinkList"
printf("
\n添加的编号:
\n"
scanf("
%s"
p->
data.num);
\n添加的姓名:
data.name);
\n性别:
data.sex);
\n电话:
data.phone);
\n地址:
data.addr);
rear->
next=p;
*新结点连接到尾结点之后*
rear=p;
*尾指针指向新结点*
继续建表?
(yn):
&
flag);
}
rear->
next=NULL;
*终端结点指针置空*
return"
printf("
a.按编号查询\n"
b.按姓名查询\n"
==================\n"
请选择:
"
p=p;
通讯者结点信息的删除
通讯录结点的删除,先调用查找函数,查询到要删除的结点,删除即可。
其实现算法如下:
********通讯录链表上的结点删除*****************
voidDelNode(LinkList"
return;
}
elseif(p!
=NULL)
{
真的要删除该结点吗?
(yn)"
cho);
if(cho=='
y'
||cho=='
Y'
)
{
q="
}
通讯者结点信息的输出
通讯录链表的输出只要讲表头指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空为止。
因此,其输出链表的算法实现如下:
********通讯录链表的输出函数**********
voidPrintList(LinkList"
while(p!
%s,%s,%s,%s,%s\n"
data.num,p->
data.name,p->
data.sex,p->
data.phone,p->
p=p->
next;
*后移一个结点*
程序源代码
#include<
stdio."
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"
"
printf("
*通讯者信息的添加*\n"
编号姓名性别电话地址\n"
*************************************\n"
p=(ListNode*)malloc(sizeof(ListNode));
*申请新结点*
scanf("
InsertNode("
*通讯录信息的查询*\n"
***********************************\n"
p=ListFind("
printf("
}
elseprintf("
没有查到要查询的通讯者!
}
break;
}
case4:
{
=1){
printf("
getchar();
system("
}
else
{
*通讯录信息的删除*\n"
DelNode("
*通讯录链表的输出*\n"
************************************\n"
PrintList()?
choice=getchar();
if(choice=='
||choice=='
{
j=0;
\n\n\n\n\t\t\t========谢谢使用!
========="
\n按任意键退出..."
default:
\t\t\n输入有错,请重新输入!
\n按任意键继续..."
getchar();
system("
程序调试
可执行文件的生成
(1)打开VC++6.0,编译连接程序是否有错:
Ⅰ
连接生成可执行exe文件,成功
程序的运行过程
双击“通讯录管理系统.exe”
(1)出现菜单界面
(2)输入菜单项选择外的编号“6”:
(3)未输入选项“1”的情况下还未建立通讯录链表,如果直接输入其他除退出外的可选选项此时会提示用户
(4)选择1建立通讯录链表,并录入相关信息,如图所示。
录入完信息后,会提示是否继续,如果不在继续则输入“n”程序会返回主菜单界面,如果继续则输入“y”程序会继续执行建表。
(5)在建好表的基础上,选择选项2,则可根据提示录入相关信息,如图所示。
(6)在建表的基础上,选择3,进行通讯者信息查询出现提示“按编号查找”和“按姓名查找”,用户根据需求进行选择操作,如图所示。
(7)在建表的基础上,选择4,进行通讯者结点的删除,会首先提示安何种方式进行删除。
选择并录入正确的信息后会提示用户确认删除。
(7)在建表的基础上,选择5,进行所有通讯者的信息输出,如图所示。
(8)进入主菜单选择0,程序提示用户是否退出程序,如图所示。
设计总结
课程设计心得
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对实际工作能力的具体训练和考察过程.通过这次实训,增加了我学习软件技术的兴趣,基本理解和掌握课堂上所学各种基本抽
象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法,在不清楚如何下手时,从网上搜索资料进行参考,获益匪浅。
2.建立二叉树,层序、先序遍历
设计目标
二叉树是一个重要的数据类型,通过建立一个链式存储结构,能够实现前序遍历,中序遍历,后序遍历。
以及能够从输入的数据中得知二叉树的叶子节点的个数,二叉树的深度。
二叉树遍历实现流程图
3设计实现
voidmain()
BTNode*b,*p;
CreateBTNode(b,"
a(b(d,e),c(f,g))"
(1)输出二叉树:
DispBTNode(b);
printf("
(2)层次遍历序列:
TravLevel(b);
(3)先序遍历序列:
PreOrder(b);
用递归算法的先序遍历函数
voidPreOrder(BTNode*b)
if(b!
{
printf("
%c"
b->
data);
PreOrder(b->
lchild);
rchild);
4源代码
#include<
voidPreOrder(BTNode*b)用递归算法的先序遍历函数
CreateBTNode(b,"
设计总结:
二叉树是数据结构的的基本内容。
虽然程序规模不大,我依然付出了努力,仍免不了各种错误的出现。
编程过程需要很大的毅力和耐心,而且要有良好的思维和扎实的专业基础知识,所以我需要不断的学习,发现自身不足之处改正它,逐步提高自己。
3.拓扑排序
需求分析:
1.采用邻接表法的存储结构来定义有向图
2.实现有向图的创建和遍历
3.求图中顶点的入度
设计分析:
拓扑排序的过程中要求找到入度为0的顶点,所以采用邻接表来存储有向图,而要得到邻接表,则先定义有向图的邻接矩阵结构,再把邻接矩阵转化成邻接表。
在具体实现拓扑排序的函数中,当某个顶点的入度为0(没有前驱顶点)时,就将此顶点输出,同时将该顶点的所有后继顶点的入度减1,为了避免重复检测入度为0的顶点,设立一个栈St,以存放入度为0的顶点。
源程序代码:
stdio.;
顶点数
}MGraph;
typedefstructANode
intadjvex;
该弧的终点位置
structANode*nextarc;
指向下一条弧的指针
}ArcNode;
typedefstruct
intno;
顶点信息
intcount;
顶点入度
ArcNode*firstarc;
指向第一条弧
}VNode,AdjList[MAXV];
AdjListadjlist;
邻接表
intn;
图的顶点数
}ALGraph;
voidMatTolist(MGraphg,ALGraph*&
G)
inti,j,n=g.n;
ArcNode*p;
G=(ALGraph*)malloc(sizeof(ALGraph));
for(i=0;
i<
n;
i++)
G->
adjlist[i].firstarc=NULL;
for(j=n-1;
j>
=0;
j--)
if(g.edges[i][j]!
=0)
p=(ArcNode*)malloc(sizeof(ArcNode));
p->
adjvex=j;
nextarc=G->
adjlist[i].firstarc;
G->
adjlist[i].firstarc=p;
G->
n=n;
}
voidTopSort(ALGraph*G)
inti,j,flag=0,a[MAXV];
intSt[MAXV],top=-1;
栈St的指针为top
G->
i++)入度置初值为0
adjlist[i].count=0;
i++)求所有顶点的入度
p=G->
while(p!
G->
adjlist[p->
adjvex].count++;
nextarc;
if(G->
adjlist[i].count==0)入度为0的顶点进栈
top++;
St[top]=i;
while(top>
-1)栈不为空时循环
i=St[top];
top--;
出栈
a[flag++]=i;
输出顶点
找第一个相邻顶点
j=p->
adjvex;
adjlist[j].count--;
if(G->
adjlist[j].count==0)
top++;
St[top]=j;
入度为0的相邻顶点进栈
p=p->
找下一个相邻顶点
if(flag<
n)
该图存在回路,不存在拓扑序列!
else
该图的一个拓扑序列为:
for(i=0;
flag;
printf("
a[i]);
inti,j;
MGraphg;
ALGraph*G;
G=(ALGraph*)malloc(sizeof(ALGraph));
请输入图的顶点数:
scanf("
&
g