圖的鄰接矩陣存儲雖然直觀,但是我們容易發現其浪費空間的問題十分嚴重。在線性表中,我們引入鏈式存儲結構來彌補空間浪費的問題,同樣,在圖結構中,我們也可以用類似的方法來解決。
由此,我們想到了將數組與鏈表結合起來的方法,用數組存儲鏈表頭指針,鏈表中存儲與某一頂點的全部鄰接點在數組中的索引,這樣就解決了空間浪費的問題。下面貼出示例代碼:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef char VertexType;
typedef int EdgeType;
typedef int Status;
typedef struct EdgeNode{/*定義邊表結點*/
EdgeType Weight;/*定義權值,對於非網圖可以不用*/
int adjvex;/*定義鄰接點域*/
struct EdgeNode * next;
}EdgeNode;
typedef struct VertexNode{/*定義頂點表結點*/
EdgeNode * head;/*鄰接表頭指針*/
VertexType data;/*頂點信息域*/
}VertexNode,Adjlist[MAXSIZE];
//typedef struct VertexNode[MAXSIZE] Adjlist;/*定義Adjlist類型爲VertexNode數組*/
typedef struct GraphAdjlist{/*定義圖的鄰接表存儲結構*/
Adjlist adjlist;/*定義鄰接表*/
int VexNum,EdgeNum;
}GraghAdjlist;
Status CreateALGraph(GraphAdjlist *G){
int i=0,j=0,k=0;/*ijk均爲循環變量*/
EdgeNode *edge=NULL;
printf("請輸入頂點數和邊數\n");
scanf("%d%d",&G->VexNum,&G->EdgeNum);
char ch=getchar();
printf("請輸入各個頂點的信息\n");
for(i=0;i<G->VexNum;i++){
scanf("%c",&G->adjlist[i].data);
ch=getchar();
}
for(k=0;k<G->EdgeNum;k++){
printf("請輸入<vi,vj>邊上的頂點序號\n");
scanf("%d%d",&i,&j);
ch=getchar();
edge=(EdgeNode *)malloc(sizeof(EdgeNode));
if(!edge){
printf("malloc failed\n");
return ERROR;
}
edge->adjvex=j;
edge->next=G->adjlist[i].head;
G->adjlist[i].head=edge;
edge=(EdgeNode *)malloc(sizeof(EdgeNode));
if(!edge){
printf("malloc failed\n");
return ERROR;
}
edge->adjvex=i;
edge->next=G->adjlist[j].head;
G->adjlist[j].head=edge;
}
}
/*銷燬圖*/
Status DestroyGraph(GraphAdjlist *G){
int i=0;
EdgeNode * pMove=NULL, *qMove=NULL;
while(pMove&&i<G->VexNum){
pMove=G->adjlist[i].head;
while(pMove){
qMove=pMove->next;
free(pMove);
pMove=qMove;
}
i++;
}
return OK;
}
int main(void){
GraghAdjlist G;
CreateALGraph(&G);
if(DestroyGraph(&G))
printf("銷燬成功\n");
else
printf("銷燬失敗\n");
}