#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 20
int visit[max];
typedef struct
{
char vexs[max];
int arc[max][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.rear=0;
}
int empty(CqQueue Q)
{
if(Q.front==Q.rear)
return 1;
return 0;
}
void enQueue(CqQueue &Q,int e)
{
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%max;
}
void deQueue(CqQueue &Q,int &e)
{
e=Q.base[Q.front];
Q.front=(Q.front+1)%max;
}
int locate(MGraph &G,char ch)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(ch==G.vexs[i])
return i;
}
}
void creatGraph(MGraph &G)
{
int i,j,k;
char ch1,ch2;
printf("请输入顶点的个数和边的条数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("请输入顶点:\n");
getchar();
for(i=0;i<G.vexnum;i++)
scanf("%c",&G.vexs[i]);
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arc[i][j]=0;
printf("请依次输入边:\n");
for(k=0;k<G.arcnum;k++)
{
getchar();
printf("请输入第%d条边:\n",k);
scanf("%c%c",&ch1,&ch2);
i=locate(G,ch1);
j=locate(G,ch2);
G.arc[i][j]=G.arc[j][i]=1;
}
}
void DFS(MGraph G,int v)
{
printf("%c",G.vexs[v]);
visit[v]=1;
int i;
for(i=0;i<G.vexnum;i++)
{
if(!visit[i]&&G.arc[v][i]==1)
DFS(G,i);
}
}
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)
{
int i;
printf("%c",G.vexs[v]);
visit[v]=1;
CqQueue Q;
InitQueue(Q);
enQueue(Q,v);
while(!empty(Q))
{
deQueue(Q,v);
for(i=0;i<G.vexnum;i++)
{
if(!visit[i]&&G.arc[v][i]==1)
{
printf("%c",G.vexs[i]);
visit[i]=1;
enQueue(Q,i);
}
}
}
}
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;
creatGraph(G);
DFStravel(G);
printf("\n");
BFStravel(G);
}
自己编写的有什么不对或者值得优化的地方还请指教