数据结构实验四图的深度优先与广度优先遍历
![数据结构实验四图的深度优先与广度优先遍历](https://img.360docs.net/img52/19nbsdpf0x35cvt09281qwcqm50ay88d-21.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
天津理工大学实验报告学院(系)名称:计算机与通信工程学院
实验思路:
首先,定义邻接矩阵和图的类型,定义循环队列来存储,本程序中只给出了有向图的两种遍历,定义深度优先搜索和广度优先搜索的函数,和一些必要的函数,下面的程序中会有说明,然后是函数及运行结果!
#include
#include
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<<"队满,入队操作失败!"< 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;i G.vertex[i].data=i;G.vertex[i].firstarc=NULL; } for(i=0;i cin>>i>>j;//输入边的信息 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) { cout< } 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 = G.vertex[v].firstarc; while(p->adjvex!=w) p = p->nextarc; if(p->nextarc) return p->nextarc->adjvex; else return -1; } void DFSGrahp(Graph G,int v){ visited[v]=true;Visit(G,v);//访问顶点V,对从未访问过的邻接点w递归调用DFS for(int w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w)) if(!visited[w]) DFSGrahp(G,w); } void DFSTraverse(Graph G){//对图G做深度优先搜索 for(int v=0;v visited[v]=false;//初始化访问标志数组visited for(v=0;v if(!visited[v]) DFSGrahp(G,v);//对尚未访问的顶点v调用DFS } void BFSGrahp(Graph G){//图的广度优先搜索 SeqQueue Q; Q=InitQueue(); int u; for(int v=0;v if(!visited[G,v]){ EnQueue(Q,v);//v入队列 while(!((Q.front==Q.rear)?1:0)){ DeQueue(Q,u);//对首元素出队,赋给u visited[u]=true;Visit(G,u); for(int w=FirstAdjVex(G,u);w!=0;w=NextAdjVex(G,u,w)) //u的未访问过的邻接点w入队列 if(!visited[w])EnQueue(Q,w); } } } int main() { Graph p; int n,e; cout<<"输入图的顶点及边数:"< cin>>n>>e; cout<<"创建图:"< CreateDG(p,n,e); cout<<"图的优先深度结果为:"< DFSTraverse(p); cout<<"图的广度优先结果为:"< BFSGrahp(p); printf("结果如上所示!\n"); return 0; }