zoukankan      html  css  js  c++  java
  • C++_将图二维矩阵形式转为邻接表结构

    用二维矩阵表示图的结构

    我们用c++中的vector容器来表示二维矩阵,

      #include<vector>
      using std::vector
      vector<vector<int>> Array;
    

    关于vector的基本操作可以参考这篇文章,
    http://www.cnblogs.com/wei-li/archive/2012/06/08/2541576.html

    定义邻接表中链表节点和数据节点的数据结构

    /*节点的值*/
    typedef struct _ValNode
    {
        // 指向下一个数据节点
        struct _ValNode * next;
        int val;
    }VALNODE, *PVALNODE;
    
    /*头结点*/
    typedef struct _LsNode
    {
        int val;
        // 指向下一个头结点
        struct _LsNode * next;
        // 指向第一条边
        struct _ValNode * firstEdge;
    }LSNODE, *PLSNODE;
    

    初始化

    进行初始化,主要是个每个数据节点分配内存,并将 firstEdge 指针置为null。

    /* 初始化 */
    void Graphics::init(int NodeNums)
    {
        // resize 会默认构造新元素(会调用构造函数),而reserve不会
        isTrav.resize(NodeNums, 0);
    
        PLSNODE pNew = nullptr;
        PLSNODE pTiles = nullptr;
        for (size_t i = 0; i < NodeNums; i++)
        {
            // 如果头结点为空的话
            if (pHead == nullptr)
            {
                pHead = new LSNODE;
                pHead->val = i;
                pHead->firstEdge = nullptr;
                pHead->next = nullptr;
    
                pTiles = pHead;
            }
            else
            {
                pNew = new LSNODE;
                pNew->val = i;
                pNew->firstEdge = nullptr;
                pNew->next = nullptr;
    
                pTiles->next = pNew;
                pTiles = pNew;
            }
        }
    }
    

    转二维数组为邻接表

    /* 插入数据 */
    void Graphics::insert(int origin, int end)
    {
        PLSNODE pDest = pHead;
        for (size_t i = 0; i < this->NodeNum; i++)
        {
            if (pDest->val == origin)
                break;
            else
                pDest = pDest->next;
        }
    
        PVALNODE dataNode = new VALNODE;
        dataNode->next = nullptr;
        dataNode->val = end;
    
        if (pDest->firstEdge == nullptr)
        {
            pDest->firstEdge = dataNode;
        }
        else
        {
            PVALNODE pTileNode = pDest->firstEdge;
            while (pTileNode->next != nullptr)
            {
                pTileNode = pTileNode->next;
            }
            pTileNode->next = dataNode;
        }
    }
    
    /* 构造函数 */
    Graphics::Graphics(vector<vector<int>> data, size_t lines, size_t edges)
    {
        init(lines);
    
        this->NodeNum = lines;
        this->EdgeNum = edges;
    
        // 把有向图的邻接矩阵转为邻接表
        for (size_t i = 0; i < this->NodeNum; i++)
        {
            for (size_t j = 0; j < this->NodeNum; j++)
            {
                // i=j 表示是自己指向自己,这个没什么意思吧
                if (data[i][j] == 1 && i != j)
                {
                    insert(i, j);
                }
            }
        }
    }
    

    查看邻接表的结构

    /* 将新建的图(邻接矩阵)输出到字符串中 */
    void Graphics::display(string &result)
    {
        if (pHead == nullptr)
            return;
    
        PLSNODE pCurr = pHead;
        PVALNODE pNode = nullptr;
        while (pCurr != nullptr)
        {
            result += std::to_string(pCurr->val);
            if (pCurr->firstEdge == nullptr)
                result += "
    ";
            else
            {
                pNode = pCurr->firstEdge;
                while (pNode != nullptr)
                {
                    result += "->" + std::to_string(pNode->val);
                    pNode = pNode->next;
                }
            }
            result += "
    ";
            pCurr = pCurr->next;
        }
    }
    

    最后上源代码

    链接:http://pan.baidu.com/s/1ntZaWjv 密码:cmej

    vs2015编译通过

  • 相关阅读:
    python ping监控
    MongoDB中一些命令
    进制转换(十进制转十六进制 十六进制转十进制)
    通过ssh建立点对点的隧道,实现两个子网通信
    linux环境下的各种后台执行
    python requests请求指定IP的域名
    不需要修改/etc/hosts,curl直接解析ip请求域名
    MongoDB数据update的坑
    windows平台使用Microsoft Visual C++ Compiler for Python 2.7编译python扩展
    rabbitmq问题之HTTP access denied: user 'guest'
  • 原文地址:https://www.cnblogs.com/pjCoder/p/5252608.html
Copyright © 2011-2022 走看看