一.图的简介
图是计算机中比较重要的一种数据结构,在很多方面应用比较广泛比如:计算机网络中的路由算法,地图上搜索最短路径,搜索引擎等方面。当然图也是比较难理解的一种数据结构,数据结构之所以难是因为它将逻辑结构存储在计算机物理内存中比较难。
二.图的存储
数据结构其实就是存储+算法。算法是依赖于存储结构的(这里可能有异议,有的人觉得算法独立于存储)。下面探讨3种常用的图存储方式。
1.邻接矩阵(二维数组存储)
上面两种存储方式差不多,只不过矩阵A4存储的不能直接到达的距离为无穷大而已。这种方式存储比较简单,但是有着明显的缺点:当边很少,顶点很多的时候,数组中存储的有效值很少,这就造成内存的大大浪费。
代码:
void creat(vexList GV, adjmatrix GA, int n,int e)
{
int i,j,k,w;
cout << "输入"<<n<<"个顶点的值:"<<endl;
//初始化顶点数组
for(int i = 0; i < n; i++)
{ cin>>GV[i];}
//初始化邻接矩阵
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{if(i==j) GA[i][j] = 0;
else GA[i][j] = maxValue;
}
//建立邻接数组
cout << "输入"<<e<<"条边:"<<endl;
for(int k = 0; k < e; k++)
{cin >> i >> j >>w;
GA[i][j] =GA[j][i] = w;
}
}
2.邻接表存储
邻接表存储其实就是链表存储,将一个点连接的点,全部链接到顶点上,这样的话就大大节省了内存。看下面的图:
创建图的代码:(无向图)
假设:NodeTable[]数组存储了每个链表的首节点,就是上面的邻接表的最前面的0,1,2,3,4,5
假设:构造函数已经构造好空的NodeTable[]
insertEdge(int v1,int v2,int weight)
{
if(v1>= 0 && v1 < maxNum && v2>= 0 && v2 < maxNum)
{
Edge *temp1,*temp2;
Edge *p = new Edge;
Edge *q = new Edge;
p->dest = v1;
p->cost = wight;
q->dest = v2;
q->cost = wight;
temp1 = NodeTable[v1];
temp2 = NodeTable[v2];
while(temp1!=NULL)
temp1=temp1->next;
while(temp2!=NULL)
temp2=temp2->next;
temp1->next = q;
temp2->next = p;
}
}
3.边集数组
编辑数组是利用一维数组存储图中所有边的一种方式。每个元素用来存储一条边。比较节省内存。对于无向图而言任意一条边只需要存储一次即可:
数据结构为:
struct Edge{
int fromvex;
int endvex;
int weight;
};
for(int k = 1; k <= 变数; k++)
{
cin>>i>>j>>w;
GE[k].fromvex = i;
GE[k].endvex = j;
GE[k].weight = w;
}