深度搜索和广度搜索领接表实现_基于邻接表存储的图的深度优先遍历和广度优先遍历...

这篇博客详细介绍了如何使用邻接表结构实现图的深度优先搜索(DFS)和广度优先搜索(BFS)。通过创建邻接表、初始化访问状态数组,然后进行DFS和BFS遍历,输出遍历结果。示例代码包括了队列操作和图的构建过程。
摘要由CSDN通过智能技术生成

/** 邻接表深度优先遍历和广度优先遍历 **/#include#include

#define MaxVex 255

#define TRUE 1

#define FALSE 0typedefchar VertexType; //顶点类型

typedef intBool;

Bool visited[MaxVex];//全局数组,记录图中节点访问状态

typedefstruct EdgeNode { //边表节点

int adjvex; //该邻接点在顶点数组中的下标

struct EdgeNode *next; //链域 指向下一个邻接点

}EdgeNode;

typedefstruct VertexNode { //头节点

VertexType data; //顶点信息

EdgeNode *firstedge; //边表头指针(指向第一条依附于该顶点的弧的指针)

}VertexNode,AdjList[MaxVex]; //顶点数组(结构体数组)

typedefstructGraph{

AdjList adjList;int numVertexes,numEdges; //图中当前的结点数以及边数

}Graph,*GraphAdjList;/** 队列定义及相关操作(广度遍历会用到此循环队列) **/typedefstructLoopQueue{intdata[MaxVex];intfront,rear;

}LoopQueue,*Queue; //队列结构

void initQueue(Queue &Q){

Q->front=Q->rear=0;

}

Bool QueueEmpty(Queue&Q){if(Q->front == Q->rear){returnTRUE;

}else{returnFALSE;

}

}

Bool QueueFull(Queue&Q){if((Q->rear+1)%MaxVex == Q->front){returnTRUE;

}else{returnFALSE;

}

}/**

* 队尾插入元素*/

void EnQueue(Queue &Q,inte){if(!QueueFull(Q)){

Q->data[Q->rear] =e;

Q->rear = (Q->rear+1)%MaxVex;

}

}/**

* 队头删除元素*/

void DeQueue(Queue &Q,int *e){if(!QueueEmpty(Q)){*e = Q->data[Q->front];

Q->front = (Q->front+1)%MaxVex;

}

}/*************************************************/

/**

* 建立图的邻接表结构(此处以无向图为例)*/

void CreateALGraph(GraphAdjList &G){inti, j, k;if(G==NULL){

G= (GraphAdjList)malloc(sizeof(Graph));

}

printf("输入图的结点数以及边数:");

scanf("%d%d",&G->numVertexes,&G->numEdges);

fflush(stdin);

printf("===========================\n");

printf("输入各个顶点的数据:\n");for (i=0; inumVertexes; ++i){

printf("顶点%d:",i+1);

scanf("%c", &(G->adjList[i].data));

G->adjList[i].firstedge =NULL;

fflush(stdin);

}

printf("===========================\n");for (k=0; knumEdges; ++k){

printf("输入(vi,vj)上的顶点序号:");

scanf("%d%d",&i,&j);

EdgeNode*ptrEdgeNode = (EdgeNode*)malloc(sizeof(EdgeNode));

ptrEdgeNode->adjvex =j;

ptrEdgeNode->next = G->adjList[i].firstedge;

G->adjList[i].firstedge =ptrEdgeNode;

ptrEdgeNode= (EdgeNode*)malloc(sizeof(EdgeNode));

ptrEdgeNode->adjvex =i;

ptrEdgeNode->next = G->adjList[j].firstedge;

G->adjList[j].firstedge =ptrEdgeNode;

}

}void DFS(GraphAdjList &G, inti){

visited[i]=TRUE;

printf("%c", G->adjList[i].data);

EdgeNode*p = G->adjList[i].firstedge;while(p){if(!visited[p->adjvex]){

DFS(G,p->adjvex); //递归深度遍历

}

p= p->next;

}

}/**

* 深度优先遍历*/

void DFSTraverse(GraphAdjList &G){inti;for (i=0; inumVertexes; ++i){

visited[i]= FALSE; //初始化访问数组visited的元素值为false

}for (i=0; inumVertexes; ++i){if(!visited[i]){ //节点尚未访问

DFS(G,i);

}

}

}/**

* 图的广度优先遍历*/

void BFSTraverse(GraphAdjList &G){inti;

Queue Q= (Queue)malloc(sizeof(LoopQueue));for (i=0; inumVertexes; ++i){

visited[i]=FALSE;

}

initQueue(Q);for (i=0; inumVertexes; ++i){if(!visited[i]){

visited[i]=TRUE;

printf("%c", G->adjList[i].data);

EnQueue(Q, i);while (!QueueEmpty(Q)){

DeQueue(Q,&i);

EdgeNode*p = G->adjList[i].firstedge;while(p){if (!visited[p->adjvex]){

visited[p->adjvex] =TRUE;

printf("%c", G->adjList[p->adjvex].data);

EnQueue(Q, p->adjvex);

}

p= p->next;

}

}

}

}

}/**

* 程序入口*/

intmain(){

GraphAdjList G=NULL;

CreateALGraph(G);

printf("\n图的深度优先遍历为:");

DFSTraverse(G);

printf("\n图的广度优先遍历为:");

BFSTraverse(G);

printf("\n");return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值