有向图的深度遍历和广度遍历(关于邻接表的)

#include
#include
#include
#define max 20
int visit[max];
typedef struct ArcNode
{
	int adjvex;
	struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
	char data;
	ArcNode *fistarc;
}VNode;
typedef struct
{
	VNode vertices[max];
	int vexnum;
	int arcnum;
}MGraph;
typedef struct
{
	int *base;
	int front;
	int rear;
}CqQueue;
void InitQueue(CqQueue &Q)
{
	Q.base=(int *)malloc(max*sizeof(int));
	if(!Q.base)
	    return ;
	Q.front=Q.front=0;
}
int empty(CqQueue Q)
{
	if(Q.rear==Q.front)
	   return 1;
	return 0;
}
void push(CqQueue &Q,int e)
{
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%max;
}
void pop(CqQueue &Q,int &e)
{
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%max;
}
int located(MGraph G,char ch)
{
	int i;
	for(i=0;i<G.vexnum;i++)
	    {
		if(ch==G.vertices[i].data)
		    return i;
		  } 
}
void creatMGraph(MGraph &G)
{
	int i,j,k;
	ArcNode *p,*s; 
	char ch1,ch2;
	printf("请输入该图顶点的个数,以及边的个数:\n");
	scanf("%d%d",&G.vexnum,&G.arcnum);
	getchar();
	printf("请依次输入图的顶点:\n");
	for(i=0;i<G.vexnum;i++)
	  {
	  	scanf("%c",&G.vertices[i].data);
	  	G.vertices[i].fistarc=NULL;
	  }
	for(k=0;k<G.arcnum;k++)
	 {
	 	getchar();
	 	printf("请输入你的第%d条边:\n",k+1);
	 	scanf("%c%c",&ch1,&ch2);
	 	i=located(G,ch1);
	 	j=located(G,ch2);
	 	s=(ArcNode *)malloc(sizeof(ArcNode));
	 	s->adjvex=j;
	 	s->nextarc=NULL;
	 	p=G.vertices[i].fistarc;
	 	if(G.vertices[i].fistarc==NULL)
		 {
		 	G.vertices[i].fistarc=s;
	     }
	    else
	    {
	    	while(p->nextarc)
	    	{
	    		p=p->nextarc;
			}
		    p->nextarc=s;
		}
	 }
}
void DFS(MGraph G,int v)
{
	ArcNode *p;
	printf("%c",G.vertices[v].data);
	visit[v]=1;
	int i;
	for(p=G.vertices[v].fistarc;p;p=p->nextarc)
	{
		if(!visit[i])
		   DFS(G,p->adjvex);
	}
}
void DFStravel(MGraph G)
{
	int i;
	for(i=0;i<G.vexnum;i++)
	    visit[i]=0;
	for(i=0;i<G.vexnum;i++)
	    {
		if(!visit[i])
	     {
	     	DFS(G,i);
		 }
	   }
}
void BFS(MGraph G,int v)
{
	printf("%c",G.vertices[v].data);
	visit[v]=1;
	CqQueue Q;
	ArcNode *p;
	InitQueue(Q);
	push(Q,v);
	int u;
	while(!empty(Q))
	{
		pop(Q,u);
		for(p=G.vertices[u].fistarc;p!=NULL;p=p->nextarc)
		{
			if(!visit[p->adjvex])
			   {
			   printf("%c",G.vertices[p->adjvex].data);
			    visit[p->adjvex]=1;
			    push(Q,p->adjvex);
			  }
		}
	}
}
void BFStravel(MGraph &G)
{
	int i;
	for(i=0;i<G.vexnum;i++)
	{
		visit[i]=0;
	 } 
	for(i=0;i<G.vexnum;i++)
	{
		if(!visit[i])
		  BFS(G,i);
	}
}
int main()
{
	MGraph G;
	creatMGraph(G);
	DFStravel(G);
	printf("\n");
	BFStravel(G);
 } 

你可能感兴趣的:(数据结构,c语言)