数据结构图的数组表示法以及深度,广度遍历

#include"stdio.h"
#include"stdlib.h"
#define MAX_VERTEX_NUM 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define maxsize 100
typedef int QElemType;
typedef int VRType;
typedef int InfoType;
typedef int VertexType;
typedef int Status;
int visited[MAX_VERTEX_NUM];//全局数组变量


第一部分      存储结构:

1.边存储结构

typedef struct ArcCell{
	VRType adj;
	//InfoType * info;//此程序并未涉及权值
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//AdiMatrix 为一‘该结构体类型的数组类型’,可用于定义‘该结构体类型数据的数组变量’


1.图数组表示法存储结构

typedef struct {
	VertexType vexs[MAX_VERTEX_NUM];
	AdjMatrix arcs;
	int vexnum,arcnum;
	char kind;
}MGraph;


 

第二部分     基础操作

1图的建立操作(仅仅写了一个UDN的建立)

int LocateVex(MGraph *G,int vex){
	int i;
	for (i=0;i<G->vexnum;i++){
		if(vex == G->vexs[i])
			break;
	}
	if(i<G->vexnum)return i;
	else return ERROR;
		
}
Status CreateGraph (MGraph *G){
	//int CreateDG (MGraph *);//函数申明
	//int CreateDN (MGraph *);//函数申明
	//int CreateUDG (MGraph *);//函数申明
	int CreateUDN (MGraph *);//函数申明
	printf ("Please choose kind of graph(1DG/2DN/3UDG/4UDN).\n");
	scanf ("%c",&G->kind);
	switch (G->kind){
	//case '1': CreateDG(G);break;
	//case '2': CreateDN(G);break;
	//case '3': CreateUDG(G);break;
	case '4': CreateUDN(G);break;//此处G为指针
	default :return ERROR;
	}
	return OK;
}
int CreateUDN (MGraph *G1){
	int i,j,k;
	int v1,v2;//邻接点变量用于表示变或弧
	printf ("Please enter values for G.vexnum and G.arcnum.\n");
	scanf ("%d%d",&G1->vexnum,&G1->arcnum);
	printf ("Please enter value for vertexs.\n");
	for (i=0;i<G1->vexnum;i++)
		scanf("%d",&G1->vexs[i]);
	for (i=0;i<MAX_VERTEX_NUM;i++){
		for (j=0;j<MAX_VERTEX_NUM;j++)
			G1->arcs[i][j].adj = 0;
	}//初始化边矩阵,网则初始化为无穷大INFINITY,图则初始化为0
	printf("Please enter ArcCell,example:<1,2>,enter '1,2'\n");
	for (k=1;k<=G1->arcnum;k++){
		scanf ("%d,%d",&v1,&v2);
		i=LocateVex (G1,v1);//LocataVex定位,G1为指针类型
		j=LocateVex (G1,v2);
		G1->arcs[i][j].adj = 1;
		G1->arcs[j][i] = G1->arcs[i][j];
	}
	return OK;
}


2.DFSTraverse操作

Status DFSTraverse(MGraph G){
	Status DFS (MGraph, int );//函数申明
	int v;
	for (v=0; v<G.vexnum; v++)
		visited[v]=0;
	for (v=0; v<G.vexnum; v++){
		if (visited[v]==0)
			DFS (G, v);
	}
	return OK;
}
Status DFS(MGraph G, int v){
	int FirstAdjVex (MGraph, int );
	int NextAdjvex (MGraph, int, int );
	int w;
	visited[v]=1;
	printf ("%3d",G.vexs[v]);
	for(w=FirstAdjVex (G, v);w>0;w=NextAdjvex (G, w, v)){
		if (visited[w]==0)
			DFS (G, w);
	}
	return OK;
}
int NextAdjvex (MGraph G, int v, int w) {
	int i,t=0;
	for (i=w+1; i<G.vexnum; i++) {
		if (G.arcs[v][i].adj==1 && visited[i]==0) {
			t=i;
			break;
		}
		else t=0;
	}
	return t;
}
int FirstAdjVex (MGraph G, int v){
	int i,t=0;
	for (i=0; i<G.vexnum; i++){
		if(G.arcs[v][i].adj==1&&visited[i]==0){
			t=i;
			break;
		}
		else t=0;
	}
	return t;
}


 

3.BFSTraverse操作,需要借助循环队列

3.1循环队列存储结构以及基本操作

typedef struct{
	QElemType *base;
	int front;
	int rear;
}SqQueue;
Status InitQueue_Sq(SqQueue *Q){
	Q->base=(QElemType *)malloc(maxsize*sizeof(QElemType));
	if(!Q->base)exit(OVERFLOW);
	Q->front=Q->rear=0;
	return OK;
}
Status EnQueue_Sq(SqQueue *Q,QElemType e){
	if((Q->rear+1)%maxsize==Q->front)exit(0);
	Q->base[Q->rear]=e;
	Q->rear=(Q->rear+1)%maxsize;
	return OK;
}
Status DeQueue_Sq(SqQueue *Q,QElemType *e){
	if(Q->rear==Q->front)exit(0);
	*e=Q->base[Q->front];
	Q->front=(Q->front+1)%maxsize;
	return OK;
}
Status GetFront_Sq(SqQueue Q,QElemType *e){
	if(Q.rear==Q.front)return ERROR;
	else *e=Q.base[Q.front];
	return OK;
}


 

3.2BFS操作

Status BFSTraverse (MGraph G){
	int v,a,i;
	SqQueue Q;
	for (v=0; v<G.vexnum; v++)
		visited[v]=0;//标志数组初始化
	InitQueue_Sq (&Q);
	for (v=0; v<G.vexnum; v++) {
		if (visited[v] == 0) {
			visited[v] = 1;
			printf ("%3d",G.vexs[v]);
			EnQueue_Sq (&Q,v);
		}
		while(Q.rear!=Q.front){
			GetFront_Sq (Q,&a);
			for (i=0; i<G.vexnum; i++){
				if (G.arcs[v][i].adj==0)
					continue;
				if (visited[v] == 1)
					continue;
				else {
					visited[i] = 1;
					printf ("%3d",G.vexs[i]);
					EnQueue_Sq (&Q,i);
				}
			}
			DeQueue_Sq (&Q,&a);
		}
	}
}


 

最后一部分:main函数

int main (){
	int i,j;
	MGraph G;
	CreateGraph (&G);
	for(i=0;i<G.vexnum;i++)
		printf ("%3d",G.vexs[i]);
	printf ("\n");
	for (i=0; i<G.vexnum; i++){
		for (j=0; j<G.vexnum; j++){
			printf ("%2d",G.arcs[i][j]);
			if (j==G.vexnum-1)
				printf("\n");
		}
	}
	DFSTraverse(G);
	printf("\n");
	BFSTraverse (G);
	system("pause");
	return OK;
}


 程序演示截图

微笑吐舌头偷笑大笑生气得意羡慕奋斗

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于邻接矩阵存储的深度优先遍历广度优先遍历的实现代码: ```c++ #include<iostream> #include<queue> using namespace std; #define MAXN 1000 int n,m;//n个顶点,m条边 int graph[MAXN][MAXN];//邻接矩阵存储 bool visited[MAXN];//记录节点是否被访问过 //深度优先遍历 void dfs(int u){ visited[u]=true;//标记该节点已经被访问过 cout<<u<<" ";//输出该节点 for(int i=1;i<=n;i++){//遍历该节点的所有邻接节点 if(graph[u][i]&&!visited[i]){//如果该节点与邻接节点有边,并且邻接节点未被访问过 dfs(i);//递归遍历邻接节点 } } } //广度优先遍历 void bfs(int u){ queue<int> q;//定义队列 q.push(u);//将起点加入队列 visited[u]=true;//标记起点已经被访问过 while(!q.empty()){//当队列不为空时 int cur=q.front();//取出队列头元素 q.pop();//弹出队列头元素 cout<<cur<<" ";//输出该节点 for(int i=1;i<=n;i++){//遍历该节点的所有邻接节点 if(graph[cur][i]&&!visited[i]){//如果该节点与邻接节点有边,并且邻接节点未被访问过 visited[i]=true;//标记邻接节点已经被访问过 q.push(i);//将邻接节点加入队列 } } } } int main(){ //输入的顶点数和边数 cin>>n>>m; //初始化邻接矩阵 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ graph[i][j]=0; } } //读入边 for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; graph[u][v]=graph[v][u]=1; } //深度优先遍历 cout<<"深度优先遍历:"; for(int i=1;i<=n;i++){ if(!visited[i]){ dfs(i); } } cout<<endl; //重新初始化visited数组 for(int i=1;i<=n;i++){ visited[i]=false; } //广度优先遍历 cout<<"广度优先遍历:"; for(int i=1;i<=n;i++){ if(!visited[i]){ bfs(i); } } cout<<endl; return 0; } ``` 在输入部分,我们需要输入的顶点数和边数,然后使用邻接矩阵存储。在读入边时,我们需要注意无向的边是双向的,因此需要把两个方向的边都加上。 深度优先遍历使用递归实现,从一个节点开始,遍历该节点的所有邻接节点,对于每个未被访问过的邻接节点,继续递归遍历广度优先遍历使用队列实现,从一个节点开始,将该节点加入队列尾部,然后遍历该节点的所有邻接节点,对于每个未被访问过的邻接节点,将其加入队列尾部。接着从队列头部取出一个节点,重复上述过程直到队列为空。 完整代码如下:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值