算法代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int VerTexType;
typedef int EdgeType;
typedef struct{
VerTexType verxs[MAXSIZE];
EdgeType arcs[MAXSIZE][MAXSIZE];
int vexnum,arcnum;
}AMGraph;
int visited[MAXSIZE];
void Create_AMGraph(AMGraph * G);
void DFSTraverse(AMGraph G);
void BFSTraverse(AMGraph G);
int main(){
AMGraph G;
printf("\n---采用邻接矩阵表示图的遍历---\n\n");
Create_AMGraph(&G);
printf("\n-----------邻接矩阵深度优先搜索遍历序列---------------\n\n");
DFSTraverse(G);
printf("\n-----------邻接矩阵广度优先搜索遍历序列---------------\n\n");
BFSTraverse(G);
printf("\n\n");
system("pause");
return 0;
}
void Create_AMGraph(AMGraph * G){
int i,j,k;
printf("请输入要创建的顶点数和边数:(空格间隔)\n");
scanf("%d %d",&G->vexnum,&G->arcnum);
getchar();
printf("请输入%d个顶点的值:(空格间隔)\n",G->vexnum);
for(i=0;i<G->vexnum;++i){
scanf("%d",&G->verxs[i]);
getchar();
}
for(i=0;i<G->vexnum;++i)
for(j=0;j<G->arcnum;++j)
G->arcs[i][j]=0;
printf("请输入邻接顶点的下标:(空格间隔)\n");
for(k=0;k<G->arcnum;++k){
scanf("%d %d",&i,&j);
G->arcs[i][j]=1;
G->arcs[j][i]=G->arcs[i][j];
}
}
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front,rear;
}LinkQueue;
int initQueue(LinkQueue *q){
q->front=q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!q->front) return 0;
q->front->next=NULL;
return 1;
}
int EnQueue(LinkQueue *q,QElemType e){
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
if(!s) return 0;
s->data=e;
s->next=NULL;
q->rear->next=s;
q->rear=s;
return 1;
}
int DeQueue(LinkQueue *q,QElemType *e){
QueuePtr p;
if(q->front==q->rear) return 0;
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p) q->rear=q->front;
free(p);
return 1;
}
int QueueEmpty(LinkQueue q){
if(q.front == q.rear) return 1;
return 0;
}
void DFS(AMGraph G,int v){
visited[v]=1;
printf("%d ",G.verxs[v]);
for(int j=0;j<G.vexnum;j++)
if((G.arcs[v][j]!=0)&&!(visited[j]))
DFS(G,j);
}
void DFSTraverse(AMGraph G){
for(int i=0;i<G.vexnum;i++)
visited[i]=0;
for(int i=0;i<G.vexnum;i++)
if(!visited[i]) DFS(G,i);
}
void BFSTraverse(AMGraph G){
int i,j;
LinkQueue Q;
for(i=0;i<G.vexnum;i++) visited[i] = 0;
initQueue(&Q);
for(i=0;i<G.vexnum;i++){
if(!visited[i]){
visited[i] = 1;
printf("%d ",G.verxs[i]);
EnQueue(&Q,i);
while(!QueueEmpty(Q)){
DeQueue(&Q,&i);
for(j=0;j<G.vexnum;j++){
if(G.arcs[i][j] ==1 && !visited[j]){
visited[j] = 1;
printf("%d ",G.verxs[j]);
EnQueue(&Q,j);
}
}
}
}
}
}
运行结果
