图的邻接表存储及其实现

图的邻接矩阵存储虽然直观,但是我们容易发现其浪费空间的问题十分严重。在线性表中,我们引入链式存储结构来弥补空间浪费的问题,同样,在图结构中,我们也可以用类似的方法来解决。

由此,我们想到了将数组与链表结合起来的方法,用数组存储链表头指针,链表中存储与某一顶点的全部邻接点在数组中的索引,这样就解决了空间浪费的问题。下面贴出示例代码:

#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");   
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章