关于图的基本概念,这边就不再写了。
下面来说下图的存储,存储图可以使用邻接矩阵和邻接表。
所谓邻接矩阵就是使用一个矩阵来存储图,下图使用矩阵来存储有向图和无向图。
进行简单地说明,图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: