数据结构实验四图的深度优先与广度优先遍历

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档