#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#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);
}
有向图的深度遍历和广度遍历(关于邻接表的)
最新推荐文章于 2022-11-26 15:47:14 发布