数据结构-图的存储和遍历17

图的存储和遍历17

这部分代码比较多,然后文件已经打包,
先看看邻接矩阵,这个是找的资料,看着不错就拿来用吧.在这里插入图片描述
就以下面这个多为例吧,代码包含,图的存储和深度优先遍历和广度优先遍历。
在这里插入图片描述
请看深度优先:
在这里插入图片描述
广度优先:
在这里插入图片描述
接下来是实现过程:

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace  std;

typedef struct _tag_MGraph
{
	int count;
	char** v;
	int** matrix;
} TMGraph;

void Print_mydata(char *p)
{
	printf("%s",p);
}

typedef void(pFun)(char *);

TMGraph *CreateMap(char **m_v, int n)
{
//1.存储顶点

	TMGraph *ret = (TMGraph *)malloc(sizeof(TMGraph));
	ret->count = n;
	ret->v = (char **)malloc(sizeof(char *)*n);//存储顶点
	for (int i = 0; i < n;i++)
	{
		ret->v[i] = m_v[i];//传入地址而已
	}

//2.为邻接矩阵开辟空间
	ret->matrix = (int **)malloc(sizeof(int *)*n);//n 个二级指针

	int *p = (int *)malloc(sizeof(int)*n*n);

	for (int i = 0; i < n;i++)
	{
		//ret->matrix[i] = (int *)malloc(sizeof(int)*n);	//1.看我的内存三种模型图,你便会明白
		ret->matrix[i] = p + i*n;                           //2.充分说明内存是顺序存储的
		for (int j = 0; j < n;j++)
		{
			ret->matrix[i][j] = 0;
		}
	}
	return ret;
}

int MGraph_AddEdge(TMGraph * graph, int v1, int v2, int w) // O(1)
{

	if (v1<graph->count&&v2<graph->count&&v1>=0&v2>=0&w>=0)
	{
		graph->matrix[v1][v2] = w;

	}
	return 0;
}

void print_data(TMGraph *graph)
{
	printf("结点对应关系:\n");
	if (!graph || graph->count <= 0)
	{
		return;
	}

	char buf[16] = { 0 };
	for (int i = 0; i < graph->count;i++)
	{
		memset(buf, 0, 16);

		for (int j = 0; j < graph->count;j++)
		{
			if (graph->matrix[i][j] >0)
			{
				sprintf(buf, "<%s,%s,%d>", graph->v[i], graph->v[j], graph->matrix[i][j]);
				printf("%s ",buf);
			}
		}
	}
	printf("\n");
}


void PrintLinJieArray(TMGraph *graph)
{
	printf("邻接矩阵:\n");
	printf("------------------------\n");
	printf("   ");
	for (int i = 0; i < graph->count; i++)
	{
		cout << graph->v[i] << "  ";
	}
	cout << endl;

	for (int i = 0; i < graph->count; i++)
	{
		printf("%s  ", graph->v[i]);
		for (int j = 0; j < graph->count; j++)
		{
			printf("%d  ", graph->matrix[i][j]);
		}
		printf("\n");
	}
	printf("------------------------\n");

}


void dfs(TMGraph* graph, int v, int visited[], pFun* pFunc)
{
	pFunc(graph->v[v]);
	visited[v] = 1;
	pFunc(",");

	for (int j = 0; j < graph->count;j++)
	{
		if (graph->matrix[v][j] != 0 && visited[j]== 0)
		{
			dfs(graph, j, visited, pFunc);
		}
	}
}
//深度优先遍历
void MGraph_DFS(TMGraph* graph, int v, pFun* pFunc)
{	
		int i = 0;
		int *visited = (int *)calloc(graph->count, sizeof(int));
		//dfs(graph, v, visited, pFunc);

		for (i = 0; i < graph->count; i++)
		{
			if (!visited[i])
			{
				dfs(graph, i, visited, pFunc);
			}
		}

		printf("\n");	
}


void main()
{
	char* v[] = { "A", "B", "C", "D", "E", "F" };//是一个指针数组

	TMGraph *graph = CreateMap(v, 6);
	MGraph_AddEdge(graph, 0, 1, 1);
	MGraph_AddEdge(graph, 0, 2, 1);
	MGraph_AddEdge(graph, 0, 3, 1);
	MGraph_AddEdge(graph, 1, 5, 1);
	MGraph_AddEdge(graph, 1, 4, 1);
	MGraph_AddEdge(graph, 2, 1, 1);
	MGraph_AddEdge(graph, 3, 4, 1);

	//打印邻接矩阵
	PrintLinJieArray(graph);
	//打印前后关系及其权值
	print_data(graph);

	//深度优先
	printf("深度优先遍历:DFS\n");
	MGraph_DFS(graph, 0, Print_mydata);

	system("pause");
}

结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值