有向圖和無向圖的數組C++實現

來源:互聯網
上載者:User

標籤: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++實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.