#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实现相关推荐

  1. 有向图的深度/广度优先遍历算法

    // 邻接表存储与广度和深度优先算法 #include <iostream>  using namespace std; #define MAX_VERTEX_NUM 100 typede ...

  2. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

  3. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  4. 广度优先遍历算法-01寻找制高点问题

    寻找制高点 前言 广度优先遍历算法在搜索答案时不像深度优先那样一条路走到底,而是采用由近及远的方式,先访问离起始点最近的所有点,再访问远一些的点.由于这种一层层搜索的策略,又叫做层次遍历算法. 简介 ...

  5. 图论算法(5):图的广度优先遍历 BFS

    本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src 查看文章内的图片可能需要科学上网! 因为 ...

  6. 主要推荐系统算法总结及Youtube深度学习推荐算法实例概括

    主要推荐系统算法总结及Youtube深度学习推荐算法实例概括 By ZhuZhiboSmith2017年7月09日 17:00 现如今,许多公司使用大数据来做超级相关推荐,并以此来增加收益.在海量推荐 ...

  7. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

  8. 深度、广度优先遍历算法python

    文章目录 一.深度优先 1.怎么抓住小偷 2.二叉树中的最大路径和 3.最大的岛屿 二.广度优先 1.树的右侧 2.合法的括号 3.寻找制高点 4.选课的智慧 一.深度优先 该篇学习笔记来自于< ...

  9. 简述树的深度优先及广度优先遍历算法,并说明非递归实现?

    深度优先遍历二叉树. 1. 中序遍历(LDR)的递归算法: 若二叉树为空,则算法结束:否则: 中序遍历根结点的左子树: 访问根结点: 中序遍历根结点的右子树. 2. 前序遍历(DLR)的递归算法: 若 ...

  10. 以0结点为起点实现上述图的深度优先和广度优先遍历算法

    MatGraph.h #pragma once #include <iostream> using namespace std;#define MAXV 7 //最大顶点个数 #defin ...

最新文章

  1. 干货!我的计算机网络怎么考了 100 分的?
  2. python语言跨平台语言吗_python属于跨平台语言吗?
  3. 开发日记-20190703 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 9
  4. Map类集合K/V能不能存储null值的情况
  5. memlock mysql_mysql配置详解(不断更新)
  6. 企业数字化转型到底是什么?带你一图看懂答案
  7. 详细介绍android rom移植知识普及
  8. UT源码105032014052
  9. 南京GIS公司名单(持续更新中)
  10. ECshop增加paypal_EC流程
  11. 年终固定资产盘点报告可一键生成
  12. 联想电脑虚拟化开启方法
  13. 无题--仅以此文来总结我过去的五年
  14. 惊恐,还真有大神把地府后台管理系统做出来了,“阎王爷”疯狂点
  15. 【英语语法】句子类型
  16. java 外部输入数据 语句_在编写Java应用程序时,如需从键盘输入各种类型的多个数据,则必须在程序的开头写上( )语句。...
  17. 【安全研究】Linux后渗透常见后门驻留方式分析
  18. ARM amba总线介绍
  19. Java 基础--封装
  20. 目前用到的原型设计工具总结

热门文章

  1. js自动实现读取二维码内容
  2. java解压zip_Java实现zip压缩文件的解压
  3. 如何使两个div在同一行显示
  4. 二氧化钛接枝聚(苯乙烯-二乙烯苯)/马来酸酐多孔纳米复合微球
  5. JDBC连接MySQL时日志出现警告WARN: Establishing SSL connection without server's identity verification is not re
  6. php大马编写,带你走进php大马的结构模块编写之路
  7. 常见图片格式归纳总结
  8. CentOS7 Yum卸载open-jdk
  9. vue3,电商项目中的商品详情-图片预览组件
  10. uniapp快速搭建小程序项目 完整过程