C语言实现广度/深度优先算法

2025-05-08 22:27:46

1、首先打开VC++6.0

C语言实现广度/深度优先算法

2、选择文件,新建

C语言实现广度/深度优先算法

3、选择C++ source file 新建一个空白文档

C语言实现广度/深度优先算法

4、首先声明头文件和一些常量#include <stdlib.h>#include <stdio.h> #define MAX_VEXTEX_NUM 9 /* 图中顶点数 */#define ARC_NUM 12 /* 图中弧数 */#define MAX_QUEUEMEM (MAX_VEXTEX_NUM+1)

C语言实现广度/深度优先算法

5、定义数组,因为是排序,必须有数据/* 定义描述图的顶点之间连接信息的数组 */int GraphEdge[ARC_NUM * 2][2] = {{0,1},{1,0},{1,2},{2,1},{2,3},{3,2},{3,4},{4,3},{4,5},{5,4},{5,0},{0,5},{0,6},{6,0},{6,8},{8,6},{6,7},{7,6},{7,8},{8,7},{7,3},{3,7},{8,4},{4,8}};/*定义数组visited用来标示一个顶点是否被访问过*/int visited[MAX_VEXTEX_NUM]={0,0,0,0,0,0,0,0,0};/*定义表结点,即每条弧对应的结点 */

C语言实现广度/深度优先算法

6、定义三个结构体,分别是指针,顶点信息,图的结构typedef struct ArcNode{ int adjvex; /* 该弧所指向的顶点的位置 */ struct ArcNode * nextarc; /* 指向下一条弧的指针 */}ArcNode;/* 定义头结点 */typedef struct VNode{ int data; /* 顶点信息 */ struct ArcNode * firstarc; /* 指向第一条依附该顶点的弧的指针 */}VNode,AdjList[MAX_VEXTEX_NUM]; /* 定义图的结构 */typedef struct {VNode vertices[MAX_VEXTEX_NUM];/* 定义表头数组 */int vexnum; /* 定义图中顶点数 */int arcnum; /* 定义图中弧数 */}ALGraph;

C语言实现广度/深度优先算法

7、现在要建立一个使用邻接表存储的图void CreateGraph(ALGraph * alGraph){int i,j;ArcNode * newnode;ArcNode * v髫潋啜缅exNode;alGraph->vexnum = MAX_VEXTEX_NUM;alGraph->arcnum = ARC_NUM;/* 初始化表头 */for(i=0;i<MAX_VEXTEX_NUM;i++){alGraph->vertices[i].data = i;alGraph->vertices[i].firstarc = NULL;}for(j=0;j<2*ARC_NUM;j++){i = GraphEdge[j][0];if(alGraph->vertices[i].firstarc==NULL){ newnode = ( ArcNode * ) malloc (sizeof(ArcNode)); newnode->adjvex = GraphEdge[j][1]; newnode->nextarc = NULL; alGraph->vertices[i].firstarc = newnode;}else{ vexNode = alGraph->vertices[i].firstarc; while(vexNode->nextarc != NULL) {vexNode = vexNode->nextarc; } newnode = ( ArcNode * ) malloc (sizeof(ArcNode)); newnode->adjvex = GraphEdge[j][1]; newnode->nextarc = NULL; vexNode->nextarc = newnode;}}}

C语言实现广度/深度优先算法

8、输出次图的函数 void OutputGraph(ALGraph * alGraph){int i;ArcNode * vexNode;printf("The graph dedicated by adjacency list is:\n");for(i=0;i<MAX_VEXTEX_NUM;i++){printf("the header is: [%d] -> ",alGraph->vertices[i].data);vexNode = alGraph->vertices[i].firstarc;while(vexNode != NULL){ printf("[%d] -> ",vexNode->adjvex); vexNode=vexNode->nextarc;}printf("[END]\n");}}

C语言实现广度/深度优先算法

9、递归实现DFSvoid DFS(ALGraph * alGraph,int v){int w;ArcNode * vexNode;visited[v] = 1;printf("[%d] -> ",v);vexNode = alGraph->vertices[v].firstarc;while(vexNode != NULL){w = vexNode->adjvex;if(visited[w]==0) DFS(alGraph,w);vexNode = vexNode->nextarc;}}

C语言实现广度/深度优先算法

10、 图的深度优先遍历 void DFSTraverse(ALGraph * alGraph){int i;/*访问标吲柏杷铼志数组初始化*/for(i=0;i<MAX_VEXTEX_NUM;i++){visited[i] = 0;}printf("\n");puts("********************************************");puts("* the function DFSTraverse will traverse *");puts("* the graphby Depth First Search *");puts("********************************************");puts("the result of DFS is:");for(i=0;i<MAX_VEXTEX_NUM;i++){if(visited[i] == 0) DFS(alGraph,i);}printf("[end]\n");}

C语言实现广度/深度优先算法

11、为了实现广度优先遍历,需要借助一个队列 typedef struct{ int queuemem[MAX_QUEUEMEM]; int header; int rear;}QUEUE;void InitQueue(QUEUE *queue){queue->header = 0;queue->rear = 0;}void EnQueue(QUEUE *queue,int v){queue->queuemem[queue->rear] = v;queue->rear++;}int DelQueue(QUEUE *queue){ return queue->queuemem[queue->header++];}int EmptyQueue(QUEUE *queue){ if(queue->header == queue->rear) return 1; return 0;}

C语言实现广度/深度优先算法

12、 广度优先遍历 void BFSTraverse(ALGraph 涯箨唁峦* alGraph){int i;int w;ArcNode * vexNode;QUEUE queue;InitQueue(&queue);/*访问标志数组初始化*/for(i=0;i<MAX_VEXTEX_NUM;i++){visited[i] = 0;}printf("\n");puts("********************************************");puts("* the function BFSTraverse will traverse *");puts("* the graph by Breadth First Search *");puts("********************************************");puts("the result of BFS is:");for(i=0;i<MAX_VEXTEX_NUM;i++){if(visited[i] == 0){visited[i] = 1; printf("[%d] -> ",i); EnQueue(&queue,i); while(!EmptyQueue(&queue)) { w = DelQueue(&queue); vexNode = alGraph->vertices[w].firstarc; while(vexNode != NULL) { w = vexNode->adjvex; if(visited[w]==0) { visited[w] = 1; printf("[%d] -> ",w); EnQueue(&queue,w); } vexNode = vexNode->nextarc; } }}}printf("[end]\n");}

C语言实现广度/深度优先算法

13、一大堆的函数,主函数就几句话。。int main(){/*定义图结点*/ ALGraph alGraph; /*建立图的邻接表*/ CreateGraph(&alGraph); /*输出图的邻接表*/ OutputGraph(&alGraph); /*深度优先遍历*/ DFSTraverse(&alGraph); /*广度优先遍历*/ BFSTraverse(&alGraph); getch(); return 0;}

C语言实现广度/深度优先算法

14、执行结果

C语言实现广度/深度优先算法
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢