算法之图的存储

关于图的基本概念,这边就不再写了。

下面来说下图的存储,存储图可以使用邻接矩阵和邻接表。

所谓邻接矩阵就是使用一个矩阵来存储图,下图使用矩阵来存储有向图和无向图。


进行简单地说明,图G5中,V0和到V1有连线,所以坐标为(0,1)的地方为1,又因为G5是无向图,所以坐标为(1,0)的地方也为0,

最后我们看到G5的存储矩阵是对角线对称的。

图G6中,V4到V3有连线,所以坐标为(4,3)的地方为1,而V3到V4没有连线,所以坐标为(3,4)的地方为0.


邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。

下图就是一个无向图的邻接表结构。


上图中,V0与V1,V2和V3有连接,V1与V0,V2有连接。。。。。


有向图的邻接矩阵使用c语言实现如下:

 

#include <stdio.h>
#include <malloc.h>
//有10个顶点
#define VERTEXNUM 10

void createGraph(int (*edge)[VERTEXNUM], int start, int end);
void displayGraph(int (*edge)[VERTEXNUM]);

int main(void){
		//动态创建存放边的数组
        int (*edge)[VERTEXNUM] = (int (*)[VERTEXNUM])malloc(sizeof(int)*VERTEXNUM*VERTEXNUM);
		//初始化数组
        int i,j;
        for(i=0;i<VERTEXNUM;i++){
                for(j=0;j<VERTEXNUM;j++){
                        edge[i][j] = 0;
                }
        }
        printf("after init:\n");
        displayGraph(edge);

        createGraph(edge,0,1);
        createGraph(edge,1,3);
        createGraph(edge,4,3);
        createGraph(edge,4,1);

        printf("after create:\n");
        displayGraph(edge);
        free(edge);
        return 0;
}

//创建一条edge,从顶点start到顶点end
void createGraph(int (*edge)[VERTEXNUM], int start, int end){
        edge[start][end] = 1;
}

//打印图的存储
void displayGraph(int (*edge)[VERTEXNUM]){
        int i,j;
        for(i=0;i<VERTEXNUM;i++){
                for(j=0;j<VERTEXNUM;j++){
                        printf("%d ",edge[i][j]);
                }
                printf("\n");
        }
}

程序执行结果为:

after init:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
after create:
0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0


有向图的邻接表使用c语言实现如下:

 

#include <stdio.h>
#include <malloc.h>
//定义最多10个顶点
#define VERTEXNUM 10

typedef struct edge{
        int vertex;
        struct edge* next;
}st_edge;

void createGraph(st_edge** edge, int start, int end);
void displayGraph(st_edge** edge);
void delGraph(st_edge** edge)

int main(void){
		//动态创建存放边的指针数组
        st_edge** edge = (st_edge**)malloc(sizeof(st_edge*)*VERTEXNUM);
		//初始化指针数组
        int i;
        for(i=0;i<VERTEXNUM;i++){
                edge[i] = NULL;
        }

        printf("after init:\n");
        displayGraph(edge);

        createGraph(edge,0,1);
        createGraph(edge,1,3);
        createGraph(edge,4,3);
        createGraph(edge,4,1);

        printf("after create:\n");
        displayGraph(edge);
	delGraph(edge);
        return 0;
}

//创建一条edge,从顶点start到顶点end 
void createGraph(st_edge** edge, int start, int end){
        st_edge* newedge = (st_edge*)malloc(sizeof(st_edge));
        newedge->vertex = end;
        newedge->next = NULL;
        edge = edge + start;
        while(*edge != NULL){
                edge = &((*edge)->next);
        }
        *edge = newedge;
}

//打印图的存储  
void displayGraph(st_edge** edge){
        int i;
        st_edge** p;
        for(i=0;i<VERTEXNUM;i++){
                printf("%d:",i);
                p = edge+i;
                while((*p) != NULL){
                        printf("%d ",(*p)->vertex);
                        p = &((*p)->next);
                }
                printf("\n");
        }
}

//删除图
void delGraph(st_edge** edge){
        int i;
        st_edge* p;
        st_edge* del;
        for(i=0;i<VERTEXNUM;i++){
                p = *(edge+i);
                while(p != NULL){
                        del = p;
                        p = p->next;
                        printf("del:%d\n",del->vertex);
                        free(del);
                }
                edge[i] = NULL;
        }
        free(edge);
}


 

 

 

程序执行结果为:

after init:
0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
after create:
0:1
1:3
2:
3:
4:3 1
5:
6:
7:
8:
9:

 

 

 

posted @ 2013-06-26 19:06  坚固66  阅读(308)  评论(0编辑  收藏  举报