数据结构__图的深度和广度优先遍历

本篇文章记录数据结构实验内容-----无向图的深度和广度优先遍历。

代码:

#include<bits/stdc++.h> 
using namespace std;

#define mvnum 100
#define maxsize 100 
//#define OVERFLOW -1
#define ERROR 0
#define OK 1
typedef char VerTexType;
typedef int ArcType;
typedef int status;
typedef int Eelemtype;

typedef struct
{
	Eelemtype *base;
	int front;
	int rear;
}Squeue;//定义队列 

typedef struct
{
	VerTexType vexs[mvnum];//顶点表 
	ArcType arcs[mvnum][mvnum];//邻接矩阵 
	int vexnum,arcnum;//图的点数和边数 
}AMGraph;

Squeue q;
status initqueue(Squeue &q)//初始化队列 
{
	q.base=new Eelemtype[maxsize];
	if(!q.base) exit(-1);
	q.front=q.rear=0;
	return OK;
}

status push(Squeue &q,Eelemtype e)//进队操作 
{
	if((q.rear+1)%maxsize==q.front)
	   return ERROR;
	q.base[q.rear]=e;
	q.rear=(q.rear+1)%maxsize;
	return OK;
} 

status pop(Squeue &q,Eelemtype e)//出队操作 
{
	if(q.front==q.rear) return ERROR;
	e=q.base[q.front];
	q.front=(q.front+1)%maxsize;
	return OK;
}

status empty(Squeue &q)//判断队列是否为空 
{
	if(q.front!=q.rear)
	   return 1;
	else return 0;
}

Eelemtype gethead(Squeue q)//取出队列的队首元素值 
{
	if(q.front!=q.rear)
	   return q.base[q.front];
}



int locate(AMGraph &G,int v)//在建立无向图的时候用于求下标 
{
	for(int i=0;i<G.vexnum;i++)//在所有点中寻找 
	{
		if(i==v)//与所求的下标相等则直接返回 
		  return i;
	}
}

int v1,v2,w;
void createudn(AMGraph &G)//创建无向图 
{
	cout<<"请输入无向图的点数和边数"<<endl; 
	cin>>G.vexnum>>G.arcnum;
	cout<<"请输入各顶点"<<endl; 
	for(int i=0;i<G.vexnum;i++)
	    cin>>G.vexs[i];//在顶点数组中输入顶点 
	for(int i=0;i<G.vexnum;i++)
	  for(int j=0;j<G.vexnum;j++)
	  {
	  	G.arcs[i][j]=0;//无向图是将每个边赋值为0 
	  }
	cout<<"请输入无向图邻接结点"<<endl; 
	for(int k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2; 
		int i=locate(G,v1);int j=locate(G,v2);//求出顶点v1和v2的下标 
		G.arcs[i][j]=1;//利用求出的下标赋权值 
		G.arcs[j][i]=G.arcs[i][j];//针对无向图的语句 
	}
}

bool visited[100];//辅助标记数组 
void dfs(AMGraph G,int v)//深度优先遍历 
{
	cout<<G.vexs[v]<<" ";
	visited[v]=1;
	for(int j=0;j<G.vexnum;j++)
	{
		if(G.arcs[v][j]&&!visited[j])
		  dfs(G,j);
	}
}

void dfstravel(AMGraph G)//对所有的连通分量进行遍历 
{
	for(int v=0;v<G.vexnum;v++)
	   visited[v]=0;//辅助标记数组初始化全为0 
	for(int v=0;v<G.vexnum;v++)
	   if(!visited[v]) dfs(G,v);
}

void bfstravel(AMGraph G)//广度优先遍历无向图 
{
	for(int v=0;v<G.vexnum;v++)
	    visited[v]=0;
	for(int v=0;v<G.vexnum;v++)//对所有联通分量进行操作 
	{
		if(!visited[v])
		{
			cout<<G.vexs[v]<<" ";
			visited[v]=1; 
			push(q,v);//进队 
			while(empty(q)==1)//队列非空时 
			{
				Eelemtype t=gethead(q);//取出队首元素 
			//	cout<<t<<" "; 
				pop(q,t);//队首元素出队 
				for(int j=0;j<G.vexnum;j++)
				{
					if(G.arcs[t][j]==1&&!visited[j])
					{
						cout<<G.vexs[j]<<" ";
						visited[j]=1;
						push(q,j);
					}
				}
			}
		} 
	}
	
}

int main()
{
	int ch;
	AMGraph G;
	initqueue(q);
	cout<<"请输入你要选择的操作:"<<endl;
	cout<<"1.创建无向图"<<endl;
	cout<<"2.输出图的深度优先遍历结果"<<endl;
	cout<<"3.输出图的广度优先遍历结果"<<endl; 
	cin>>ch;
	while(ch!=4)
	{
		switch(ch)
		{
			case 1:createudn(G);
			       cout<<"无向图创建成功!";
			       cout<<endl;
				   break;
			case 2:cout<<"无向图的深度优先遍历结果为:"<<endl; 
			       dfstravel(G);
			       cout<<endl; 
			       break;
			case 3:cout<<"无向图的广度优先遍历结果为:"<<endl; 
			       bfstravel(G);
			       cout<<endl;
			       break;
		}
		cin>>ch; 
	} 
	return 0;
}

例子:

输入:

6 5
0 1 2 3 4 5
0 1
1 2
1 3
0 4
4 5

 输出显示:

完结! 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值