利用邻接矩阵存储无向图,并实现BFS(非递归) DFS(递归+非递归)两种遍历

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
//------------邻接矩阵----------- 
#define MAX 20
typedef char Dtype;
typedef int mapmax[MAX][MAX];
int visited[MAX];

typedef struct{
	int dian,hu;
	Dtype d[MAX];
	mapmax map;
}M;
//-----------------栈------------------
typedef struct{
	int *base;
	int top;
	int size;
}Stack;

int  Gettop(Stack S,int &e);
void Pop(Stack &S,int &e);
void Push(Stack &S,int e);
int Isempty(Stack S);
void InitStack(Stack &S); 
int locate(M G,Dtype a);
void creat_map(M &G);
//------------队列----------------------
typedef struct {	//队列 
	int *base;
	int front;
	int rear;
	int tag;
}Sq;
void InitSq(Sq &QQ);
int Getlen(Sq QQ);
int Isempty(Sq QQ);
void InSq(Sq &QQ,int e);
void OutSq(Sq &QQ,int &e);
void GetHead(Sq QQ,int &e); 
//-----------------DFS-digui--------------------
int first(M G,int i);
int next(M G,int i,int w);
void DFS1(M G,int i);
//-----------------DFS-fei-digui------------------
void DFS(M G,int v);
//-----------------BFS--------------------
void BFS(M G)
{
	Sq q;	InitSq(q);
	int v,e;
	for(int i=1;i<=G.dian;i++)
	{
		if(!visited[i])
		{
			cout<<G.d[i]<<" ";
			visited[i]=1;
			InSq(q,i);
		}
		
		GetHead(q,v);
		
		for(int j=2;j<=G.dian;j++)
		{
			if(G.map[v][j]==1 && !visited[j])
			{
				cout<<G.d[j]<<" ";
				visited[j]=1;
				InSq(q,j);
			}
		}
		OutSq(q,e);
	}
}

int main()
{
	M G;
	memset(visited,0,sizeof(visited));
	memset(G.map,0,sizeof(G.map));
	creat_map(G);
//	BFS(G);
	for(int i=1;i<=G.dian;i++)
	{
		if(!visited[i])
			DFS1(G,i);
	}

	return 0;
}
//--------------------------DFS fei digui------------------
void DFS(M G,int v)
{
	Stack S;InitStack(S);
	visited[v]=1;	cout<<G.d[v]<<" ";
	Push(S,v);
	int e;
	while(!Isempty(S))
	{
		Gettop(S,v);
		for(int i=1;i<=G.dian;i++)
		{
			if(G.map[v][i]==1 && !visited[i])
			{
				cout<<G.d[i]<<" ";
				Push(S,i);
				visited[i]=1;
				v=i;
				i=1; 
			}
		}
		if(!Isempty(S))
			Pop(S,e);
	}
}
//-----------------DFS---digui------------------
int next(M G,int i,int w)
{
	for(int j=w+1;j<=G.dian;j++)
	{
		if(G.map[i][j]==1)
		{
			G.map[i][j]==0;
			return j;
		}
	}
	return 0;
}
void DFS1(M G,int i)
{
	int w=1;
	visited[i]=1;	cout<<G.d[i];
	for(w=next(G,i,w);w>0;w=next(G,i,w))	//利用next函数不断寻找节点指向的下一个元素 
	{
		if(!visited[w])
		{
			DFS1(G,w);
		}
	}
}
//-----------------邻接矩阵------------------------------ 
int locate(M G,Dtype a)
{
	for(int i=1;i<=G.dian;i++)
	{
		if(a==G.d[i])
		return i;
	}
	return 0;
}
void creat_map(M &G)
{//输入无向图的顶点数及弧数,建立G无向图 
	Dtype x,y;
	printf("请输入点数和弧数\n"); 
	cin>>G.dian>>G.hu;
	getchar();
	printf("请输入%d个点\n",G.dian);
	for(int i=1;i<=G.dian;i++)
		cin>>G.d[i];
	memset(G.map,0,sizeof(G.map));
	printf("请输入%d条弧\n",G.hu);
	getchar();
	for(int k=0;k<G.hu;k++)
	{
		int i,j;
		cin>>x>>y;
//		printf("x=%c y=%c ",x,y);
		getchar();
		i=locate(G,x);j=locate(G,y);
		G.map[i][j]=G.map[j][i]=1;
	}
	
	
}

//---------------------栈-----------------
//初始化 
void InitStack(Stack &S)
{
	S.base=(int *)malloc(MAX*sizeof(int));
	if(!S.base)
		return ;
	S.top=0;
	S.size=MAX;
}
//判空操作,返回 1 表示栈为空 
int Isempty(Stack S)
{
	if(S.top==0)
		return 1;
	return 0;
}
//入栈操作
void Push(Stack &S,int e)
{
	if(S.top>=S.size)
	{
		printf("该栈已满\n");
		return ;	
	}

	S.base[S.top++]=e;
}
//出栈操作
void Pop(Stack &S,int &e)
{
	if (Isempty(S))    return;     //栈为空 
    e = S.base[--S.top];
}
//Gettop 取栈顶元素
int  Gettop(Stack S,int &e){
 //若栈不空则用e返回S的栈顶元素
 
   if (S.top == 0)
         return 0;      //栈为空
   e = S.base[S.top-1];
   return e;
}

//----------------队列---------------- 
void InitSq(Sq &QQ)
{
	QQ.base=(int*)malloc(MAX * sizeof(int));	//S.base=(BiTree*)malloc(MAX*sizeof(BiTree)); 
	if(!QQ.base)
		return ;
	QQ.front=QQ.rear=QQ.tag=0;
}

int Getlen(Sq QQ)
{
	if(!QQ.tag)		//分情况讨论tag为 0,长度肯定为 0; 
		return 0;
	else
	{
		if(QQ.rear==QQ.front)
			return MAX;
		return (QQ.rear-QQ.front+MAX)%MAX;
	}
	
}

int Isempty(Sq QQ)
{
	if(QQ.front==QQ.rear && QQ.tag==0)
		return 1;
	return 0;	
}

void InSq(Sq &QQ,int e)
{

	if (QQ.front == QQ.rear && QQ.tag==1)	//tag与队头队尾必须同时满足 
	{
		printf("%d\n",QQ.tag);
		printf("队列已满\n");
		return ;
	}
	QQ.tag=1;						
    QQ.base[QQ.rear] = e;
    QQ.rear =(QQ.rear+1)%MAX;
}
void OutSq(Sq &QQ,int &e)
{
	if(QQ.front == QQ.rear && QQ.tag==0)
	{
		printf("队列已空\n");	
		return;
	}
	e=QQ.base[QQ.front];
	QQ.front=(QQ.front+1)%MAX;
	if(QQ.front == QQ.rear)
		QQ.tag=0;
}

void GetHead(Sq QQ,int &e)
{
    if(QQ.front == QQ.rear && QQ.tag==0) return;
    e = QQ.base[QQ.front];
} 
 

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/Singular__point/article/details/53174992
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞