深度、广度优先遍历算法C实现
2017-01-08 17:07
716 查看
#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"); }
相关文章推荐
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
- 百度面试题——简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
- 数据结构和算法之:图的深度优先和广度优先遍历及其Java实现
- 简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- JavaScript实现树的遍历算法示例【广度优先与深度优先】
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 图遍历算法分析--深度优先、广度优先(1)
- 图的邻接矩阵存储 深度优先遍历 广度优先遍历 C语言实现
- C#一颗简单多叉树的实现(原理、广度优先遍历、深度优先遍历)
- java实现图的遍历(深度优先遍历和广度优先遍历)
- 用java语言实现图的广度优先遍历和深度优先遍历
- 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- 二叉树搜索树遍历--前序、中序、后序、深度优先、广度优先遍历的简单实现
- 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程
- 图的邻接矩阵生成算法,深度优先遍历算法,广度优先遍历算法,Prime算法。):