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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图的两种存储方式---邻接矩阵和邻接表

發布時間:2025/7/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的两种存储方式---邻接矩阵和邻接表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ?圖:圖是一種數據結構,由頂點的有窮非空集合和頂點之間邊的集合組成,表示為G(V,E),V表示為頂點的集

合,E表示為邊的集合。

? ?首先肯定是要對圖進行存儲,然后進行一系列的操作,下面對圖的兩種存儲方式鄰接矩陣和鄰接表盡行介紹。

? ?(一)、鄰接矩陣存儲:

? ?用兩個數組分別進行存儲數據元素(頂點)的信息和數據元素之間的關系(邊或弧)的信息。

? ?存儲頂點:用一個連續的空間存儲n個頂點。

? ?存儲頂點之間的邊:將由n個頂點組成的邊用一個n*n的矩陣來存儲,如果兩個頂點之間有邊,則表示為1,否

則表示為0。

? ?下面用代碼來實現鄰接矩陣的存儲:

#define SIZE 10class Graph { public:Graph(){MaxVertices = SIZE;NumVertices = NumEdges = 0;VerticesList = new char[sizeof(char)*MaxVertices];Edge = new int*[sizeof(int*)*MaxVertices];int i,j;for(i = 0;i<MaxVertices;i++)Edge[i] = new int[sizeof(int)*MaxVertices];for(i = 0;i<MaxVertices;i++){for(j = 0;j<MaxVertices;++j)Edge[i][j] = 0;}}void ShowGraph(){int i,j;cout<<" ";for(i = 0;i<NumVertices;i++)cout<<VerticesList[i]<<" ";cout<<endl;for(i = 0;i<NumVertices;i++){cout<<VerticesList[i]<<" ";for(j = 0;j<NumVertices;j++)cout<<Edge[i][j] <<" ";cout<<endl;}cout<<endl;}int GetVertexPos(char v){int i;for(i = 0;i<NumVertices;i++){if(VerticesList[i] == v)return i;}return -1;}~Graph(){Destroy();}void Insert(char v){if(NumVertices < MaxVertices){VerticesList[NumVertices] = v;NumVertices++; }}void InsertEdge(char v1,char v2) {int i,j;int p1 = GetVertexPos(v1); int p2 = GetVertexPos(v2);if(p1 == -1 || p2 == -1)return ;Edge[p1][p2] = Edge[p2][p1] = 1;NumEdges++; }void RemoveEdge(char v1,char v2){int p1 = GetVertexPos(v1);int p2 = GetVertexPos(v2);if(p1 == -1 || p2== -1)return;if(Edge[p1][p2] == 0) return;Edge[p1][p2] = Edge[p2][p1] = 0;NumEdges--;}void Destroy(){delete[] VerticesList;VerticesList = NULL;for(int i = 0;i<NumVertices;i++){delete Edge[i];Edge[i] = NULL;}delete[] Edge;Edge = NULL;MaxVertices = NumVertices = 0;}void RemoveVertex(char v){int i,j;int p = GetVertexPos(v);int reNum = 0;if(p == -1)return;for(i = p;i<NumVertices-1;i++) {VerticesList[i] = VerticesList[i+1];}for(i = 0;i<NumVertices;i++){if(Edge[p][i] != 0)reNum++;}for(i = p;i<NumVertices-1;i++){for(j = 0;j<NumVertices;j++){Edge[i][j] = Edge[i+1][j];}}for(i = p;i<NumVertices;i++){for(j = 0;j<NumVertices;j++)Edge[j][i] = Edge[j][i+1];}NumVertices--;NumEdges = NumEdges - reNum;} private:int MaxVertices;int NumVertices;int NumEdges;char *VerticesList;int **Edge; };

? ? 上面的類中的數據有定義最大的頂點的個數(MaxVertices),當前頂點的個數(NumVertices),當前邊的個數

(NumEdges),保存頂點的數組,保存邊的數組。其中的方法是(1)構造函數:對定義的數據進行初始化。(2)顯

示構造的圖的信息的函數。(3)得到頂點位置信息的函數。(4)析構函數:調用銷毀函數。(5)插入頂點函數。

(6)插入邊的函數。(7)刪除邊的函數。(8)銷毀函數,釋放開辟的內存空間。(9)刪除頂點函數。

? (二)、鄰接表存儲:

? ?鄰接表是圖的一種鏈式存儲結構。用數組存儲頂點,用鏈表存儲和頂點相關聯的邊,邊值為當前頂點在數組中的下

標。用如下圖可以表示鄰接表的存儲方式:

? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ??

? ?下面用代碼來實現鄰接表的存儲:

#define SIZE 10 typedef char T; struct Edge {Edge(int v):destvalue(v),link(NULL){}int destvalue;Edge *link; }; struct Vertex {Vertex():list(NULL){}T data;Edge *list; }; class GraphLnk { public:GraphLnk();~GraphLnk(){}void InsertVertex(T v);void InsertEdge(T v1,T v2);int GetVertexI(T v);void ShowGraph();void RemoveEdge(T v1,T v2);void RemoveVertex(T v);void DestroyGraph(); private:int MaxVertex;int NumVertex;int NumEdge;Vertex *VertexTable; };GraphLnk::GraphLnk() {MaxVertex = SIZE;NumVertex = NumEdge = 0;VertexTable = new Vertex[MaxVertex]; } void GraphLnk::InsertVertex(T v) {if(NumVertex >= MaxVertex)return;VertexTable[NumVertex++].data = v; } void GraphLnk::ShowGraph() {int i;for(i = 0;i<NumVertex;i++){cout<<i<<" "<<VertexTable[i].data<<":->";Edge *p = VertexTable[i].list;while(p != NULL){cout<<p->destvalue<<"->";p = p->link;}cout<<"nul"<<endl;}cout<<endl; } int GraphLnk::GetVertexI(T v) {int i;for(i = 0;i<NumVertex;i++){if(VertexTable[i].data == v)return i;}return -1; } void GraphLnk::InsertEdge(T v1,T v2) {int p1 = GetVertexI(v1);int p2 = GetVertexI(v2);if(p1 == -1 || p2 == -1)return;//v1 -> v2Edge *ed = new Edge(p2);ed->link = VertexTable[p1].list;VertexTable[p1].list = ed;//v2 -> v1ed = new Edge(p1);ed->link = VertexTable[p2].list;VertexTable[p2].list = ed;NumEdge++; }void GraphLnk::RemoveEdge(T v1,T v2) {int p1 = GetVertexI(v1);int p2 = GetVertexI(v2);if(p1 == -1 || p2 == -1)return;Edge *q = NULL; //標識要刪除邊鏈表的前一個Edge *p; p = VertexTable[p1].list; //從鏈表開頭開始//查找v2所在位置while(p != NULL && p->destvalue != p2){q = p;p = p->link;}if(p == NULL) //兩個頂點之間沒有邊的存在¨return;//找到所要刪除的邊if(q == NULL) //所要刪除的為鏈表開頭 {VertexTable[p1].list = p->link;}else{q->link = p->link;}delete p;p = NULL;q = NULL;p = VertexTable[p2].list;while(p->destvalue != p1){q = p;p = p->link;}if(q == NULL){VertexTable[p2].list = p->link;}else{q->link = p->link;}delete p;p = NULL;NumEdge--; }void GraphLnk::RemoveVertex(T vertex) {int v = GetVertexI(vertex);if(v == -1)return;//刪除和結點相關的邊Edge*p=VertexTable[v].list;Edge *s;Edge *t = NULL;int k;while(p != NULL){k = p->destvalue;s = VertexTable[k].list;while(s != NULL&&s->destvalue != v){t = s;s = s->link;}if(s != NULL){if(t == NULL) //第一個結點 {VertexTable[k].list = s->link;}else{t->link = s->link;}delete s;s = NULL;}VertexTable[v].list = p->link;delete p;p = VertexTable[v].list;}/*刪除結點,用最后一個結點覆蓋要刪除的結點,并把和最后一個結點相關聯的邊的下標改正*/NumVertex--;VertexTable[v].data = VertexTable[NumVertex].data; VertexTable[v].list = VertexTable[NumVertex].list; s = VertexTable[v].list;while(s != NULL){k = s->destvalue;p = VertexTable[k].list;while(p != NULL){if(p->destvalue == NumVertex) {p->destvalue = v;break;}p = p->link;}s = s->link;} }void GraphLnk::DestroyGraph() {Edge *p;for(int i = 0;i<NumVertex;i++){p = VertexTable[i].list;while(p != NULL){VertexTable[i].list = p->link;delete p;p = VertexTable[i].list;}}delete []VertexTable;MaxVertex = NumEdge = NumVertex = 0; }

? ?在代碼實現的過程中,先定義出頂點和邊的數據結構,然后在類中定義了最大頂點數,當前頂點的個數,當前的

邊的個數,頂點類型的數組,還有在類中進行了函數的聲明,包括(1)構造函數。(2)析構函數。(3)插入頂點

函數。(4)插入邊函數。(5)得到頂點位置的函數。(6)顯示構造出的圖的信息函數。(7)刪除邊函數。(8)

刪除頂點函數。(9)銷毀函數。

?

轉載于:https://www.cnblogs.com/XNQC1314/p/9076698.html

總結

以上是生活随笔為你收集整理的图的两种存储方式---邻接矩阵和邻接表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久久久久久影院 | 日产毛片| 国产亚洲欧美一区二区三区 | 午夜生活片 | 久久久久久久久久久久久久av | 九一国产视频 | 免费人成视频在线播放 | 丰满多毛的大隂户视频 | 69中国xxxxxxxxx96| 国产伦精品一区二区三区高清版禁 | 毛片2 | 三级av网 | 男人的天堂伊人 | 综合网天天| 久久一级片 | 99视频免费在线观看 | 精品伦精品一区二区三区视频 | 99re视频在线 | 欧美成人xxxx | 97福利网| 国产成人av一区二区 | 亚洲.www | 亚洲欧美日韩成人 | 国产乱人伦app精品久久 | 美女精品一区 | 美女搞黄视频网站 | 涩里番在线观看 | gav久久 | www.youjizz.com在线| 日韩精品视频在线免费观看 | 91婷婷| 爱搞逼综合网 | 伊人色综合久久久 | 欧美肉大捧一进一出免费视频 | 一区二区三区视频在线播放 | 成人区精品一区二区婷婷 | 在线免费中文字幕 | 成人网址在线观看 | 大香依人 | 精品久久久久久亚洲 | 日本少妇中文字幕 | 成在人线av | 日本乱偷人妻中文字幕在线 | 国产男女猛烈无遮挡免费视频动漫 | 日韩二区视频 | 黑人巨大猛交丰满少妇 | 裸体一区二区 | 99色在线观看 | 成人黄色激情小说 | 三级视频在线播放 | 五月婷婷丁香久久 | 午夜在线一区 | 极品少妇在线 | 黄色高清视频在线观看 | 国产精品天堂 | 一级二级在线观看 | 色呦 | 丰满熟妇人妻av无码区 | 美女扒开屁股让男人桶 | 97精品国产露脸对白 | 少妇流白浆 | 少妇按摩一区二区三区 | 国产成人午夜精华液 | 精品偷拍一区 | www天天操 | 在线尤物| 欧美激情久久久久久久 | 亚洲v国产v | 久草免费在线视频 | 国产视频精品一区二区三区 | 国产精品一区二区入口九绯色 | 美女激情网 | 少妇乱淫36部 | 性欧美丰满熟妇xxxx性仙踪林 | 国产一级aa大片毛片 | 色哟哟入口 | 香蕉视频在线观看免费 | 一本一道久久a久久 | 精品久久久久久久久久久久久 | 亚洲天堂av网 | 国产精品羞羞答答 | 手机av在线网 | 一级黄色录相 | 传媒av在线 | 91网页版| 欧美特级毛片 | 国产熟妇搡bbbb搡bbbb | 国语对白一区 | 黄色小网站在线观看 | 欧美一区二区三区的 | 少妇精品一区二区 | 波多野结衣调教 | 毛片123| 欧美视频免费 | 成片免费观看视频大全 | 国产国语对白 | 中文字幕一区在线播放 | 中文字幕永久在线 | 欧美性猛交乱大交xxxx |