图的深度优先遍历DFS(分别以邻接矩阵和邻接表实现)

/<span style="font-size:18px;">/1.邻接矩阵实现</span>
</pre><pre code_snippet_id="693878" snippet_file_name="blog_20150613_1_2994608" name="code" class="cpp">#include<iostream>
using namespace std;

#define MAX_VEX_NUM 50
typedef char VertexType;

	typedef enum{
		UDG,DG
}GraphType;

typedef struct Graph
{
	VertexType name[MAX_VEX_NUM];
	int adjMatrix[MAX_VEX_NUM][MAX_VEX_NUM];
	int vnum;
	int linenum;
	GraphType type;

}*MyGraph,G;

int isVisited[MAX_VEX_NUM];

int indexofv(MyGraph &g,VertexType c )
{
	for(int i=1;i<=g->vnum;i++)
	{
		if(g->name[i]==c)
			return i;
	}
}
void createGraph(G *g)
	
{
	int type;
	VertexType c1,c2;
	int v1,v2;
	cout<<"请输入顶点数量"<<endl;
    cin>>g->vnum;
	cout<<"请输入边数"<<endl;
	cin>>g->linenum;
	cout<<"请输入图的类型,0代表无向图,1代表有向图"<<endl;
	cin>>type;
	if(type==1)
	{
		g->type=DG;
		
	}else if(type==0)
	{
		g->type=UDG;
	}else
	{
		cout<<"输入类型不正确"<<endl;
		return;
	}

	//初始化邻接矩阵
	for(int i=1;i<=g->vnum;i++)
	{
		for(int j=1;j<=g->vnum;j++)
			{
				g->adjMatrix[i][j]=0;
			}
	}

	//输入顶点的名称
	cout<<"请输入顶点"<<endl;
	for(int i=1;i<=g->vnum;i++)
	{
		cin>>g->name[i];
	}

	//请输入由哪两个顶点组成边
	cout<<"请输入组成顶点的边"<<endl;
		
		
	//如果为无向图
	if(g->type==UDG)
	{
		for(int i=1;i<=g->linenum;i++)
		{	
			cin>>c1;
			cin>>c2;
			v1=indexofv(g,c1);
			v2=indexofv(g,c2);
			g->adjMatrix[v1][v2]=1;
			g->adjMatrix[v2][v1]=1;
		}
	}
	else
	{
		for(int i=1;i<=g->linenum;i++)
		{	
			cin>>c1;
			cin>>c2;
			v1=indexofv(g,c1);
			v2=indexofv(g,c2);
			g->adjMatrix[v1][v2]=1;
			//g->adjMatrix[v2][v1]=1;
		}
	}
	
	
	cout<<"邻接矩阵如下"<<endl;
	for(int i=1;i<=g->vnum;i++)
	{
		int count=0;
		for(int j=1;j<=g->vnum;j++)
		{
			count++;
			cout<<g->adjMatrix[i][j]<<" ";
			if(count==g->vnum)
				cout<<endl;
		}
	}

	cout<<"顶点信息如下:"<<endl;
	f
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接矩阵邻接表是两种常见的的存储方式。其中邻接矩阵是一个二维数组,用于表示中各个节点之间的关系;邻接表则是由链表组成的数组,用于表示每个节点的邻居节点。 下面分别介绍如何用C语言实现邻接矩阵邻接表深度优先遍历和广度优先遍历。 1. 邻接矩阵深度优先遍历 ```c #define MAX_VERTEX_NUM 100 // 最大顶点数 int visited[MAX_VERTEX_NUM]; // 记录节点是否被访问过 void DFS_Matrix(int matrix[][MAX_VERTEX_NUM], int vertex, int n) { visited[vertex] = 1; // 标记节点已被访问 printf("%d ", vertex); // 输出节点值 for (int i = 0; i < n; i++) { if (matrix[vertex][i] && !visited[i]) { // 如果节点i与vertex相邻且未被访问 DFS_Matrix(matrix, i, n); // 递归访问节点i } } } ``` 2. 邻接矩阵的广度优先遍历 ```c #define MAX_VERTEX_NUM 100 // 最大顶点数 int visited[MAX_VERTEX_NUM]; // 记录节点是否被访问过 void BFS_Matrix(int matrix[][MAX_VERTEX_NUM], int vertex, int n) { int queue[MAX_VERTEX_NUM], front = 0, rear = 0; // 定义队列 visited[vertex] = 1; // 标记节点已被访问 printf("%d ", vertex); // 输出节点值 queue[rear++] = vertex; // 将节点加入队列 while (front < rear) { // 队列不为空时循环 int v = queue[front++]; // 取出队首节点 for (int i = 0; i < n; i++) { if (matrix[v][i] && !visited[i]) { // 如果节点i与v相邻且未被访问 visited[i] = 1; // 标记节点已被访问 printf("%d ", i); // 输出节点值 queue[rear++] = i; // 将节点加入队列 } } } } ``` 3. 邻接表深度优先遍历 ```c #define MAX_VERTEX_NUM 100 // 最大顶点数 int visited[MAX_VERTEX_NUM]; // 记录节点是否被访问过 void DFS_List(LinkedList list[], int vertex) { visited[vertex] = 1; // 标记节点已被访问 printf("%d ", vertex); // 输出节点值 Node *p = list[vertex].head; // 取出节点的邻居链表 while (p) { // 遍历邻居链表 if (!visited[p->data]) { // 如果邻居节点未被访问 DFS_List(list, p->data); // 递归访问邻居节点 } p = p->next; } } ``` 4. 邻接表的广度优先遍历 ```c #define MAX_VERTEX_NUM 100 // 最大顶点数 int visited[MAX_VERTEX_NUM]; // 记录节点是否被访问过 void BFS_List(LinkedList list[], int vertex) { int queue[MAX_VERTEX_NUM], front = 0, rear = 0; // 定义队列 visited[vertex] = 1; // 标记节点已被访问 printf("%d ", vertex); // 输出节点值 queue[rear++] = vertex; // 将节点加入队列 while (front < rear) { // 队列不为空时循环 int v = queue[front++]; // 取出队首节点 Node *p = list[v].head; // 取出节点的邻居链表 while (p) { // 遍历邻居链表 if (!visited[p->data]) { // 如果邻居节点未被访问 visited[p->data] = 1; // 标记节点已被访问 printf("%d ", p->data); // 输出节点值 queue[rear++] = p->data; // 将节点加入队列 } p = p->next; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值