//判断路径
#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;
}
以上时基于广度优先遍历的算法路径判断 利用队列实现,如果有需基于深度优先遍历算法历经判断请留言