• 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编译通过

  • 相关阅读:
    Oracle decode函数
    Flink笔记
    httpclient之put 方法(参数为json类型)
    XMLHTTPRequest的理解 及 SpringMvc请求和响应xml数据
    SQL获取本周,上周,本月,上月第一天和最后一天 注:本周从周一到周天
    Other
    Sql根据起止日期生成时间列表
    sql 在not in 子查询有null值情况下经常出现的陷阱
    sql 判断一个表的数据不在另一个表中
    查看系统触发器
  • 原文地址:https://www.cnblogs.com/pjCoder/p/5252608.html
Copyright © 2020-2023  润新知