矩阵方式存储图,深度优先遍历代码(c++)

图的代码实现

头文件

#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;  //通过该结构体来存储图的矩阵和顶点,通过指针来操控

//创建邻接矩阵, g是指向图的指针变量,m[][MAXV]是邻接矩阵,d[]是顶点表,n顶点个数
void CreateGraph(AdjMatrix g, int m[][MAXV], ElemType d[], int n);

//显示邻接矩阵
void DispGraph(AdjMatrix g);

//取顶点v的第一个邻接点
int GetFirst(AdjMatrix g, int v);

//取顶点v的位于顶点t之后的下一个邻接点
int GetNext(AdjMatrix g, int v, int t);

//以顶点v为起点,深度优先遍历图
void DFS(AdjMatrix g, int v, int visited[]);


 

实现代码


#include "graph.h"

//创建邻接矩阵, g是指向图的指针变量,m[][MAXV]是邻接矩阵,d[]是顶点表,n顶点个数
//将矩阵和顶点存储到结构体中,用结构体中的矩阵和顶点表来表示图
void CreateGraph(AdjMatrix g, int m[][MAXV], ElemType d[], int n)
{
  int i, j;

  g->n = n; //为图g的顶点个数域赋值

  for (i = 0; i < n; i++) {
    g->data[i] = d[i]; //为图g的顶点表赋值

    for (j = 0; j < n; j++) //为图g的邻接矩阵赋值
      g->arcs[i][j] = m[i][j];
  }
}

//显示邻接矩阵
void DispGraph(AdjMatrix g)
{
  int i, j;

  cout << "图的顶点:  ";
  for (i = 0; i < g->n; i++) //输出图g的顶点
    cout << " " << g->data[i];

  cout << "\n\n图的邻接矩阵:" << endl;
  //外层for循环控制对每一个顶点进行遍历
  for (i = 0; i < g->n; i++) {
    cout << " " << g->data[i]; //输出顶点i的数据

    for (j = 0; j < g->n; j++) //在输出顶点i的数据之后,输出顶点i对应在邻接矩阵的第i行的数据
      cout << " " << g->arcs[i][j];
    cout << endl;
  }
  cout << endl;
}

//取顶点v的第一个邻接点
int GetFirst(AdjMatrix g, int v)
{
  int j;
  if (v < 0 || v >= g->n) //顶点表的下标范围在0到g->n-1之间,下标即是顶点的序号
  {
    cout << "参数v超出范围" << endl;
    return -1;
  }

  for (j = 0; j < g->n; j++)
    if (g->arcs[v][j] == 1) //扫描顶点v所在行的元素值,第一个元素值为1的对应的顶点即是顶点v的第一个邻接点
      return j; //返回顶点v的第一个邻接点的序号
  return -1;
}

//取顶点v的位于顶点t之后的下一个邻接点
//#深度优先遍历,当前起点没有下一个结点,返回找下一个结点
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++) //在矩阵的第v行,从第t+1列开始扫描
    if (g->arcs[v][j] == 1)
      return j;
  return -1;
}

//以顶点v为起点,深度优先遍历图
void DFS(AdjMatrix g, int v, int visited[])
{
  int u;
  cout << " " << g->data[v]; //访问起点v
  visited[v] = 1; //访问标志记为1,代表已访问

  u = GetFirst(g, v); //取顶点v的第一个邻接点u,#该函数是扫描矩阵的v行中的1,扫描到则返回1所在的列数,没有则返回-1
  while (u != -1) {  //#表示有相连接的点u
    if (visited[u] == 0) { //如果顶点u未被访问
      DFS(g, u, visited); //以顶点u为起点,继续深度优先遍历(递归)
    }
	//#这个函数的作用是,当深度优先遍历没有下一个结点断开返回时,找上一次的剩下的结点
    u = GetNext(g, v, u); //回到顶点u,取顶点v的位于顶点u之后的下一个邻接点,如有,继续循环过程
  }
}

主函数

#include "graph.h"

int main()
{
  MGraph graph; //定义图结构变量graph
  AdjMatrix g = &graph; //定义指针变量g指向图graph

  char d[MAXV] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; //定义一维数组d作为顶点表

  //定义一维数组visited并初始化,作为访问标记。
  int visited[MAXV] = {0, 0, 0, 0, 0, 0, 0};

  //定义二维数组m为邻接矩阵
 /* int m[MAXV][MAXV] = {
      {0, 0, 1, 0, 0, 0, 1},
      {0, 0, 1, 0, 0, 0, 0},
      {1, 1, 0, 0, 0, 0, 1},
      {0, 0, 0, 0, 0, 0, 1},
      {0, 0, 0, 0, 0, 1, 1},
      {0, 0, 0, 0, 1, 0, 0},
      {1, 0, 1, 1, 1, 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 },
  };


  //已知图的顶点表和邻接矩阵数据,创建图graph的邻接矩阵
  CreateGraph(g, m, d, MAXV);

  //显示邻接矩阵
  DispGraph(g);
  cout << "深度优先遍历:";

  //依次选择未被访问的顶点作为起点对图进行深度优先遍历
  for (int v = 0; v < g->n; v++)//选取一个点赋给DFS()函数
    if (visited[v] == 0) //找未访问过的顶点作为起点
      DFS(g, v, visited);
  cout << endl;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值