基于深度或广度遍历算法判断结点之间是否存在路径

//判断路径
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 100 
int visited[10];
typedef struct queue
{
	int a[maxsize];
	int front,rear;
}queue;
typedef struct EdgeNode
{
	struct EdgeNode *next;
	int adjvex;
}EdgeNode;//边结点
typedef struct VertexNode
{
	char data;
	struct EdgeNode *firstedge;
}VertexNode;//头节点
typedef struct Grapah
{
	VertexNode adjlist[20];//邻接表数组
	int e,v;//结点数 边数 
}Grapha;
void InitGrapha (Grapha &G)
{
	printf("请输入顶点数v\n");
	scanf("%d",&G.v);
	getchar();
	int i,j,k;
	for(i=0;i<G.v;i++)//输入顶点 
	{
		G.adjlist[i].data=getchar();
		G.adjlist[i].firstedge=NULL;
	} 
	printf("请输入边数e\n");
	scanf("%d",&G.e);
	getchar();
	for(j=0;j<G.e;j++)
	{
		printf("请输入有向边的起始点\n"); 
		scanf("%d %d",&i,&k);
		getchar();
		EdgeNode *s;
		s=(EdgeNode *)malloc(sizeof(EdgeNode));
		s->adjvex=k;
		s->next=G.adjlist[i].firstedge;
		G.adjlist[i].firstedge=s;
	}
}
void print(Grapha G)
{
	int i;
	for(i=0;i<G.v;i++)
	{
		printf("%d %c\n",i,G.adjlist[i].data);
	}
}
void Initqueue(queue &q)
{
	q.front=q.rear=maxsize-1;//循环队列初始化 
}
void Enqueue(queue &q,int x)//入队 
{
	if((q.rear+1)%maxsize==q.front)//队满
	{
		printf("队列已满"); 
	}
	q.rear=(q.rear+1)%maxsize;
	q.a[q.rear]=x;
}
int Dehead(queue &q)//退出队列 
{
	if(q.rear==q.front)
	{
		printf("队空");//empty 
	}
	q.front=(q.front+1)%maxsize;
	return q.a[q.front];
}
int judgement (int i,int j,queue &q,Grapha G)
{
	int yes=0;
	int t;
	Enqueue(q,i);//起点序号入队 
	EdgeNode *p; 	
	while(q.front!=q.rear||yes==0)// 将在其到达终点路径上的所有结点入队 并且依次出队访问,每次循环都将访问该节点边结点组成的单链表
	{	    
		i=Dehead(q);//每次出列的函数要在第一个while和第二个while之间 
		p=G.adjlist[i].firstedge;
		while(p!=NULL&&yes==0)//判断其邻接的结点是否为终点,且并将其邻接且未访问的结点入队 
		{
			t=p->adjvex;
			if(t==j)
			yes=1;
			if(visited[t]==0)
			{
			 Enqueue(q,t);
			 visited[t]=1;
			}
			else p=p->next;
		}
	}
	return yes;
}
int main()
{
	Grapha G;
	int i,j,k;
	InitGrapha (G);
	print(G);
	queue q;
	Initqueue(q);
	printf("初始化完成\n"); 
	printf("请输入您所要判断的路径的起始序号");
	for(i=0;i<10;i++)//初始化辅助数组 
	{
		visited[i]=0;
	}
	printf("开始\n");
	i=0;j=3; 
	int yes=judgement (i,j,q,G);
	if(yes==1)
	{
		printf("success"); 
	}else 
	printf("faluse");
	return 0;
}

以上时基于广度优先遍历的算法路径判断 利用队列实现,如果有需基于深度优先遍历算法历经判断请留言

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值