图的邻接矩阵存储虽然直观,但是我们容易发现其浪费空间的问题十分严重。在线性表中,我们引入链式存储结构来弥补空间浪费的问题,同样,在图结构中,我们也可以用类似的方法来解决。
由此,我们想到了将数组与链表结合起来的方法,用数组存储链表头指针,链表中存储与某一顶点的全部邻接点在数组中的索引,这样就解决了空间浪费的问题。下面贴出示例代码:
#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");
}