用深度算法遍历图结构
根据邻接表建立的图结构,首先先建立一个链式表、再建立头非空的链式表链接。这样便于图节点的插入和删除,而且节省空间。
各功能函数的设计
建立图结构 void creat(algraph *g)
功能:根据输入的顺序表及其后面连接的链式表构建矩阵表。
建立深度优先搜索: dfs(algraph *g,int i)
功能:以vi为结点进行深度优先搜索。
建立查找所有的图结构:dfsra(algraph *)
功能:从任意节点出发遍历该图的所有的结点、然后再找另外图的结点。
代码及其解析
#define maaxv 10//定义maaxv大小
#define m 20//定义m大小
#include<stdio.h>//调用stdio.h库
#include<malloc.h>//调用malloc.h库
typedef struct node//定义链式表
{
int city;//city为int类型
struct node *next;//指针类型为struct类型
}jd;//结点简写为jd
typedef struct tnode
{
char leave[20];
jd *firstarc;
}td;
typedef struct
{
td ci[m];
int n;
}algraph;
//建立邻接表表示的图
void creat(algraph *g)
{
int i=1;
int m1,j;
jd *p,*p1;//创建jd类型的指针
printf("请输入城市的个数:");//输出
scanf("%d",&g->n);//输入要输入的城市个数n
for (i=0;i<g->n;i++)//将n个城市输入
{
printf("请输入城市名称:");//输出
scanf("%s",&g->ci[i].leave);//输入第i个城市的名字
printf("请输入 %d 城市相关联的边数",i);//输出
scanf("%d",&m1);//输入与第i个城市相关的城市个数
printf("请输入此城市关联的城市\n");//输出
p=(jd *)malloc(sizeof(jd));//创建一个jd类型的空间给p,用来存放输入的城市
scanf("%d",&p->city);//输入要输入城市的存放位置
p->next=NULL;//创立的节点为独立节点
g->ci[i].firstarc=p;//赋值
p1=p;//赋值
for(j=2;j<=m1;j++)//迭代循环输入联接城市的存放位置
{
printf("请输入下一个城市\n");
p=(jd *)malloc(sizeof(jd));
scanf("%d",&p->city);
p->next=NULL;
p1->next=p;
}
}
}
int visited[maaxv];//浏览城市的最大个数
//以vi为出发点对邻接表表示的图g进行深度优先搜索算法
int dfs(algraph *g,int i)
{
jd *p;//创建jd类型的p指针
printf("浏览城市:%s\n",g->ci[i].leave);//输出浏览的城市
visited[i]=1;//赋值,标志该城市被浏览
p=g->ci[i].firstarc;//赋值
while(p)
{
if (!visited[p->city]) //判断该城市未被浏览
{
dfs(g, p->city);//迭代浏览于此城市关联的城市
}
p=p->next; //赋值,找下一个未被浏览的城市
}
}
void dfsra(algraph *g)//创建搜索所有图的结点
{
int i;
for (i=0;i<g->n;i++)//随意找一个结点开始浏览城市
visited[i]=0;//赋值、表示该城市没被浏览
for(i=0;i<g->n;i++)//迭代搜索所有的城市浏览
if(!visited[i]) dfs(g,i);
}
main()//主函数,开始该程序
{
algraph *g;//创建algraph的结点g
printf("请输入邻接表存储的图:\n");//输出
g=(algraph *)malloc(sizeof(algraph));//创建空间用来存放g
creat(g);//创建图结构
printf("下面以深度优先遍历该图 \n");//输出
dfsra(g);//深度搜索所有城市
}
设计的图结构
显示结果