- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
软件技术基础
考试大作业
学号: 130697138
姓名: 张新新
2014年 6 月 18 日
第一部分--数据结构程序设计
一、有向图遍历的实现
已知一个有向图,用邻接表作为其存储结构,编程实现深度优先遍历图中结点的操作,并输出结点序列。
1、题目描述:
图的遍历包括图的广度优先遍历与深度优先遍历。对于广度优先遍历应利用队列的五种基本运算(置空队列、进队、出队、取队头元素、判队空)来实现。首先建立一空队列,从初始点出发进行访问,当被访问时入队,访问完出队。并以队列是否为空作为循环控制条件。对于深度优先遍历则采用递归或非递归算法来实现。
2、图的深度优先遍历预备知识
假设初始状态是图中所有顶点未曾被访问,深度优先遍历可以从图的初始点出发,访问初始点,然后依次从v未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时仍有顶点未被访问到,则从另一个未被访问的顶点出发,重复上述过程,直至所有点都被访问到为止。这是一个递归的过程。所以在实现深度优先遍历的过程中必须递归调用深度优先搜索函数。而且在深度优先搜索函数中必须设一标志数组以标记结点是否被访问。
具体过程应为:先访问初始点Vi,并标志其已被访问。此时定义一指向边结点的指针p,并建立一个while()循环,以指针所指对象不为空为控制条件,当Vi的邻接点未被访问时,递归调用深度优先遍历函数访问之。然后将p指针指向下一个边结点。这样就可以完成图的深度优先遍历了。
3、函数设计
程序设计中主要包括下列函数
用邻接矩阵创建一个图:
void CreateUDN(Graph G)
{
用邻接矩阵创建一个带权无向网图;
输入顶点数和弧数;
输入各个顶点及各条弧;
}
递归方法实现图的遍历:
void DFS(Graph G, int k)
{
用递归的方法访问图中的结点;
对图进行深度优先遍历;
}
非递归方法实现图的遍历:
void BFS(Graph G)
{
用队列辅助访问图中的结点;
对图进行广度优先遍历;
}
选择输出需要的遍历方法:
void choose(Graph G)
{
给出程序运行的选项;
对相应的输入选项调用相应的函数以执行操作;
}
4、 源代码
程序 图的存储与遍历
头文件 图.h
#ifndef GRAPH_H
#define GRAPH_H
#define MAX_VRTEX_NUM 20
struct edgenode{
int adjvex;
edgenode * next;
}; //定义邻接表的边结点类型
typedef edgenode **adjlist;
//定义邻接表类型
void InitGAdjoin(adjlist GL,int n);
//初始化图的邻接表
void CreateAdjoin(adjlist GL,int n,int m);
//建立图的邻接表
void dfsAdjoin(adjlist GL,bool*visited,int i,int n);
//从初始点出发深度优先搜索由邻接表GL表示的图
void bfsAdjoin(adjlist GL,bool*visited,int i,int n);
//从初始点出发广度优先搜索由邻接表GL表示的图
#endif
实现文件 图.cpp
#includeiostream.h
#includestdio.h
#include图.h
void Check(int n,int i,int j);
void InitGAdjoin(adjlistGL,int n)
//初始化图的邻接表
{
GL=new edgenode*[n];
for(int i=1;i=n;i++)GL[i]=NULL;
}
void CreateAdjoin(adjlist GL,int n,int m)
else if(m==1){//建立有向图
for(k=1;k=e;k++){
cout输入第k条边的起点和终点序号!endl;
cinij;
Check(n,i,j);
//向序号为i的表头插入一个边结点
edgenode*p=new edgenode;
p-adjvex=j;
p-next=GL[i];
GL[i]=p;
}
cout图的邻接表为:endl;
for(i=1;i=n;i++){
edgenode*p=GL[i];
couti-1 |Vi;
for(p=GL[i];p!=NULL;p=p-next)
cout|-|-|p-adjvex;
文档评论(0)