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