课程设计 数据库 图遍历.docx

上传人:b****2 文档编号:17143803 上传时间:2023-07-22 格式:DOCX 页数:18 大小:40.32KB
下载 相关 举报
课程设计 数据库 图遍历.docx_第1页
第1页 / 共18页
课程设计 数据库 图遍历.docx_第2页
第2页 / 共18页
课程设计 数据库 图遍历.docx_第3页
第3页 / 共18页
课程设计 数据库 图遍历.docx_第4页
第4页 / 共18页
课程设计 数据库 图遍历.docx_第5页
第5页 / 共18页
课程设计 数据库 图遍历.docx_第6页
第6页 / 共18页
课程设计 数据库 图遍历.docx_第7页
第7页 / 共18页
课程设计 数据库 图遍历.docx_第8页
第8页 / 共18页
课程设计 数据库 图遍历.docx_第9页
第9页 / 共18页
课程设计 数据库 图遍历.docx_第10页
第10页 / 共18页
课程设计 数据库 图遍历.docx_第11页
第11页 / 共18页
课程设计 数据库 图遍历.docx_第12页
第12页 / 共18页
课程设计 数据库 图遍历.docx_第13页
第13页 / 共18页
课程设计 数据库 图遍历.docx_第14页
第14页 / 共18页
课程设计 数据库 图遍历.docx_第15页
第15页 / 共18页
课程设计 数据库 图遍历.docx_第16页
第16页 / 共18页
课程设计 数据库 图遍历.docx_第17页
第17页 / 共18页
课程设计 数据库 图遍历.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

课程设计 数据库 图遍历.docx

《课程设计 数据库 图遍历.docx》由会员分享,可在线阅读,更多相关《课程设计 数据库 图遍历.docx(18页珍藏版)》请在冰点文库上搜索。

课程设计 数据库 图遍历.docx

课程设计数据库图遍历

课程设计任务书

设计题目

图的遍历

学生姓名

方萌萌

所在院系

计算机科学与信息工程系

专业、年级、班

08网络工程一班

设计要求:

实现以下几个功能

1、实现图的深度优先;

2、实现图的广度优先;

3、输出原图结构及遍历结果。

学生应完成的工作:

(1)根据课程设计要求,分析思路并构建模型,划分子模块、完善其功能;

(2)根据各模块的功能设计并编写程序段、连接各程序段使之形成一个有机的整体;

(3)调试、运行程序进而得到正确的结果;

(4)根据实验设计运行过程,写出实验论文并总结实验教训。

参考文献阅读:

数据结构程序设计(苏仕华等,机械工业出版社);

c语言程序设计(潭浩强第二版,清华大学出版社);

数据结构(吴伟民等c语言版,清华大学出版社);

C++程序设计导学(李春葆等清华大学出版社)。

工作计划:

(1)2010.6.7–9分析课程题目设计要求,构建模型,划分子模块进行分工合作;

(2)2010.6.10–13根据设计要求和模块写出各部分相应的程序代码;

(3)2010.6.14–15组合并调试程序,得到相应的实验结果;

(4)2010.6.16-19根据设计过程写出实验论文并总结

任务下达日期:

2010年6月5日

任务完成日期:

2010年6月5日

指导教师(签名):

学生(签名):

图的遍历

 

摘要:

关键词:

C预言遍历深度广度算法

 

目录

1.课程设计内容和要求………………………………………1

1.1课程设计内容……………………………………1

1.2运行环境……………………………………1

2.设计方案………………………………………………2

2.1总体设计流程…………………………………………2

2.2图的遍历的模块化…………………………………2

3.方案实施……………………………………………………2

3.1图的存储……………………………………………2

3.2图的遍历………………………………………………3

3.2.1图的深度优先遍历…………………………3

3.2.2图的广度优先遍历…………………………4

3.3代码文件的译码…………………………………………5

4.算法描述……………………………………………………5

4.1图的存储结构的建立………………………………………5

4.1.1定义邻接表的边结点类型以及邻接表类型…5

4.1.2初始化图的邻接表…………………………5

4.1.3建立并输出图的邻接表………………………6

4.2图的遍历………………………………………………7

4.2.1深度优先遍历图的邻接表……………7

4.2.2广度优先遍历图的邻接表……………8

5.结果与结论…………………………………………………10

5.1源程序代码………………………………………10

5.2运行结果………………………………………15

5.3课程设计总结………………………………………4

6.收获与致谢………………………………………………13

7.参考文献…………………………………………………13

8.附件………………………………………………………13

1.课程设计内容和要求

1、1课程设计内容

该课题要求熟悉图的结构和其基本操作,掌握数组的建立和使用方法,学会利用递归和非递归的方法对其进行遍历。

和树的遍历类似,图的遍历也是从某个顶点出发,沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问。

它是许多图的算法的基础。

遍历常用两种方法:

深度优先搜索遍历;广度优先搜索遍历

1、2运行环境

该程序的运行环境为WindowsXP系统,MicrosoftVisualC++6.0版本。

 

 

2.设计方案

2、1总体设计流程

1图的初始化

定义图并初始化图

2.建立图的邻接表

3.图的遍历

1.图的深度优先搜索

2.图的广度优先搜索

2、2图的遍历的模块化

1.图的存储结构;

2.图的输入;

3.BFS和DFS编码;

3.方案实施

3.1实验的基本思想和基本原理

和树的遍历类似,图的遍历也是从某个顶点出发,沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问。

它是许多图的算法的基础。

遍历常用两种方法:

深度优先搜索遍历;广度优先搜索遍历

3.2图的遍历

3.2.1图的深度优先搜索

深度优先搜索是一种递归的过程,正如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。

在深度优先搜索中,对于最新发现的顶点,如果它还有以此为起点而未探测到的边,就沿此边继续下去。

当结点v的所有边都己被探寻过,搜索将回溯到发现结点v有那条边的始结点。

这一过程一直进行到已发现从源结点可达的所有结点为止。

如果还存在未被发现的结点,则选择其中一个作为源结点并重复以上过程,整个进程反复进行直到所有结点都被发现为止。

<1>图的深度优先遍历的递归定义

    假设给定图G的初态是所有顶点均未曾访问过。

在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:

首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。

若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。

若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。

   图的深度优先遍历类似于树的前序遍历。

采用的搜索方法的特点是尽可能先对纵深方向进行搜索。

这种搜索方法称为深度优先搜索(Depth-FirstSearch)。

相应地,用此方法遍历图就很自然地称之为图的深度优先遍历。

<2>深度优先搜索的过程

设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。

若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。

上述过程直至从x出发的所有边都已检测过为止。

此时,若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新源点,进行新的搜索过程。

算法思路:

(1)、首先访问一个顶点vi(初始点),将其标记为已访问过(因为图的每个顶点可能有多个前驱和后继,所以当一个顶点被访问以后,必须记录它已经被访问,以避免再次被访问,为此设置一个辅助数组visited[n],它的每个元素的初值均为逻辑值假(false),即为常量0,表明尚未被访问,一旦访问了顶点vi,就将对应元素visited[i]设置为逻辑值真,即为常量1,表明vi已被访问)。

(2)、然后从vi的任一未被访问过的邻接点出发进行深度优先搜索遍历,当vi所有邻接点均被访问过,则退回到上一个顶点vk,从vk的另一个未被访问过的邻接点出发进行深度优先搜索遍历,直到退回到初始点并且没有未被访问过的邻接点为止。

(1)访问vo,记录visited[0]=True,从v0的一个未被访问过的邻接点v1出发遍历;

(2)访问v1,visited[1]=True,从v1的一个未被访问过的邻接点v4出发遍历;

(3)访问v4,visited[4]=True,从v4的一个未被访问过的邻接点v5出发遍历;

(4)访问v5,visited[5]=True,由于v5的两个邻接点v1和v4都被访问过,退回上一邻接点v4,又v4的两个邻接点v1和v5都被访问过,再退回上一邻接点v1,从未被访问过邻接点V6出发遍历;

(5)访问v6,visited[6]=True,从v6的一个未被访问过的邻接点v2出发遍历;

(6)访问v2,visited[2]=True,v2所有邻接点都访问过,退回上一顶点v6,同理,v6退回v1,v1退回v0,再从v0未被访问过邻接点v3出发遍历;

(7)访问v3,visited[3]=True,退回v0,因所有邻接点都访问过,再退回,结束。

 

3.2.2图的广度优先搜索

广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。

<1>广度优先搜索的基本思想

首先访问图中指定的起始点Vi并将其标记为已访问过,然后由Vi出发访问与它相邻接的所有顶点Vj、Vk……,并均标记为已访问过,然后再按照Vj、Vk……的次序,访问每一个顶点的所有未被访问过的邻接顶点,并均标记为已访问过,下一步再从这些顶点出发访问与它们相邻接的尚未被访问的顶点,如此做下去,直到所有的顶点均被访问过为止

在广度优先搜索中,若对顶点V1的访问先于顶点V2的访问,则对V1邻接顶点的访问也先于V2邻接顶点的访问。

就是说广度优先搜索中对邻接点的寻找具有“先进先出”的特性。

因此,为了保证访问顶点的这种先后关系,需借助一个队列暂存那些刚访问过的顶点。

设此队列由一个一维数组构成,数组名为Queue,队首指针和队尾指针分别为front和rear。

假设数组足够大,不必考虑有溢出的可能性。

广度优先搜索不是递归过程,不能用递归形式。

<2>遍历过程

(1)访问v0,visited[0]=True

(2)访问v0所有未访问过邻接v1和v2,visited[1]=True,visited[2]=True;

(3)访问v1所有未被访问过的邻接点v3和v4,v5,并将它们标记已访问过;

(4)访问v2所有未被访问过的邻接点v6,visited[6]=True;

(5)访问v3所有未被访问过的邻接点v7,visited[7]=True;

(6)访问v4所有未被访问过的邻接点(无)

(7)访问v5所有未被访问过的邻接点v8,visited[8]=True;

(8)访问v6所有未被访问过的邻接点(无);

(9)依次访问v7,v8所有未被访问过的邻接点(无),结束。

 

4.算法描述

4.1图的初始化。

4.1.1定义图

typedefstructnode{/*边表结点*/

intadjvex;/*邻接点域*/

structnode*next;/*链域*/

}EdgeNode;

typedefstructvnode{/*顶点表结点*/

charvertex;/*顶点域*/

EdgeNode*firstedge;/*边表头指针*/

}VertexNode;

typedefVertexNodeAdjList[MaxVertexNum];/*AdjList是邻接表类型*/

typedefstruct{

AdjListadjlist;/*邻接表*/

intn,e;/*图中当前顶点数和边数*/

}ALGraph;/*图类型*/

4.1.2建立图的邻接表

voidCreatALGraph(ALGraph*G)

{

inti,j,k;

chara;

EdgeNode*s;/*定义边表结点*/

printf("InputVertexNum(n)andEdgesNum(e):

");

scanf("%d,%d",&G->n,&G->e);/*读入顶点数和边数*/

scanf("%c",&a);

printf("InputVertexstring:

");

for(i=0;in;i++)/*建立边表*/

{

scanf("%c",&a);

G->adjlist[i].vertex=a;/*读入顶点信息*/

G->adjlist[i].firstedge=NULL;/*边表置为空表*/

}

printf("Inputedges,CreatAdjacencyList\n");

for(k=0;ke;k++){/*建立边表*/

scanf("%d%d",&i,&j);/*读入边(Vi,Vj)的顶点对序号*/

s=(EdgeNode*)malloc(sizeof(EdgeNode));/*/生成边表结点*/

s->adjvex=j;/*邻接点序号为j*/

s->next=G->adjlist[i].firstedge;

G->adjlist[i].firstedge=s;/*将新结点*S插入顶点Vi的边表头部*/

s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=i;/*邻接点序号为i*/

s->next=G->adjlist[j].firstedge;

G->adjlist[j].firstedge=s;/*将新结点*S插入顶点Vj的边表头部*/

}

}

4.2图的遍历。

4.2.1图的深度优先搜索

<1>算法

#defineMAXVEX100

voiddfs(adjlistg,intv,intn)

/*从顶点v出发进行深度优先遍历*/

{

structvexnode*stack[MAXVEX],*p;

intvisited[MAXVEX],top=0;

for(i=1;i<=n;i++)

visited[i]=0;

printf(“%d”,v);

p=g[v].link;

visited[v]=1;

while(top>0||p!

=NULL)

{

while(p!

=NULL)

if(visited[p->adjvex]==1)

p=p->next;

else

{

printf(“%d”,p->adjvex);

visited[p->adjvex]=1;

top++;

stack[top]=p;

p=g[p->adjvex].link;

}

if(top>0)

{

top--;

/*退栈,回溯查找已被访问结点的未被访问过的邻接点*/

p=stack[top];

p=p->next;

}

}

}

<2>时间复杂性

一个有n个顶点、e条边的图,在深度优先搜索图的过程中,找邻接点所需时间为O(e)。

对辅助数组初始化时间为O(n)。

因此,当用邻接表作为图的存储结构时,深度优先搜索图的时间复杂性为O(e+n)。

4.2.2图的广度优先搜索

算法

voidBFSM(MGraph*G,intk)

 {以vk为源点对用邻接矩阵表示的图G进行广度优先搜索

  inti,j;

  CirQueueQ;

  InitQueue(&Q);

  printf("visitvertex:

%c",G->vexs[k]);//访问源点vk

  visited[k]=TRUE;

  EnQueue(&Q,k);

  while(!

QueueEmpty(&Q)){

     i=DeQueue(&Q);//vi出队

     for(j=0;jn;j++)//依次搜索vi的邻接点vj

         if(G->edges[i][j]==1&&!

visited[j]){//vi未访问

             printf("visitvertex:

%c",G->vexs[j]);//访问vi

             visited[j]=TRUE;

             EnQueue(&Q,j);//访问过的vi人队

                }

    }//endwhile

 }//BFSM

5.结果与结论

5.1源程序代码

#include"stdio.h"

#include"stdlib.h"

#defineMaxVertexNum50/*定义最大顶点数*/

typedefstructnode{/*边表结点*/

intadjvex;/*邻接点域*/

structnode*next;/*链域*/

}EdgeNode;

typedefstructvnode{/*顶点表结点*/

charvertex;/*顶点域*/

EdgeNode*firstedge;/*边表头指针*/

}VertexNode;

typedefVertexNodeAdjList[MaxVertexNum];/*AdjList是邻接表类型*/

typedefstruct{

AdjListadjlist;/*邻接表*/

intn,e;/*图中当前顶点数和边数*/

}ALGraph;/*图类型*/

/*建立图的邻接表*/

voidCreatALGraph(ALGraph*G)

{

inti,j,k;

chara;

EdgeNode*s;/*定义边表结点*/

printf("InputVertexNum(n)andEdgesNum(e):

");

scanf("%d,%d",&G->n,&G->e);/*读入顶点数和边数*/

scanf("%c",&a);

printf("InputVertexstring:

");

for(i=0;in;i++)/*建立边表*/

{

scanf("%c",&a);

G->adjlist[i].vertex=a;/*读入顶点信息*/

G->adjlist[i].firstedge=NULL;/*边表置为空表*/

}

printf("Inputedges,CreatAdjacencyList\n");

for(k=0;ke;k++){/*建立边表*/

scanf("%d%d",&i,&j);/*读入边(Vi,Vj)的顶点对序号*/

s=(EdgeNode*)malloc(sizeof(EdgeNode));/*/生成边表结点*/

s->adjvex=j;/*邻接点序号为j*/

s->next=G->adjlist[i].firstedge;

G->adjlist[i].firstedge=s;/*将新结点*S插入顶点Vi的边表头部*/

s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=i;/*邻接点序号为i*/

s->next=G->adjlist[j].firstedge;

G->adjlist[j].firstedge=s;/*将新结点*S插入顶点Vj的边表头部*/

}

}

/*定义标志向量,为全局变量*/

typedefenum{FALSE,TRUE}Boolean;

Booleanvisited[MaxVertexNum];

/*DFS:

深度优先遍历的递归算法*/

voidDFSM(ALGraph*G,inti)

{/*以Vi为出发点对邻接链表表示的图G进行DFS搜索*/

EdgeNode*p;

printf("%c",G->adjlist[i].vertex);/*访问顶点Vi*/

visited[i]=TRUE;/*标记Vi已访问*/

p=G->adjlist[i].firstedge;/*取Vi边表的头指针*/

while(p){/*依次搜索Vi的邻接点Vj,这里j=p->adjvex*/

if(!

visited[p->adjvex])/*若Vj尚未被访问*/

DFSM(G,p->adjvex);/*则以Vj为出发点向纵深搜索*/

p=p->next;/*找Vi的下一个邻接点*/

}

}

voidDFS(ALGraph*G)

{

inti;

for(i=0;in;i++)

visited[i]=FALSE;/*标志向量初始化*/

for(i=0;in;i++)

if(!

visited[i])/*Vi未访问过*/

DFSM(G,i);/*以Vi为源点开始DFS搜索*/

}

/*BFS:

广度优先遍历*/

voidBFS(ALGraph*G,intk)

{/*以Vk为源点对用邻接链表表示的图G进行广度优先搜索*/

inti,f=0,r=0;

EdgeNode*p;

intcq[MaxVertexNum];/*定义FIFO队列*/

for(i=0;in;i++)

visited[i]=FALSE;/*标志向量初始化*/

for(i=0;i<=G->n;i++)

cq[i]=-1;/*初始化标志向量*/

printf("%c",G->adjlist[k].vertex);/*访问源点Vk*/

visited[k]=TRUE;

cq[r]=k;/*Vk已访问,将其入队。

注意,实际上是将其序号入队*/

while(cq[f]!

=-1){//队列非空则执行

i=cq[f];f=f+1;/*Vi出队*/

p=G->adjlist[i].firstedge;/*取Vi的边表头指针*/

while(p){/*依次搜索Vi的邻接点Vj(令p->adjvex=j)*/

if(!

visited[p->adjvex]){/*若Vj未访问过*/

printf("%c",G->adjlist[p->adjvex].vertex);/*访问Vj*/

visited[p->adjvex]=TRUE;

r=r+1;cq[r]=p->adjvex;/*访问过的Vj入队*/

}

p=p->next;/*找Vi的下一个邻接点*/

}

}/*endwhile*/

}

/*主函数*/

voidmain()

{

inti;

ALGraph*G;

G=(ALGraph*)malloc(sizeof(ALGraph));

CreatALGraph(G);

printf("PrintGraphDFS:

");

DFS(G);

printf("\n");

printf("PrintGraphBFS:

");

BFS(G,3);

printf("\n");

}

5.2运行结果

<1>原图:

<2>运行结果:

5.3课程设计总结

 

6.收获与致谢

7.参考文献

[1]苏仕华等编著.数据结构程序设计.北京:

机械工业出版社.2005.5

[2]潭浩强编著。

C语言程序设计(第三版).北京:

清华大学出版社.2005.7

[3]严蔚敏,吴伟民编著.数据结构(c语言版).北京:

清华大学出版社.1997.4

[4]郑莉,董渊张瑞丰编著.C++语言程序设计(第三版).北京:

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2