日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

图的存储结构-十字链表

發(fā)布時(shí)間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的存储结构-十字链表 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

圖的存儲(chǔ)結(jié)構(gòu)

  • 圖的存儲(chǔ)結(jié)構(gòu)-十字鏈表
    • 十字鏈表的結(jié)構(gòu)
      • 頂點(diǎn)結(jié)點(diǎn)
      • 弧結(jié)點(diǎn)
      • 十字鏈表結(jié)點(diǎn):
    • 有向圖十字鏈表
      • 使用十字鏈表法創(chuàng)建一個(gè)有向圖
      • 過(guò)程圖解

圖的存儲(chǔ)結(jié)構(gòu)-十字鏈表

十字鏈表(Orthogonal List)是有向圖的一種鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。可以看成是將有向圖的鄰接表和逆鄰接表結(jié)合起來(lái)得到的一種鏈表。在十字鏈表中,對(duì)應(yīng)于有向圖中每一條弧有一個(gè)結(jié)點(diǎn),對(duì)應(yīng)于每個(gè)頂點(diǎn)也有一個(gè)結(jié)點(diǎn)。

十字鏈表的結(jié)構(gòu)

頂點(diǎn)結(jié)點(diǎn)

typedef string InfoType ; typedef string VertexType;typedef struct VexNode{VertexType data; //頂點(diǎn)的數(shù)據(jù)域ArcBox *firstIn; //指向該頂點(diǎn)的第一條入弧ArcBox *firstOut; //指向該頂點(diǎn)的第一條出弧 }VexNode;

弧結(jié)點(diǎn)

typedef struct ArcBox{int tailVex; //該弧的尾頂點(diǎn)的位置int headVex; //該弧的頭頂點(diǎn)的位置struct ArcBox * hLink; //弧頭相同的弧的鏈域static ArcBox * tLink; //弧尾相同的弧的鏈域InfoType info; //弧的相關(guān)信息 }ArcBox;

十字鏈表結(jié)點(diǎn):

#define MAX_VERTEX_BUM 20 typedef struct {VexNode xList[MAX_VERTEX_BUM]; //表頭向量int vexNum; //圖的頂點(diǎn)個(gè)數(shù)int arcNum; //圖的邊數(shù) }OLGraph;

有向圖十字鏈表

在弧結(jié)點(diǎn)中有5個(gè)域:其中尾域(tailvex)和頭域(headvex)分別指示弧尾和弧頭這兩個(gè)頂點(diǎn)在圖中的位置,鏈域hlink指向弧頭相同的下一條弧,而鏈域tlink指向弧尾相同的下一條弧,info域指向該弧的相關(guān)信息。弧頭相同的弧在同一鏈表上,弧尾相同的弧也在同一鏈表上。
它們的頭結(jié)點(diǎn)即為頂點(diǎn)結(jié)點(diǎn),它由3個(gè)域組成:其中data域存儲(chǔ)和頂點(diǎn)相關(guān)的信息,如頂點(diǎn)的名稱等;firstIn和firstOut為兩個(gè)鏈域,分別指向以該頂點(diǎn)為弧頭或弧尾的第一條弧結(jié)點(diǎn)。如下圖:

若將有向圖的鄰接矩陣看成稀疏矩陣的話,則十字鏈表也可以看成是鄰接矩陣的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),在圖的十字鏈表中,弧結(jié)點(diǎn)所在的鏈表非循環(huán)鏈表,結(jié)點(diǎn)之間相對(duì)位置自然形成,不一定按頂點(diǎn)序號(hào)有序,表頭結(jié)點(diǎn)即頂點(diǎn),它們之間不是鏈接,而是順序存儲(chǔ)。

使用十字鏈表法創(chuàng)建一個(gè)有向圖

OLGraph CreateOLG() {OLGraph G;cout << "輸入頂點(diǎn)的總數(shù),邊的總數(shù) G(V,E)" << endl;cin >> G.vexNum >> G.arcNum; //輸入總頂點(diǎn)數(shù),總邊數(shù)for (int vi = 0; vi < G.vexNum; ++vi) {cout << "輸入頂點(diǎn)" << vi << "的值:" << endl;cin >> G.xList[vi].data; //輸入頂點(diǎn)的值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 << "請(qǐng)輸入邊的值 (vi,vj) " << endl;cin >> v1 >> v2; //輸入一條邊依附的兩個(gè)頂點(diǎn)i = LocateVex(G, v1); //獲得v1 在G.xList[]中的位置j = LocateVex(G, v2); //獲得v2 在G.xList[]中的位置ArcBox *p1 = new ArcBox; //生成一個(gè)新的邊 *p1p1->tailVex = i; //弧尾的頂點(diǎn)位置p1->headVex = j; //弧頭的頂點(diǎn)位置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中存在頂點(diǎn)u,則返回該頂點(diǎn)在圖中的位置;否則返回其它信息;*/ 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; }

過(guò)程圖解

1.初始化圖G(V,E);

cin >> G.xList[vi].data; //輸入頂點(diǎn)的值G.xList[vi].firstIn = NULL; //初始化入弧表G.xList[vi].firstOut = NULL; //初始化出弧表


2.創(chuàng)建一個(gè)邊結(jié)點(diǎn)

ArcBox *p1 = new ArcBox; //生成一個(gè)新的邊 *p1p1->tailVex = i; //弧尾的頂點(diǎn)位置p1->headVex = j; //弧頭的頂點(diǎn)位置


3.將邊結(jié)點(diǎn)加入十字鏈表
先將邊結(jié)點(diǎn)的插入弧尾相同的鏈表表頭;

p1->tLink = G.xList[i].firstOut;


在把邊結(jié)點(diǎn)的插入弧頭相同的鏈表表頭;

p1->hLink = G.xList[j].firstIn;


最后讓 弧尾頂點(diǎn)的第一條出弧、弧頭頂點(diǎn)的第一條入弧,指向新加入的邊界點(diǎn);

G.xList[i].firstOut = p1;G.xList[j].firstIn = p1;


4.繼續(xù)加入先得邊結(jié)點(diǎn)



總結(jié)

以上是生活随笔為你收集整理的图的存储结构-十字链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。