图的存储和遍历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");
}
结果: