码迷,mamicode.com
首页 > 编程语言 > 详细

有向图和无向图的数组C++实现

时间:2018-08-09 23:02:48      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:using   rect   bool   capacity   cto   等于   span   ret   ==   

结点类Noded.h

不需要存储索引

#pragma once
#ifndef NODE_H
#define NODE_H
#include<iostream>
using namespace std;

class Node
{
public:
    Node(char data = 0);
    char m_cData;
    bool m_IsVisited;
};

#endif // !NODE_H

Node.cpp

将数据赋值给数据成员m_cData,是否访问置为否

#include"Node.h"

Node::Node(char data)
{
    m_cData = data;
    m_IsVisited = false;
}

需要实现的方法

图类cMap.h

#pragma once
#ifndef CMAP_H
#define CMAP_H
#include"Node.h"
#include<vector>
class cMap
{
public:
    cMap(int capacity);
    ~cMap();
    bool addNode(Node *pNode);//向图中加入顶点(结点)
    void resetNode();//重置顶点
    bool setValueToMatrixForDirectedGraph(int row, int col, int val = 1);//为有向图设置邻接矩阵
    bool setValueToMatrixForUndirectedGraph(int row, int col, int val = 1);//为无向图设置邻接矩阵

    void printMatrix();//打印邻接矩阵

    void depthFirstTraverse(int nodeIndex);//深度优先遍历
    void breadthFirstTraverse(int nodeIndex);//广度优先遍历
    void breathFirstTraverseImpl(vector<int> preVec);

private:
    bool getValueFromMatrix(int row,int col,int &val);//从矩阵中获取权值
    void breathFirstTraverse(int nodeIndex);//广度优先遍历实现函数

private:
    int m_iCapacity;//图中最多可以容纳的顶点数
    int m_iNodeCount;//已经添加的结点(顶点)个数
    Node *m_pNodeArray;//用来存放顶点数组
    int *m_pMatrix;//用来存放邻接矩阵
};

#endif // !CMAP_H

构造函数:

传入图容量参数给数据成员m_iCapacity

已经添加的结点数m_iNodeCount置为0

为顶点数组申请内存

申请m_iCapacity*m_iCapacity的矩阵

将矩阵元素全部置为0

cMap::cMap(int capacity)
{
    m_iCapacity = capacity;
    m_iNodeCount = 0;
    m_pNodeArray = new Node[m_iCapacity];
    m_pMatrix = new int[m_iCapacity*m_iCapacity];
    for (int i = 0; i < m_iCapacity*m_iCapacity; i++)
    {
        m_pMatrix[i] = 0;
    }
}

析构函数

删除顶点数组指针

删除邻接矩阵指针

cMap::~cMap()
{
    delete []m_pNodeArray;
    delete []m_pMatrix;
}

添加结点

判断传入的pNode参数是否为空,如果pNode为空,返回错误

将pNode的数据部分m_cData传入到以已经添加的结点个数为索引的顶点数组

已经添加结点个数++

返回正确结果

bool cMap::addNode(Node *pNode)
{
    if (pNode == NULL) 
    {
        return false;
    }
    m_pNodeArray[m_iNodeCount].m_cData = pNode->m_cData;
    m_iNodeCount++;
    return true;
}

重置结点

将已经添加的结点的m_IsVisited置为未访问

void cMap::resetNode()
{
    for (int i = 0; i < m_iNodeCount; i++)
    {
        m_pNodeArray[i].m_IsVisited = false;
    }
}

为有向图设置邻接矩阵

判断行列的合法性

如果行小于0,行大于等于最大容量,返回错误

如果列小于0,列大于等于最大容量,返回错误

图如下:

技术分享图片

上图的邻接矩阵如下:

技术分享图片

以(A,B)即(0,1),0行1列,0*8+1=1。

满足row*m_iCapacity计算的索引

bool cMap::setValueToMatrixForDirectedGraph(int row, int col, int val)
{
    if(row<0 || row>=m_iCapacity)
    {
        return false;
    }
    if (col < 0 || col >= m_iCapacity)
    {
        return false;
    }
    m_pMatrix[row*m_iCapacity + col] = val;
    return true;
}

为无向图设置邻接矩阵

逻辑同上

col*m_iCapacity和row*m_iCapacity+col与主对角线成轴对称

bool cMap::setValueToMatrixForUndirectedGraph(int row, int col, int val)
{
    if (row<0 || row >= m_iCapacity)
    {
        return false;
    }
    if (col < 0 || col >= m_iCapacity)
    {
        return false;
    }
    m_pMatrix[row*m_iCapacity + col] = val;
    m_pMatrix[col*m_iCapacity + row] = val;
}

 

有向图和无向图的数组C++实现

标签:using   rect   bool   capacity   cto   等于   span   ret   ==   

原文地址:https://www.cnblogs.com/Java-Starter/p/9452026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!