无向图的深度优先遍历和广度优先遍历(递归)
queue.h源代码
注释:包括队列数据类型的定义和相关操作
(出队,入队,判断队空,判断队列中是否存在某元素)
int searchQ(LinkQueue &Q,int s) 函数的作用:在将邻接顶点放入队列之前需要先判断队 列中是否已存在此元素,通过查找避免队列中有重复元素。
#include
#include
#include
#include "queen.h"
using namespace std;
//李艳娟实验指导书版本改编,文档在‘文档’文件夹中
//无向无权图---DFS , BFS
#ifndef QUEEN_H_INCLUDED
#define QUEEN_H_INCLUDED
typedef struct Qnode{ //链队结点的类型
int data;
struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct
{ //链队指针类型
QueuePtr front;
QueuePtr rear;
}LinkQueue;
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(Qnode));
if(!Q.front) exit(1); //存储分配失败
Q.front->next=NULL;
}
void EnQueue(LinkQueue &Q,int e)
{ QueuePtr p;
p=(QueuePtr)malloc(sizeof(Qnode));
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
int QueueEmpty(LinkQueue &Q)
{
return(Q.front==Q.rear? 1:0);
}
void DeQueue(LinkQueue &Q,int &e)
{ QueuePtr p;
if(QueueEmpty(Q))
{
printf("\n Queue is free!");
exit(1);
}//if
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.front->next==NULL) Q.rear=Q.front;
free(p);
}
int searchQ(LinkQueue &Q,int s){
QueuePtr p=Q.front;
while(p!=NULL){
if(s==p->data)
return 1;
p=p->next;
}
return -1;
}
#endif // QUEEN_H_INCLUDED
main.cpp源代码
#include
#include
#include
#include "queen.h"
using namespace std;
//李艳娟实验指导书版本改编,文档在‘文档’文件夹中
//无向无权图---DFS , BFS
#define MAX_VERTEX_NUM 20 //顶点最大个数
#define MAXSIZE 20
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
int weight; //边的权
} ArcNode; //表结点
#define VertexType int //顶点元素类型
typedef struct VNode
{
int degree,indegree;//顶点的度,入度
VertexType data;
ArcNode *firstarc;
} VNode/*头结点*/,AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;//顶点的实际数,边的实际数
} ALGraph;
void CreatALGraph(ALGraph &G)
{
int i,j,k,weight;
ArcNode *s;
printf("input vexnum and arcnum:"); //输入顶点数和边数
scanf("%d%d",&G.vexnum, &G.arcnum);
printf("input vertex information:"); //输入顶点信息
for(i=0; i { scanf("%d",&(G.vertices[i].data)); G.vertices[i].firstarc=NULL; } printf("input arcs, input the xuhao\n"); for(k=0; k { printf("information of %dth arc: ",k); //scanf("%d%d%d",&i,&j,&weight); scanf("%d%d",&i,&j); s=(ArcNode*)malloc(sizeof(ArcNode)); s->adjvex=j; //s->weight=weight; s->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=s; s=(ArcNode*)malloc(sizeof(ArcNode)); s->adjvex=i; //s->weight=weight; s->nextarc=G.vertices[j].firstarc; G.vertices[j].firstarc=s; } } void OutputALGraph(ALGraph G) { int i; for(i=0; i { ArcNode * s; printf("%d:%d",i,G.vertices[i].data); //顶点信息 s=G.vertices[i].firstarc; while(s) { // printf("\t%d,%d",s->adjvex,s->weight); printf("\t%d",s->adjvex); s=s->nextarc; } printf("\n"); } } int LocateVertex(ALGraph G, VertexType v) { int i; for(i=0; i if(G.vertices[i].data==v) return i; return -1; } int visited[MAXSIZE]; void DFSws(ALGraph &G, int v) { ArcNode *p; printf("%d ",G.vertices[v].data); visited[v]=1; p=G.vertices[v].firstarc; while (p) { if (!visited[p->adjvex]) DFSws(G,p->adjvex); p=p->nextarc; } } //从第v个顶点出发DFS void DFSTraverse(ALGraph G) { int v; for(v=0; v { visited[v]=0; } for(v=0; v { if(!visited[v]) DFSws(G,v); } printf("\n"); } void BFSTraverse(ALGraph &G) { LinkQueue Q; for(int v=0; v InitQueue(Q); for(int v=0; v if(!visited[v]) { EnQueue(Q,v); while(!QueueEmpty(Q)) { int u; DeQueue(Q,u); visited[u]=1; printf("%d ",G.vertices[u].data);//visit一下 for(ArcNode *w=G.vertices[u].firstarc; w; w=w->nextarc) if(!visited[w->adjvex]&&searchQ(Q,w->adjvex)!=1) EnQueue(Q,w->adjvex); }//while }//if }//BFSTraverse int main() { ALGraph G; CreatALGraph(G); cout<<"****************"< cout<<"图G的邻接表"< OutputALGraph(G); cout<<"****************"< cout<<"深度优先遍历顺序"< DFSTraverse(G); cout<<"****************"< cout<<"广度优先遍历顺序"< BFSTraverse(G); return 0; } 程序运行,示例图 图G如下所示:(7顶点,8条边)