精品通讯录管理系统数据结构毕业论文Word文档格式.docx

上传人:b****6 文档编号:20193418 上传时间:2023-01-17 格式:DOCX 页数:19 大小:90.54KB
下载 相关 举报
精品通讯录管理系统数据结构毕业论文Word文档格式.docx_第1页
第1页 / 共19页
精品通讯录管理系统数据结构毕业论文Word文档格式.docx_第2页
第2页 / 共19页
精品通讯录管理系统数据结构毕业论文Word文档格式.docx_第3页
第3页 / 共19页
精品通讯录管理系统数据结构毕业论文Word文档格式.docx_第4页
第4页 / 共19页
精品通讯录管理系统数据结构毕业论文Word文档格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

精品通讯录管理系统数据结构毕业论文Word文档格式.docx

《精品通讯录管理系统数据结构毕业论文Word文档格式.docx》由会员分享,可在线阅读,更多相关《精品通讯录管理系统数据结构毕业论文Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。

精品通讯录管理系统数据结构毕业论文Word文档格式.docx

使用数字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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1