概述
图是数据构中数据元素间具有多对多的的一种逻辑结构,在现实生活中用处十分广阔,实用性很高。而本篇数据结构的博客将介绍图的存储结构:邻接矩阵、邻接链表、十字链表(不讲述)、邻接多重链表(不讲述)。而图的遍历主要介绍DFS、BFS分别在邻接矩阵和邻接链表上的结构展开,后续博客会出关于图的其他算法等
图的存储结构和遍历算法
邻接矩阵:存储定点的数组、表示边的二维数组,以下结构的定义按C语言组织
存放定点的数组:
//图的结构定义
type struct {
int[MAX] topNode;
int[MAX][MAX] edgeNode;
int numNodes, numEdges;
}Graph;
//构造图
Graph createMGraph(Graph G){
printf("输入点和边的数量");
scanf("%d,%d",&G->numNodes,G->numEdegs);
//初始化定点
for(int i = 0; i < G->numNodes, i++){
printf("输入定点表示符");
scanf("%d",&G->topNode[i]);
}
//初始化二维数组(矩阵)
for(int i = 0; i < G->numNodes; i++){
for(int j = 0; j < G->numNodes; j++){
G->edgeNode[i][j] = INIT;
}
}
//真正开始构造边
int Vi,Vj;
for(int i = 0; i < G->numEdges; i++){
printf("输入边的Vi,Vj");
scanf("%d,%d",&Vi,&Vj);
G->EdgeNode[i]][j] = 1;
G->EdgeNode[j][i] = 1;//对于无向图而言
}
}
//图的深度遍历DFS
void DFSTraverse(Graph G){
//初始化点的标记
for(int i = 0; i < G->numNodes; i++){
visited[i] = FALSE;
}
for(int j = 0; j < G->numNodes; j++){
if(!visited[j])
DFS(G,j);
}
}
//图以邻接矩阵方式组织
void DFS(Graph G,int i){
visited[i] = true;
printf(G->topNode[i]);
for(int j = 0; j < G->numNodes; j++){
if(G->numEdges[i][j] == 1 && !G->topNode[j])
DFS(G,j)
}
}
邻接链表:是数组和链表的结合,数组存定点,链表存邻接点
//无向图的邻接表
type struct EdegNode{
int index;
EdgeNode * next;
}EdgeNode;
type struct TopNode{
int data;
EdgeNode * next;
}TopNode,TopNode[Max];
type struct Graph{
TopNode topNode;
int numNodes,numEdges;
}Graph;
//构造图
Graph createMGrap(Grap G){
EdgeNode * e;
printf("输入点和边的数量");
scanf("%d,%d",&G->numNodes,&G->numEdegs);
//初始化定点表
for(int i = 0; i < G->numNodes; i++){
printf("输入定点符号");
scanf("%d",&G->topNode[i]);
G->topNode[i].next = null;
}
int Vi,Vj;
//构造边
for(int j = 0; j < numEdges; j++){
printf("输入边的Vi,Vj");
scanf("%d,%d",&Vi,&Vj);
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->index = j;
//头插法
e->next = G->topNode[i].next;
G->topNode[i].next = e;
e->index = i;
e->next = G->topNode[j].next;
G->topNode[j].next = e;
}
return G;
}
//图的DFS
void DFSTraverse(Graph G){
//初始化点的标记
for(int i = 0; i < G->numNodes; i++){
visited[i] = FALSE;
}
for(int j = 0; j < G->numNodes; j++){
if(!visited[j])
DFS(G,j);
}
}
//图案邻接链表方式组织
void DFS(Graph G,int i){
EdgeNode * p;
visited[i] = true;
printf(G->topNode[i].data);
p = G->topNode[i].next;
if(!visited[p->index]){
DFS(G,p->index);
}else{
p = p->next;
}
}