資料結構學習(C++)——圖【1】(基本儲存方法) (轉)
首先告訴大家一個好訊息,資料結構到這裡就要結束了!然後再來一個壞訊息,這裡是資料結構中“最沒有意義”的部分和最難的部分。圖的應用恐怕是所有結構中最寬泛的了,但這也註定了在講“資料結構的圖”的時候沒什麼好講的——關於圖的最重要的是演算法,而且相當的一部分都是很專業的,一般的人幾乎不會接觸到;相對而言,結構就顯得分量很輕。你可以看到關於圖中元素的操作很少,遠沒有單連結串列那裡列出的一大堆“介面”。——一個結構如果複雜,那麼能確切定義的操作就很有限。
不管怎麼說,還是先得把圖存起來。不要看書上列出了好多方法,根本只有一個——鄰接矩陣。如果矩陣是稀疏的,那就可以用十字連結串列來儲存矩陣(見前面的《稀疏矩陣(十字連結串列)》)。如果我們只關係行的關係,那麼就是鄰接表(出邊表);反之,只關心列的關係,就是逆鄰接表(入邊表)。
下面給出兩種儲存方法的實現。
#ifndef Graphmem_H
#define Graphmem_H
:namespace prefix = o ns = "urn:schemas--com::office" />
#include
#include
using namespace std;
template
const int maxV = 20;//最大節點數
template
class AdjMatrix
{
friend class Network
public:
AdjMatrix() : vNum(0), eNum(0)
{
vertex = new name[maxV]; edge = new dist*[maxV];
for (int i = 0; i < maxV; i++) edge[i] = new dist[maxV];
}
~AdjMatrix()
{
for (int i = 0; i < maxV; i++) delete []edge[i];
delete []edge; delete []vertex;
}
bool insertV(name v)
{
if (find(v)) return false;
vertex[vNum] = v;
for (int i = 0; i < maxV; i++) edge[vNum][i] = NoEdge;
vNum++; return true;
}
bool insertE(name v1, name v2, dist cost)
{
int i, j;
if (v1 == v2 || !find(v1, i) || !find(v2, j)) return false;
if (edge[i][j] != NoEdge) return false;
edge[i][j] = cost; eNum++; return true;
}
name& getV(int n) { return vertex[n]; } //沒有越界檢查
int nextV(int m, int n)//返回m號頂點的第n號頂點後第一個鄰接頂點號,無返回-1
{
for (int i = n + 1; i < vNum; i++) if (edge[m][i] != NoEdge) return i;
return -1;
}
private:
int vNum, eNum;
dist NoEdge, **edge; name *vertex;
bool find(const name& v)
{
for (int i = 0; i < vNum; i++) if (v == vertex[i]) return true;
return false;
}
bool find(const name& v, int& i)
{
for (i = 0; i < vNum; i++) if (v == vertex[i]) return true;
return false;
}
};
template
class LinkedList
{
friend class Network
public:
LinkedList() : vNum(0), eNum(0) {}
~LinkedList()
{
for (int i = 0; i < vNum; i++) delete vertices[i].e;
}
bool insertV(name v)
{
if (find(v)) return false;
vertices.push_back(vertex(v, new list
vNum++; return true;
}
bool insertE(const name& v1, const name& v2, const dist& cost)
{
int i, j;
if (v1 == v2 || !find(v1, i) || !find(v2, j)) return false;
for (list
iter != vertices[i].e->end() && iter->vID < j; iter++);
if (iter == vertices[i].e->end())
{
vertices[i].e->push_back(edge(j, cost)); eNum++; return true;
}
if (iter->vID == j) return false;
vertices[i].e->insert(iter, edge(j, cost)); eNum++; return true;
}
name& getV(int n) { return vertices[n].v; } //沒有越界檢查
int nextV(int m, int n)//返回m號頂點的第n號頂點後第一個鄰接頂點號,無返回-1
{
for (list
iter != vertices[m].e->end(); iter++) if (iter->vID > n) return iter->vID;
return -1;
}
private:
bool find(const name& v)
{
for (int i = 0; i < vNum; i++) if (v == vertices[i].v) return true;
return false;
}
bool find(const name& v, int& i)
{
for (i = 0; i < vNum; i++) if (v == vertices[i].v) return true;
return false;
}
struct edge
{
edge() {}
edge(int vID, dist cost) : vID(vID), cost(cost) {}
int vID;
dist cost;
};
struct vertex
{
vertex() {}
vertex(name v, list
name v;
list
};
int vNum, eNum;
vector
};
#endif
這個實現是很簡陋的,但應該能滿足後面的講解了。現在這個還什麼都不能做,不要急,在下篇將講述圖的DFS和BFS。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982186/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構學習(C++)——圖(總結) (轉)資料結構C++
- 資料結構學習(C++)——遞迴【1】 (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(1) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【3】(1) (轉)資料結構C++遞迴
- PostgreSQL 資料庫學習 - 1.資料庫體系結構之儲存結構SQL資料庫
- 資料結構學習(C++)——圖【3】(無向圖)(上) (轉)資料結構C++
- 資料結構學習(C++)——圖【3】(無向圖)(下) (轉)資料結構C++
- 【資料結構——圖和圖的儲存結構】資料結構
- 資料結構學習(C++)——二叉樹【1】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——序言 (轉)資料結構C++
- 資料結構學習(C++)——圖【4】(最短路徑) (轉)資料結構C++
- 資料結構學習(C++)——圖【2】(DFS和BFS) (轉)資料結構C++
- 資料結構學習(C++)——樹(總結) (轉)資料結構C++
- 資料結構學習(C++)續——排序【1】測試程式 (轉)資料結構C++排序
- 圖解vsan儲存結構/資料恢復方法圖解資料恢復
- 資料結構學習(C++)——線性鏈式結構總結(代後記)【1】 (轉)資料結構C++
- 資料結構學習(C++)——圖【5】活動網路(AOV、AOE) (轉)資料結構C++
- 【PHP資料結構】圖的概念和儲存結構PHP資料結構
- c++基本資料結構C++資料結構
- 資料結構學習(C++)——迴圈連結串列 (轉)資料結構C++
- 資料結構學習(C++)——雙向連結串列 (轉)資料結構C++
- 資料結構學習(C++)——稀疏矩陣(十字連結串列【1】) (轉)資料結構C++矩陣
- 資料結構學習(c++)——二叉樹 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——遞迴【2】(2) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(3) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(4) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【3】(2) (轉)資料結構C++遞迴
- 資料結構學習總結--圖資料結構
- 樹型結構資料在資料庫基本表中的儲存及維護 (轉)資料庫
- HBase 資料儲存結構
- Oracle資料儲存結構Oracle
- Redis 學習-資料結構基本簡介Redis資料結構
- 資料結構學習(C++)——二叉樹【2】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)續——排序【3】交換排序 (轉)資料結構C++排序
- 資料結構學習(C++)——二叉樹【3】 (轉)資料結構C++二叉樹
- 資料結構複雜圖形儲存 PHP 版資料結構PHP
- Redis(一):基本資料型別與底層儲存結構Redis資料型別
- 圖的儲存結構