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 += "\n";
else
{
pNode = pCurr->firstEdge;
while (pNode != nullptr)
{
result += "->" + std::to_string(pNode->val);
pNode = pNode->next;
}
}
result += "\n";
pCurr = pCurr->next;
}
}
最后上源代码
链接:http://pan.baidu.com/s/1ntZaWjv 密码:cmej
vs2015编译通过