深度优先算法用c语言,深度、广度优先遍历算法C实现
#include
#include
#include
#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
{
for (j=0;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
{
printf("输入NO.%d标志(一个字符):",i+1);
scanf("%c",&sign[i]);
getchar();
}
printf("请输入边(用逗号分开,例如:a,b):");
for (i=0;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
{
if (a==sign[i])
{
a_num=i;
break;
}
}
for (i=0;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
{
printf("%-2c",sign[j]);
}
printf("\n");
for (i=0;i
{
printf("%-2c",sign[i]);
for (j=0;j
{
printf("%-2d",graph[i][j]);
}
printf("\n");
}
}
void DFS(char a)
{
int i,a_num,j,repect;
for (i=0;i
{
if (a==sign[i])
{
a_num=i;
break;
}
}
in_stack(a_num);
for (j=0;j<30;j++)
{
for(i=0;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
{
if (a==sign[i])
{
a_num=i;
break;
}
}
in_queue(a_num);
for (j=0;j<30;j++)
{
for(i=0;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");
}
深度优先算法用c语言,深度、广度优先遍历算法C实现相关推荐
- 有向图的深度/广度优先遍历算法
// 邻接表存储与广度和深度优先算法 #include <iostream> using namespace std; #define MAX_VERTEX_NUM 100 typede ...
- 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...
- 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...
- 广度优先遍历算法-01寻找制高点问题
寻找制高点 前言 广度优先遍历算法在搜索答案时不像深度优先那样一条路走到底,而是采用由近及远的方式,先访问离起始点最近的所有点,再访问远一些的点.由于这种一层层搜索的策略,又叫做层次遍历算法. 简介 ...
- 图论算法(5):图的广度优先遍历 BFS
本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src 查看文章内的图片可能需要科学上网! 因为 ...
- 主要推荐系统算法总结及Youtube深度学习推荐算法实例概括
主要推荐系统算法总结及Youtube深度学习推荐算法实例概括 By ZhuZhiboSmith2017年7月09日 17:00 现如今,许多公司使用大数据来做超级相关推荐,并以此来增加收益.在海量推荐 ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- 深度、广度优先遍历算法python
文章目录 一.深度优先 1.怎么抓住小偷 2.二叉树中的最大路径和 3.最大的岛屿 二.广度优先 1.树的右侧 2.合法的括号 3.寻找制高点 4.选课的智慧 一.深度优先 该篇学习笔记来自于< ...
- 简述树的深度优先及广度优先遍历算法,并说明非递归实现?
深度优先遍历二叉树. 1. 中序遍历(LDR)的递归算法: 若二叉树为空,则算法结束:否则: 中序遍历根结点的左子树: 访问根结点: 中序遍历根结点的右子树. 2. 前序遍历(DLR)的递归算法: 若 ...
- 以0结点为起点实现上述图的深度优先和广度优先遍历算法
MatGraph.h #pragma once #include <iostream> using namespace std;#define MAXV 7 //最大顶点个数 #defin ...
最新文章
- 干货!我的计算机网络怎么考了 100 分的?
- python语言跨平台语言吗_python属于跨平台语言吗?
- 开发日记-20190703 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 9
- Map类集合K/V能不能存储null值的情况
- memlock mysql_mysql配置详解(不断更新)
- 企业数字化转型到底是什么?带你一图看懂答案
- 详细介绍android rom移植知识普及
- UT源码105032014052
- 南京GIS公司名单(持续更新中)
- ECshop增加paypal_EC流程
- 年终固定资产盘点报告可一键生成
- 联想电脑虚拟化开启方法
- 无题--仅以此文来总结我过去的五年
- 惊恐,还真有大神把地府后台管理系统做出来了,“阎王爷”疯狂点
- 【英语语法】句子类型
- java 外部输入数据 语句_在编写Java应用程序时,如需从键盘输入各种类型的多个数据,则必须在程序的开头写上( )语句。...
- 【安全研究】Linux后渗透常见后门驻留方式分析
- ARM amba总线介绍
- Java 基础--封装
- 目前用到的原型设计工具总结
热门文章
- js自动实现读取二维码内容
- java解压zip_Java实现zip压缩文件的解压
- 如何使两个div在同一行显示
- 二氧化钛接枝聚(苯乙烯-二乙烯苯)/马来酸酐多孔纳米复合微球
- JDBC连接MySQL时日志出现警告WARN: Establishing SSL connection without server's identity verification is not re
- php大马编写,带你走进php大马的结构模块编写之路
- 常见图片格式归纳总结
- CentOS7 Yum卸载open-jdk
- vue3,电商项目中的商品详情-图片预览组件
- uniapp快速搭建小程序项目 完整过程