#include<stdio.h>
#include<stdlib.h>
#define MAXVNUM 20
#define MAXQSIZE 9 // 最大队列长度(对于循环队列,最大队列长度要减1)
typedef int QElemType;
int visited[MAXVNUM];
typedef struct MGraph
{
int vex[MAXVNUM];
int arcs[MAXVNUM][MAXVNUM];
int vexnum, arcnum;
} MGraph;
struct SqQueue
{
QElemType *base; // 初始化的动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
};
int QueueEmpty(SqQueue Q);
void EnQueue(SqQueue &Q,QElemType e);
void DeQueue(SqQueue &Q,QElemType &e);
void CreatMGraph(MGraph &G);
void DFSTraverse(MGraph G);
void DFS(MGraph G,int v);
void BFSTraverse(MGraph G);
int FirstAdjVex(MGraph G,int v);
int NextAdjVex(MGraph G,int v,int w);
int main()
{
MGraph G;
CreatMGraph(G);
printf("DFS\n");
DFSTraverse(G);
printf("WFS\n");
BFSTraverse(G);
return 0;
}
void InitQueue(SqQueue &Q)
{
// 构造一个空队列Q
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base) // 存储分配失败
exit(0);
Q.front=Q.rear=0;
}
int QueueEmpty(SqQueue Q)
{
// 若队列Q为空队列,则返回TRUE,否则返回FALSE
if(Q.front==Q.rear) // 队列空的标志
return 1;
else
return 0;
}
void EnQueue(SqQueue &Q,QElemType e)
{
// 插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front) // 队列满
exit(0);
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
}
void DeQueue(SqQueue &Q,QElemType &e)
{
// 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if(Q.front==Q.rear) // 队列空
exit(0);
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
}
void CreatMGraph(MGraph &G)
{
int i;
int j;
scanf("%d", &G.vexnum);
for ( i=0; i<G.vexnum; i++)
G.vex[i] = i;
for ( i=0; i<G.vexnum; i++)
for ( j=0; j<G.vexnum; j++)
{
scanf("%d", &G.arcs[i][j]);
}
}
void DFSTraverse(MGraph G)
{
int i;
int k;
for(k=0; k<G.vexnum; k++)
{
for(i=0; i<G.vexnum; i++)
visited[i]=0;
for(i=k; i<G.vexnum; i++)
{
if(!visited[i]) DFS(G,i);
}
printf("\n");
}
}
void DFS(MGraph G,int i)
{
int w;
visited[i]=1;
printf("%d ",G.vex[i]);
for(w=FirstAdjVex(G,i); w>=0; w=NextAdjVex(G,i,w))
{
if(!visited[w]) DFS(G,w);
}
}
void BFSTraverse(MGraph G)
{
int i;
int w;
int k;
SqQueue Q;
InitQueue(Q);
for(k=0; k<G.vexnum; k++)
{
for(i=0; i<G.vexnum; i++)
visited[i]=0;
for(i=k; i<G.vexnum; i++)
{
if(!visited[i])
{
visited[i]=1;
printf("%d ",G.vex[i]);
EnQueue(Q,i);
while(!QueueEmpty(Q))
{
DeQueue(Q,i);
for(w=FirstAdjVex(G,i); w>=0; w=NextAdjVex(G,i,w))
{
if(!visited[w])
{
visited[w]=1;
printf("%d ",G.vex[w]);
EnQueue(Q,w);
}
}
}
}
}
printf("\n");
}
}
// 返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1
int FirstAdjVex(MGraph G,int v)
{
int i;
for(i=0; i<G.vexnum; i++)
if(G.arcs[v][i]!=0)
return i;
return -1;
}
// 返回下一个邻接顶点的序号
int NextAdjVex(MGraph G,int v,int w)
{
int i;
for(i=w+1; i<G.vexnum; i++)
if(G.arcs[v][i]!=0)
return i;
return -1;
}