深度、广度优先遍历算法C实现
来源:互联网 发布:淘宝网触屏版下载 编辑:程序博客网 时间:2024/05/16 10:19
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXNODE 30//最大节点数int graph[MAXNODE][MAXNODE]={{0,1,1,0,0,0},{1,0,0,1,0,0},{1,0,0,0,0,1},\ {0,1,0,0,1,0},{0,0,0,1,0,0},{0,0,1,0,0,0}};//默认无向图char sign[MAXNODE]={'a','b','c','d','e','f'};//默认节点标志int num_node=6,num_edge=7;//节点数 边数int queue[MAXNODE],stack[MAXNODE],stack_2[MAXNODE];//队列 栈int *end_queue=NULL,*end_stack=NULL,*end_stack_2=stack_2;//队列指针 栈指针void in_queue(int a);//入队函数int out_queue();//出队函数int insearch_queue(int i);//查找队列void display_queue();//显示队列void in_stack(int a);//入栈函数int out_stack();//出栈函数int insearch_stack(int i);//查找栈void display_stack();//显示栈void main(){/* // There are declarations! void display_graph();//显示无向图 void init(int choose);//初始化函数 void build();//建立无向图 void DFS(char a);//深度优先 void BFS(char a);//广度优先*/ int i,j,k; int choose; char c; while (choose!=1 && choose!=2) { printf("**********************************************************\n"); printf(" 1、构建无向路径图 2、使用默认无向路径图 3、退出程序\n"); printf("**********************************************************\n"); printf("请选择:"); scanf("%d",&choose); switch(choose) { case 1: init(choose); build(); break; case 2: init(choose); break; case 3:exit(0); break; default:printf("请输入1-3!\n"); break; } } display_graph(); while (1) { printf("******************************************\n"); printf(" 1、广度优先 2、深度优先 3、退出程序\n"); printf("******************************************\n"); printf("请选择:"); scanf("%d",&choose); getchar(); switch(choose) { case 1: printf("输入起点:"); scanf("%c",&c); getchar(); BFS(c); break; case 2: printf("输入起点:"); scanf("%c",&c); getchar(); DFS(c); break; case 3:exit(0); break; default:printf("请输入1-3!\n"); break; } }}void init(int choose){ int i,j; if (choose==1) { for (i=0;i<MAXNODE;i++) { for (j=0;j<MAXNODE;j++) { graph[i][j]=0; } } } for (i=0;i<20;i++) { queue[i]=-1; } for (i=0;i<20;i++) { stack_2[i]=stack[i]=-1; }}void build(){ void link(char a,char b);//连接节点 int i,j; char a,b; printf("请输入顶点数,边数(用逗号分开,例如:8,5):");//输入节点数边数 scanf("%d,%d",&num_node,&num_edge); getchar(); for (i=0;i<num_node;i++)//输入节点标志 { printf("输入NO.%d标志(一个字符):",i+1); scanf("%c",&sign[i]); getchar(); } printf("请输入边(用逗号分开,例如:a,b):"); for (i=0;i<num_edge;i++)//输入边 { printf("输入第%d条边:",i+1); scanf("%c,%c",&a,&b); getchar(); printf("%c %c\n",a,b); link(a,b); }}void link(char a,char b){ int a_num,b_num,i; for (i=0;i<num_node;i++) { if (a==sign[i]) { a_num=i; break; } } for (i=0;i<num_node;i++) { if (b==sign[i]) { b_num=i; break; } } graph[a_num][b_num]=1; graph[b_num][a_num]=1;}void display_graph(){ int i,j; printf("构建的无向图如下:\n "); for (j=0;j<num_node;j++) { printf("%-2c",sign[j]); } printf("\n"); for (i=0;i<num_node;i++) { printf("%-2c",sign[i]); for (j=0;j<num_node;j++) { printf("%-2d",graph[i][j]); } printf("\n"); }}void DFS(char a){ int i,a_num,j,repect; for (i=0;i<num_node;i++)//字母对应数字行 { if (a==sign[i]) { a_num=i; break; } } in_stack(a_num); for (j=0;j<30;j++) { for(i=0;i<num_node;i++) { if(graph[*end_stack][i]==1) { if (insearch_stack(i)!=1) { in_stack(i); i=-1; } } } if (out_stack()==1) { break; } } printf("深度优先:"); for (i=0;stack_2[i]!=-1;i++) { printf("%c ",sign[stack_2[i]]); } printf("\n\n");}void BFS(char a){ int a_num,i,j,repect; int *p; for (i=0;i<num_node;i++)//找出字母对应行 { if (a==sign[i]) { a_num=i; break; } } in_queue(a_num); for (j=0;j<30;j++) { for(i=0;i<num_node;i++) { if(graph[*end_queue][i]==1) { if (insearch_queue(i)!=1) { in_queue(i); } } } if (out_queue()==1) { break; } } p=queue; printf("广度优先:"); for (i=num_node;i>0;i--) { printf("%c ",sign[*(p+i-1)]); } printf("\n\n");}void in_queue(int a){ int *p; if (end_queue==NULL) { end_queue=queue; *end_queue=a; } else { for (p=queue;*p!=-1;p++) { } p--; for (;;p--) { *(p+1)=*p; if (p==queue) { *p=a; break; } } end_queue++; }// printf("in:"); //display_queue();}int out_queue(){ if (end_queue!=queue) { end_queue--; // printf("out:"); // display_queue(); return 0; } else { end_queue=NULL; // printf("out:"); // display_queue(); return 1; }}int insearch_queue(int i){ int j; for(j=0;j<20;j++) { if(i==queue[j]) { return 1; } } return 0;}void display_queue(){ int *p,i; p=queue; for (i=0;i<20;i++) { printf("%d ",*(p+i)); } printf("\n");}void in_stack(int a){ *end_stack_2=a; end_stack_2++; if (end_stack==NULL) { end_stack=stack; *end_stack=a; // printf("in:"); // display_stack(); } else { end_stack++; *end_stack=a; // printf("in:"); // display_stack(); }}int out_stack(){ if (end_stack!=stack) { *end_stack=-1; end_stack--; // printf("out:"); // display_stack(); return 0; } else { *end_stack=-1; end_stack=NULL; // printf("out:"); // display_stack(); return 1; }}int insearch_stack(int i){ int j; for(j=0;j<20;j++) { if(i==stack_2[j]) { return 1; } } return 0;}void display_stack(){ int *p,i; p=stack; for (i=0;i<20;i++) { printf("%d ",*(p+i)); } printf("\n");}
0 0
- 深度、广度优先遍历算法C实现
- 深度、广度优先遍历算法C实现
- 深度优先遍历与广度优先遍历算法的C语言实现
- 深度优先和广度优先遍历算法
- 邻接矩阵深度与广度优先遍历算法(c++实现)
- Java实现图的深度和广度优先遍历算法
- 图的遍历之深度优先搜索算法&&广度优先优先算法的实现
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
- 图算法:1、邻接表实现图的深度优先遍历,广度优先遍历
- 深度优先遍历与广度优先遍历(c++二叉树算法实现)
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 图的邻接矩阵存储 深度优先遍历 广度优先遍历 C语言实现
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- c语言实现图的深度优先遍历和广度优先遍历
- C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历
- 图的深度优先遍历和广度优先遍历算法
- 树的广度优先遍历与深度优先遍历算法
- vbs 声明数组变量的奇怪问题
- GridLayout,子控件EditText内容超出屏幕
- gulp快速搭建web项目
- CachedBluetoothDevice.java该怎么用?
- ASP.NET WEB控件如何添加控件事件的响应函数
- 深度、广度优先遍历算法C实现
- day5 part2:实例开发2---仿Windows计算器
- httpget api,4.0中要求在线程中实现
- 集合框架_Set集合总结
- java web项目开发流程
- Android 用PRODUCT_COPY_FILES拷贝xml文件怎么还能被检查语法问题呢?
- java.lang.UnsatisfiedLinkError
- 将matlab的figure保存为pdf,避免图片太大缺失
- viewpager 滑至最后一屏禁止向右滑,滑至第一屏禁止向左滑,怎么实现