图是一种较线性表和数更为复杂的数据结构。在图形结构中,结点的关系可以是任意的,图中任意两个数据元素之间都可能相关。
图的存储结构有数组表示法、邻接表法、十字链表法、邻接多重表。
数组表示法一般是使用两个数组分别储存数据元素的信息和数据元素之间的关系信息。一般使用一位数组来储存顶点信息,使用二维数组来储存顶点的关系(边或弧)。如图所示,横纵坐标为顶点个数
邻接表是图的一种链式存储结构。每个节点由3个域组成,其中邻接点域指示与顶点邻接的点在图中的位置,链域指示下一条边或弧的结点,数据域储存边或弧相关的信息。如图所示
十字链表是有向图的另一种链式存储结构。结点中有5个域:其中尾域和头域分别指示弧尾和弧头这两个顶点在图中的位置,链域hlink指向弧头相同的下一条弧,而链域tlink指向弧尾相同的下一条弧 ,info域指向该弧的相关信息。 如图所示
邻接多重表不怎么用到,就不介绍了。
代码实现:
#include <stdio.h>
#include <queue>
#define MAXN 20
typedef struct//使用二维数组来实现图各个结点关系的建立
{
char vertex[MAXN];//表示结点的位置
char arcs[MAXN][MAXN];//表示结点的边
}ArrayGraph;
/**初始化**/
void Init_G(ArrayGraph *G,int a)
{
int i,j;
for(i=0;i<a;i++)
{
for(j=0;j<a;j++)
{
G->arcs[i][j]=0;//刚开始对边初始化为0,0表示没关系。
}
}
}
/**创建**/
void creatG(ArrayGraph *G,int a)
{
int i,j;
printf("请输入结点数据:\n");
for(i=0;i<a;i++)
{
scanf("%c",&G->vertex[i]);//获取结点
getchar();
}
for(i=0;i<a;i++)
{
for(j=i+1;j<a;j++)
{
printf("%c与%c之间是否有关",G->vertex[i],G->vertex[j]);
scanf("%d",&G->arcs[i][j]);//通过用户输入判断两结点是否有关系
G->arcs[j][i]=G->arcs[i][j];//因为是无向图,所以对应的二维矩阵沿对角线对称
}
}
}
/**深度搜寻**/
void ArrayGraph_DFS_1(ArrayGraph *G,int n,int a,bool visited[])
{
int i;
printf("%c\t",G->vertex[n]);
visited[n]=true;
for(i=0;i<a;i++)
{
if(G->arcs[n][i]!=0&&visited[i]==0)
{
ArrayGraph_DFS_1(G,i,a,visited);
}
}
for(i=0;i<a;i++)
{
if(visited[i]==0)
{
ArrayGraph_DFS_1(G,i,a,visited);
}
}
}
/**初始化**/
void DFS(ArrayGraph *G,int n,int a)
{
bool visited[MAXN];
int i;
for(i=0;i<a;++i)
{
visited[i]=false;
}
ArrayGraph_DFS_1(G,n,a,visited);
}
int main(void)
{
ArrayGraph G;
int a;
int n;
printf("请输入想要输入的点数;\n");
scanf("%d",&a);
Init_G(&G,a);
creatG(&G,a);
printf("请输入开始的点:\n");
scanf("%d",&n);
getchar();
printf("\n深度搜寻为:\n");
DFS(&G,n,a);
return 0;
}
运行结果: