实验10、构造无向图(算法7.1),深度和广度遍历 (4学时)

4)验收/测试用例                

《实验10、构造无向图(算法7.1),深度和广度遍历 (4学时)》

l 创建所示无向图

屏幕输出邻接矩阵

     0  1  0  0  0  1

     1  0  1  1  0  0

     0  1  0  1  1  0

     0  1  1  0  1  0

     0  0  1  1  0  1

     1  0  0  0  1  0

 

l 深度优先遍历

屏幕输出: 1 2 3 4 5 6

 

l 广度优先遍历

屏幕输出:1 2 6 3 4 5

#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
#define OK 1
#define ERROR 1
#define FALSE 0
#define TRUE 1
#define OVERFLOW -2
typedef int VertexType;
typedef int VRType;
typedef int Boolean;
typedef struct ArcCell {
	VRType adj;
}AdjMaxtrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
	VertexType vexs[MAX_VERTEX_NUM];
	AdjMaxtrix arcs;
	int vexnum,arcnum;
}MGraph;
typedef struct QNode {//队列节点结构体 
	int data;
	struct QNode *next;
} QNode,*QueuePtr;
typedef struct {
	QueuePtr front;
	QueuePtr rear;//队头,队尾指针 
}LinkQueue;
int LocateVex(MGraph G,int num)
{ 
	for(int i = 0;i<G.vexnum;i++){
		if( G.vexs[i] ==num)
			return i;
	}
	return -1;
}
void CreateGraph(MGraph *G)
{
	int i,j,k,v1,v2;
	printf("输入顶点数和边数:\n");
	scanf("%d %d",&G->vexnum,&G->arcnum);//输入顶点数和边数
	printf ("请输入所有顶点:");
	for (i=0;i<G->vexnum;i++) 
	{
		scanf ("%d",&G->vexs[i]);
	}
	for (i=0;i<G->vexnum;i++) 
	{
		for (j=0;j<G->vexnum;j++) 
		{
			G->arcs[i][j].adj = 0;
		}
	}
	for (k=0;k<G->arcnum;k++) 
	{
		printf ("请输入一条边所依附的顶点:");
		scanf ("%d %d",&v1,&v2);
		i=LocateVex(*G,v1);
		j=LocateVex(*G,v2);
		if (i!=-1&&j!=-1) 
		{
			G->arcs[i][j].adj = 1;
			G->arcs[j][i].adj = 1;
		}
	}
}
int PrintGraph(MGraph G)
{
	int i,j;
	for(i=0;i<G.vexnum;i++)
	{
		for(j=0;j<G.vexnum;j++)
		{
			printf("%3d", G.arcs[i][j]);
		}
		printf("\n");
	}
	return 0;
}
int FirstAdjVex(MGraph G,int v)//查找第一个临界点 
{
	int j,p=-1;
	for(j=0;j<G.vexnum;j++)
	{
		if(G.arcs[v][j].adj==1)
		{
			p=j;
			break;
		}
	}	
	return p;
} 
int NextAdjVex(MGraph G,int v,int w)//查找下一个临界点
{
	int j,p=-1;
	for(j=w+1;j<G.vexnum;j++)
	{
		if(G.arcs[v][j].adj==1)
		{
			p=j;
			break;
		}
	}
	return p;
}
Boolean visited[MAX_VERTEX_NUM];//设置全局变量,深度遍历 
void Dfs(MGraph G,int v)
{
	int w;
	visited[v]=TRUE;
	printf("%d ",G.vexs[v]);
	for(w =FirstAdjVex(G,v);w>=0;w = NextAdjVex (G,v,w)) 
	{
		if (!visited [w]) 
		{
			Dfs(G,w);
		}
	}
}
void DfsTraverse(MGraph G) 
{
	int v;
	for(v=0;v<G.vexnum;v++) 
	{
		visited[v]=FALSE;
	}
	for(v=0;v<G.vexnum;v++) 
	{
		if (!visited[v]) 
		{
			Dfs(G,v);
		}
	}
}
void InitQueue(LinkQueue *Q)
{  
	(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));  
	if((*Q).front)   
		(*Q).front->next=NULL; 
}  
int QueueEmpty(LinkQueue Q)
{  
	if(Q.front==Q.rear) return 0;  
	return 1; 
}
void EnQueue(LinkQueue *Q,int T)
{  
	QueuePtr p;  
	p=(QueuePtr)malloc(sizeof(QNode));  
	if(p)   
		p->data=T;
		p->next=NULL;         
		(*Q).rear->next=p;   
		(*Q).rear=p; 
}
void DeQueue(LinkQueue *Q,int *e)
{  
	QueuePtr p;  
	if((*Q).front!=(*Q).rear)
	{   
		p=(*Q).front->next;   
		*e=p->data;   
		(*Q).front->next=p->next;  
	if((*Q).rear==p)   
		(*Q).rear=(*Q).front;  
	free(p);  
	} 
} 
void BfsTraverse(MGraph G)
{
	int v,u,w;
	LinkQueue Q;
	for(v=0;v<G.vexnum;v++)
	visited[v]=FALSE;
	InitQueue(&Q);
	for (v=0;v<G.vexnum;v++) 
	{
		if (!visited[v]) 
		{
			visited[v]=TRUE;
			printf("%d ",G.vexs[v]);
			EnQueue (&Q,v);
			while (Q.front!=Q.rear) 
			{
				DeQueue(&Q,&u);
				for (w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)) 
				{
					if (!visited[w]) 
					{
						visited[w]=TRUE;
						printf("%d ",G.vexs[w]);
						EnQueue (&Q,w);
					}
				}
			}
		}
	}
}
int main()
{
	printf("***************************************\n");
	printf("*************** 无向网图 **************\n");
	printf("***************************************\n");
	printf("************ 1.构建网图  **************\n");
	printf("************ 2.输出邻接矩阵  **********\n");
	printf("************ 3.深度优先遍历  **********\n");
	printf("************ 4.广度优先遍历  **********\n");
	printf("************ 5.退出  ******************\n");
	printf("***************************************\n");
	while(true)
	{
		int num1;
		printf("请选择:"); 
		scanf("%d",&num1);
		if(num1==5) break;
		MGraph G; 
		switch(num1)
		{
			case 1:
				CreateGraph(&G);
				break;
			case 2:
				printf("邻接矩阵:\n");
				PrintGraph(G);
				break;
			case 3:
				printf("深度遍历:");
				DfsTraverse(G);
				printf("\n");
				break;
			case 4:
				printf("广度遍历:");
				BfsTraverse(G);
				printf("\n");
				break;
		}
	} 
	return 0;
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/e___xiaocaicai/article/details/78876598
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞