一、算法代码
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef int VerTexType;
int visited[MAXSIZE];
typedef struct ArcNode{
int adjvex;
ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
VerTexType data;
ArcNode *firstarc;
}Vnode;
typedef struct{
Vnode verxs[MAXSIZE];
int numNodes,numEdqes;
}AGraph;
AGraph* CreatAGraph();
void DFSTraverse(AGraph G);
void BFSTraverse(AGraph G);
int main(){
AGraph * G;
printf("\n---采用邻接表表示图的遍历---\n\n");
G=CreatAGraph();
printf("\n-----------邻接表深度优先搜索遍历序列---------------\n\n");
DFSTraverse(*G);
printf("\n-----------邻接表广度优先搜索遍历序列---------------\n\n");
BFSTraverse(*G);
printf("\n\n");
system("pause");
return 0;
}
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;
}
int LocateVex(AGraph *G,int v1){
for(int i=0;i<G->numNodes;i++){
if(G->verxs[i].data==v1) return i;
}
return 0;
}
AGraph* CreatAGraph(){
AGraph *G=(AGraph*)malloc(sizeof(AGraph));
printf("请输入要创建图的顶点数和边数:(空格间隔)\n");
scanf("%d %d", &G->numNodes, &G->numEdqes);
getchar();
printf("请输入%d个顶点的值:(空格间隔)\n",G->numNodes);
for(int i=0;i<G->numNodes;i++){
scanf("%d",&G->verxs[i].data);
G->verxs[i].firstarc=NULL;
}
printf("请输入弧尾和弧头:(空格间隔)\n");
for(int k=0;k<G->numEdqes;++k){
int v1,v2,i,j;
scanf("%d %d",&v1,&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G->verxs[i].firstarc;
G->verxs[i].firstarc=p;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=i;
p->nextarc=G->verxs[j].firstarc;
G->verxs[j].firstarc=p;
}
return G;
}
void DFS(AGraph G,int v){
ArcNode *p;
visited[v]=1;
printf("%d ",G.verxs[v].data);
p=G.verxs[v].firstarc;
while(p!=NULL){
if(visited[p->adjvex]==0){
DFS(G,p->adjvex);
}
p=p->nextarc;
}
}
void DFSTraverse(AGraph G){
for(int i=0;i<G.numNodes;i++)
visited[i]=0;
for(int i=0;i<G.numNodes;i++)
if(!visited[i]) DFS(G,i);
}
void BFSTraverse(AGraph G){
LinkQueue q;
initQueue(&q);
for (int i=0;i<G.numNodes;i++) visited[i] = 0;
for (int i=0; i<G.numNodes;i++){
if (visited[i]==0){
visited[i]=1;
printf("%d ",G.verxs[i].data);
EnQueue(&q,i);
while(!QueueEmpty(q)){
int index;
DeQueue(&q,&index);
ArcNode* s=G.verxs[index].firstarc;
while(s!=NULL){
if(visited[s->adjvex]==0){
visited[s->adjvex]=1;
printf("%d ",G.verxs[s->adjvex].data);
EnQueue(&q,s->adjvex);
}
s=s->nextarc;
}
}
}
}
}
二、运行结果