图(二叉树)邻接矩阵(数组描述)

来源:互联网 发布:画logo的软件 编辑:程序博客网 时间:2024/06/18 09:20
//结点类//.h#ifndef NODE#define NODEclass node{public:    node(char data=0);    char m_cData; //顶点数据    bool m_bIsVisited; //顶点是否被访问};#endif//.cpp#include"node.h"node::node(char data){    m_cData = data;    m_bIsVisited = false;}
//图类//.h#include<vector>#include"node.h"using namespace std; 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 deepthFirstTraverse(int nodeIndex);//深度优先遍历    void breadthFirstTraverse(int nodeIndex);//广度优先遍历private:    bool getValueFromMatrix(int row, int col, int &val);//从矩阵中获取权值    void breadthFirstTraverseImpl(vector<int>preVec);//广度优先遍历实现函数    int m_iCapacity;//图中最多可以容纳的顶点数    int m_iNodeCount;//已经添加的顶点个数    node *m_pNodeArray;//用来存放顶点的数组    int *m_pMatrix;//用来存放邻接矩阵};//.cpp#include"Cmap.h"#include<iostream>#include<vector>using namespace std;Cmap::Cmap(int capacity){    m_iCapacity = capacity;    m_iNodeCount = 0;    m_pNodeArray = new node[m_iCapacity];     m_pMatrix = new int[m_iCapacity*m_iCapacity];    memset(m_pMatrix, 0, m_iCapacity*m_iCapacity*sizeof(int));    //memset(m_pMatrix, 0, m_iCapacity*m_iCapacity*sizeof(int))    //等价于    //for(int i=0;i<m_iCapacity*m_iCapacity;i++)    //{    //  m_=Matrix[i]=0;    //}}Cmap::~Cmap(){    delete[] m_pMatrix;    delete[] m_pNodeArray;}bool Cmap::AddNode(node *pNode){    if (pNode == NULL)    {        return false;    }    m_pNodeArray[m_iNodeCount].m_cData = pNode->m_cData;    m_iNodeCount++;    return true;}void Cmap::resetNode(){    for (int i = 0; i < m_iCapacity; i++)    {        m_pNodeArray[i].m_bIsVisited = false;    }}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;}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;    return true;}bool Cmap::getValueFromMatrix(int row, int col, int &val){    if (row < 0 || row >= m_iCapacity)    {        return false;    }    if (col < 0 || col >= m_iCapacity)    {        return false;    }    val = m_pMatrix[row*m_iCapacity + col];    return true;}void Cmap::printMatrix(){    for (int i = 0; i < m_iCapacity; i++)    {        for (int j = 0; j < m_iCapacity; j++)        {            cout << m_pMatrix[i*m_iCapacity + j] << " ";        }        cout << endl;    }}void Cmap::deepthFirstTraverse(int nodeIndex){    int value = 0;    cout << m_pNodeArray[nodeIndex].m_cData << " ";    m_pNodeArray[nodeIndex].m_bIsVisited = true;    for (int i = 0; i < m_iCapacity; i++)    {        getValueFromMatrix(nodeIndex, i, value);        if (value == 1)        {            if (m_pNodeArray[i].m_bIsVisited)            {                continue;//跳出执行下一次循环            }            else            {                deepthFirstTraverse(i);//进行递归            }        }        else        {            continue;//跳出执行下一次循环        }    }  }void Cmap::breadthFirstTraverse(int nodeIndex){    vector<int> curVec;    cout << m_pNodeArray[nodeIndex].m_cData << " ";    m_pNodeArray[nodeIndex].m_bIsVisited = true;    curVec.push_back(nodeIndex);    breadthFirstTraverseImpl(curVec);}void Cmap::breadthFirstTraverseImpl(vector<int>preVec){    vector<int>curVec;    int value = 0;    for (int i = 0; i < (int)preVec.size(); i++)    {        for (int j = 0; j < m_iCapacity; j++)        {            getValueFromMatrix(preVec[i], j, value);            if (value != 0)            {                if (m_pNodeArray[j].m_bIsVisited)                {                    continue;//执行下一次循环                }                else                {                    cout << m_pNodeArray[j].m_cData << " ";                    m_pNodeArray[j].m_bIsVisited = true;                    curVec.push_back(j);                }            }        }    }    if (curVec.size() == 0)    {        return;    }    else    {        breadthFirstTraverseImpl(curVec);    }}