图的代码实现
头文件
#include <iostream>
using namespace std;
#define MAXV 7
typedef int weight;
typedef char ElemType;
typedef struct {
weight arcs[MAXV][MAXV];
ElemType data[MAXV];
int n;
} MGraph, *AdjMatrix;
void CreateGraph(AdjMatrix g, int m[][MAXV], ElemType d[], int n);
void DispGraph(AdjMatrix g);
int GetFirst(AdjMatrix g, int v);
int GetNext(AdjMatrix g, int v, int t);
void DFS(AdjMatrix g, int v, int visited[]);
实现代码
#include "graph.h"
void CreateGraph(AdjMatrix g, int m[][MAXV], ElemType d[], int n)
{
int i, j;
g->n = n;
for (i = 0; i < n; i++) {
g->data[i] = d[i];
for (j = 0; j < n; j++)
g->arcs[i][j] = m[i][j];
}
}
void DispGraph(AdjMatrix g)
{
int i, j;
cout << "图的顶点: ";
for (i = 0; i < g->n; i++)
cout << " " << g->data[i];
cout << "\n\n图的邻接矩阵:" << endl;
for (i = 0; i < g->n; i++) {
cout << " " << g->data[i];
for (j = 0; j < g->n; j++)
cout << " " << g->arcs[i][j];
cout << endl;
}
cout << endl;
}
int GetFirst(AdjMatrix g, int v)
{
int j;
if (v < 0 || v >= g->n)
{
cout << "参数v超出范围" << endl;
return -1;
}
for (j = 0; j < g->n; j++)
if (g->arcs[v][j] == 1)
return j;
return -1;
}
int GetNext(AdjMatrix g, int v, int t)
{
int j;
if (v < 0 || v >= g->n || t < 0 || t >= g->n) {
cout << "参数v或t超出范围" << endl;
return -1;
}
for (j = t + 1; j < g->n; j++)
if (g->arcs[v][j] == 1)
return j;
return -1;
}
void DFS(AdjMatrix g, int v, int visited[])
{
int u;
cout << " " << g->data[v];
visited[v] = 1;
u = GetFirst(g, v);
while (u != -1) {
if (visited[u] == 0) {
DFS(g, u, visited);
}
u = GetNext(g, v, u);
}
}
主函数
#include "graph.h"
int main()
{
MGraph graph;
AdjMatrix g = &graph;
char d[MAXV] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
int visited[MAXV] = {0, 0, 0, 0, 0, 0, 0};
int m[MAXV][MAXV] = {
{ 0, 0, 1, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 1, 1, 0, 0 },
};
CreateGraph(g, m, d, MAXV);
DispGraph(g);
cout << "深度优先遍历:";
for (int v = 0; v < g->n; v++)
if (visited[v] == 0)
DFS(g, v, visited);
cout << endl;
}