图可以用邻接矩阵的方式表示,本文用邻接矩阵建立无向图,INF比图中的任何权值都大,表示两个顶点之间没有边。图的邻接矩阵结构体定义如下:
#define maxSize 30
typedef int VertexType;//定义结点类型
typedef struct
{
int edges[maxSize][maxSize];
int n,e;
VertexType vex[maxSize];
}MGraph;
图的建立的算法如下
#include<stdio.h>
#define QueueSize 100//广度优先搜索遍历中用到的队列的大小
#define OK 1
#define ERROR 0
#define INF 9999999
typedef enum{FALSE,TRUE} Boolean;//用枚举类型
typedef struct
{
int front ;
int rear;
int count;
int data[QueueSize];
}CirQueue;
//标记是否访问过
Boolean visited[maxSize];
void CreateMGraph( MGraph * m)
{
int i,j,k;
int n1,n2;
printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
scanf("%d,%d",&(m->n),&(m->e));
//给顶点编号
for(i=0;i<m->n;i++)
m->vex[i]=i;
for(i=0;i<m->n;i++)
for(j=0;j<m->n;j++)
m->edges[i][j]=INF;
printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n");
for(k=0;k<m->e;k++)
{
printf("请输入第%d条边对应的结点序号:",k+1);
scanf("%d,%d",&n1,&n2);
m->edges[n1][n2]=1;
m->edges[n2][n1]=1;//无向图的邻接矩阵是对称的
}
}
/***********************************************************/
/*************深度优先遍历**********************************/
/**********************************************************/
void DFSM(MGraph * m,int i)//访问结点i
{
int k;
printf("深度优先遍历结点:%d\n",m->vex[i]);
visited[i]=TRUE;
for (k=0;k<m->n ;k++)
if(m->edges[i][k]==1 && !visited[k])
DFSM(m,k);
}
void DFSMTraver (MGraph * m)
{
int i;
for(i=0;i<m->n;i++)
visited[i]=FALSE;
for(i=0;i<m->n ;i++)
if(!visited[i]) DFSM(m,i);
}
/*******************************************************/
/**********************广度优先遍历*********************/
/*******************************************************/
void InitQueue(CirQueue * Q)
{
Q->front=Q->rear=0;
Q->count=0;
Q->QueueSize=0;
}
int QueueEmpty(CirQueue * Q)
{
return Q->count==0;
}
int QueueFull (CirQueue * Q)
{
return Q->count==QueueSize;
}
void EnQueue(CirQueue * Q,int x)
{
if(QueueFull(Q))
{
printf("队列已满!\n");
return;
}
else
{
Q->count++;
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%QueueSize;
}
}
int DeQueue(CirQueue * Q)//返回出队元素
{
int temp;
if(QueueEmpty(Q))
{
printf("队列已空!\n");
return INF;
}
else
{
temp=Q->data[Q->front];
Q->count--;
Q->front=(Q->front+1)%QueueSize;
return temp;
}
}
void BFSM(MGraph *m,int k)//广度优先遍历第K个结点
{
int i,j;
CirQueue Q;
InitQueue(&Q);
printf("广度优先遍历结点:%d\n",m->vex[k]);
visited[k]=TRUE;
EnQueue(&Q,k);
while(!QueueEmpty(&Q))
{
i=DeQueue(&Q);
if(i!=INF)
{
for(j=0;j<m->n;j++)
if(m->edges[i][j]==1&&!visited[j])
{
printf("广度优先遍历结点:%d\n",m->vex[j]);
visited[j]=TRUE;
EnQueue(&Q,j);
}
}
}
}
void BFSMTraver(MGraph * m)
{
int i;
for(i=0;i<m->n;i++)
visited[i]=FALSE;
for(i=0;i<m->n;i++)
if(!visited[i])
BFSM(m,i);
}
void main (void)
{
MGraph m;
CreateMGraph(& m);
DFSMTraver(&m);
BFSMTraver(&m);
return OK;
}
以上代码测试通过!