- 17
- 0
- 约3.08千字
- 约 4页
- 2020-11-05 发布于山东
- 举报
天津理工大学实验报告
学院(系)名称:
算机与通信工程学院
姓名
学号
算机科学与技
班
2009 1 班
目
实验四
图的深度优先与广度优先遍历
程名称
数据 构与算法
程代
2011
年 5 月 12 日 第 5-8
地点
7 号楼 215
批改意
成
教 字:
实验四 图的深度优先与广度优先遍历
: 2011 年 5 月 12 日, 12:50 -15:50 (地点: 7-215 )
目的: 理解 的 特点;掌握理解 的两种主要存 构( 接矩 和 接表) ,掌握 的构造、深
度 先遍 、广度 先遍 算法。
具体 目: (任 教 根据 大 自己指定)
每位同学按下述要求 相 算法: 根据从 入的数据 建 ( 的存 构可采用 接矩 或 接表),并 行深度 先搜索和广度 先搜索
1) 描述:在主程序中提供下列菜 :
1? 的建立
2?深度 先遍
3?广度 先遍
0? 束
2) 要求: 的存 可采用 接表或 接矩 ;定 下列 程:
CreateGraph(): 按从 的数据建立
DFSGrahp() :深度 先遍
BFSGrahp() :广度 先遍
告格式及要求: 按学校印刷的 告模版 写。 (具体要求 四)
精选
实验思路:
首先,定义邻接矩阵和图的类型,定义循环队列来存储,本程序中只给出了有向图
的两种遍历, 定义深度优先搜索和广度优先搜索的函数, 和一些必要的函数, 下面的程序中会有说明,然后是函数及运行结果!
#includeiostream
#includecstdlib
using namespace std;
#define MAX_VERTEX_NUM 20// 最大顶点数
#define MaxSize 100
bool visited[MAX_VERTEX_NUM];
enum GraphKind{AG,AN,DG,DN};// 图的种类,无向图,无向网络,有向图,有向网
络
struct ArcNode{
int adjvex;
ArcNode * nextarc;
};
struct VNode{
int data;
ArcNode * firstarc;
};
struct Graph{
VNode vertex[MAX_VERTEX_NUM];
int vexnum,arcnum;//顶点数,弧数
GraphKind kind;// 图的类型
};
struct SeqQueue{
int *base;
int front,rear;
};
SeqQueue InitQueue(){//循环队列初始化
SeqQueue Q;
Q.base = new int;
Q.front=0;
Q.rear=0;
return Q;
}
void DeQueue(SeqQueue Q,int u){//出队操作
u = *(Q.base+Q.front);
Q.front = (Q.front+1)%MaxSize;
}
int QueueFull(SeqQueue Q){//判断循环队列是否满
return (Q.front==(Q.rear+1)%MaxSize)?1:0;
}
精选
void EnQueue(SeqQueue Q,int x){//入队操作
if(QueueFull(Q)){
cout队满,入队操作失败! endl;
exit(0);
}
*(Q.base+Q.rear) = x;
Q.rear = (Q.rear+1)%MaxSize;
}
void CreateDG(Graph G,int n,int e){// 初始化邻接表头结点
int j;
for(int i=0;in;++i){
G.vertex[i].data=i;G.vertex[i].firstarc=NULL;
}
for(i=0;ie;++i){
cinij;// 输入边的信息
ArcNode* s;
s= new ArcNode;
s-adjvex = j;
s-nextarc = G.vertex[i].firstarc;
G.vertex[i].firstarc = s;
}
}
void Visit(Graph G,int u)
{
coutG.vertex[u].data ;
}
int FirstAdjVex(Graph G,int v){
if(G.vertex[v].firstarc)
return G.vertex[v].firstarc-adjvex;
else
return -1;
}
int NextAdjVex(Graph G,int v,int w){
ArcNode* p =
原创力文档

文档评论(0)