數據結構與算法-圖(圖的儲存方式2-鄰接表)

昨天我們介紹的鄰接矩陣雖然很不錯,但是對於稀疏圖,由於邊數較少,二維矩陣大量位置空閒,造成了很大浪費,於是針對邊數較少的圖結構,我們引入鄰接表表示方法,爲了避免內存浪費,我們採用鏈式動態是申請內存,來避免內存浪費,還記得沒樹的孩子表示法?用一個一維數組和鏈表相連的方法,鄰接表也是這樣的。
1.圖結構中頂點使用一個一維數組存儲,每一個數組元素指向與他相連的邊的另一端,有幾個相連的頂點,用鏈表穿起來。
2.圖結構每一個頂點都構成一個鏈表,對於有向圖,由弧尾指向弧頭即可。
3.鏈表的結點分爲鄰接點域和指針域。
4.對於有向圖,我們還可以建立一個逆鄰接表,用來儲存逆弧結構,當然,這是針對於弧。
5.對於網圖,我們可以在每一個鏈表結點加一個權重域,記錄邊的權值。
請看源碼:

//鄰接表 
typedef struct
{
	AdjList adjList;//指定表指針
	int numVertexes,numEdges; 
}GraphAdjList; 
//鄰接表的創建
void GreateALGraph(GraphAdjList *G)
{
	int i,j ,k;
	EdgeNode *e;
	cout<<"請輸入頂點數和邊數"<<endl;
	scanf("%d%d",&G->numVertexes,&G->numEdges);	
	for(i=0;i<G->numVertexes;i++)
	{
		cout<<"請輸入頂點的數據"<<endl; 
		scanf(&G->adjList[i].data);
		G->adjList[i].firstedge=NULL;
	} 
	for(k=0;k<G->numEdges;k++)
	{
		cout<<"輸入邊(vi,vj)上的頂點序號i,j"<<endl;
		scanf("%d%d",&i,&j); 
		e=(EdgeNode*)malloc(sizeof(EdgeNode));
	}
	e->adjvex=j;
	e->next=G->adjList[i].firstedge;
	G->adjList[i].firstedge=e;
	
	e=(EdgeNode*)malloc(sizeof(EdgeNode));
	
	e->adjvex=i;
	e->next=G->adjList[j].firstedge;
	G->adjList[j].firstedge=e;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章