图的存储结构-十字链表
生活随笔
收集整理的這篇文章主要介紹了
图的存储结构-十字链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖的存儲結構
- 圖的存儲結構-十字鏈表
- 十字鏈表的結構
- 頂點結點
- 弧結點
- 十字鏈表結點:
- 有向圖十字鏈表
- 使用十字鏈表法創建一個有向圖
- 過程圖解
圖的存儲結構-十字鏈表
十字鏈表(Orthogonal List)是有向圖的一種鏈式存儲結構??梢钥闯墒菍⒂邢驁D的鄰接表和逆鄰接表結合起來得到的一種鏈表。在十字鏈表中,對應于有向圖中每一條弧有一個結點,對應于每個頂點也有一個結點。
十字鏈表的結構
頂點結點
typedef string InfoType ; typedef string VertexType;typedef struct VexNode{VertexType data; //頂點的數據域ArcBox *firstIn; //指向該頂點的第一條入弧ArcBox *firstOut; //指向該頂點的第一條出弧 }VexNode;弧結點
typedef struct ArcBox{int tailVex; //該弧的尾頂點的位置int headVex; //該弧的頭頂點的位置struct ArcBox * hLink; //弧頭相同的弧的鏈域static ArcBox * tLink; //弧尾相同的弧的鏈域InfoType info; //弧的相關信息 }ArcBox;十字鏈表結點:
#define MAX_VERTEX_BUM 20 typedef struct {VexNode xList[MAX_VERTEX_BUM]; //表頭向量int vexNum; //圖的頂點個數int arcNum; //圖的邊數 }OLGraph;有向圖十字鏈表
在弧結點中有5個域:其中尾域(tailvex)和頭域(headvex)分別指示弧尾和弧頭這兩個頂點在圖中的位置,鏈域hlink指向弧頭相同的下一條弧,而鏈域tlink指向弧尾相同的下一條弧,info域指向該弧的相關信息。弧頭相同的弧在同一鏈表上,弧尾相同的弧也在同一鏈表上。
它們的頭結點即為頂點結點,它由3個域組成:其中data域存儲和頂點相關的信息,如頂點的名稱等;firstIn和firstOut為兩個鏈域,分別指向以該頂點為弧頭或弧尾的第一條弧結點。如下圖:
若將有向圖的鄰接矩陣看成稀疏矩陣的話,則十字鏈表也可以看成是鄰接矩陣的鏈式存儲結構,在圖的十字鏈表中,弧結點所在的鏈表非循環鏈表,結點之間相對位置自然形成,不一定按頂點序號有序,表頭結點即頂點,它們之間不是鏈接,而是順序存儲。
使用十字鏈表法創建一個有向圖
OLGraph CreateOLG() {OLGraph G;cout << "輸入頂點的總數,邊的總數 G(V,E)" << endl;cin >> G.vexNum >> G.arcNum; //輸入總頂點數,總邊數for (int vi = 0; vi < G.vexNum; ++vi) {cout << "輸入頂點" << vi << "的值:" << endl;cin >> G.xList[vi].data; //輸入頂點的值G.xList[vi].firstIn = NULL; //初始化入弧表G.xList[vi].firstOut = NULL; //初始化出弧表}int i = -1, j = -1;for (int k = 0; k < G.arcNum; ++k) {VertexType v1, v2;cout << "請輸入邊的值 (vi,vj) " << endl;cin >> v1 >> v2; //輸入一條邊依附的兩個頂點i = LocateVex(G, v1); //獲得v1 在G.xList[]中的位置j = LocateVex(G, v2); //獲得v2 在G.xList[]中的位置ArcBox *p1 = new ArcBox; //生成一個新的邊 *p1p1->tailVex = i; //弧尾的頂點位置p1->headVex = j; //弧頭的頂點位置p1->tLink = G.xList[i].firstOut;p1->hLink = G.xList[j].firstIn;G.xList[i].firstOut = p1;G.xList[j].firstIn = p1;}return G; } /*** 若圖G中存在頂點u,則返回該頂點在圖中的位置;否則返回其它信息;*/ int LocateVex(OLGraph G, VertexType u) {int i;for (i = 0; i < G.vexNum; ++i)if (u == G.xList[i].data)return i;return -1; }過程圖解
1.初始化圖G(V,E);
cin >> G.xList[vi].data; //輸入頂點的值G.xList[vi].firstIn = NULL; //初始化入弧表G.xList[vi].firstOut = NULL; //初始化出弧表
2.創建一個邊結點
3.將邊結點加入十字鏈表
先將邊結點的插入弧尾相同的鏈表表頭;
在把邊結點的插入弧頭相同的鏈表表頭;
最后讓 弧尾頂點的第一條出弧、弧頭頂點的第一條入弧,指向新加入的邊界點;
4.繼續加入先得邊結點
總結
以上是生活随笔為你收集整理的图的存储结构-十字链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: axure实现复选框全选_AxureRP
- 下一篇: tomcat学习笔记1