深度算法遍历图结构

用深度算法遍历图结构

根据邻接表建立的图结构,首先先建立一个链式表、再建立头非空的链式表链接。这样便于图节点的插入和删除,而且节省空间。

各功能函数的设计

建立图结构 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);//深度搜索所有城市
}

设计的图结构

在这里插入图片描述
显示结果
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值