当前位置: 首页 > news >正文

c语言数据结构--构造无向图(算法6.1),深度和广度遍历

实验内容:

实现教材算法6.2利用邻接矩阵构造无向图的算法,提供从邻接矩阵获得邻接表的功能,在此基础上进行深度优先遍历和广度优先遍历。

实验步骤:

(1)按照实验要求编写代码,构造无向图。
创建所示无向图
屏幕输出邻接矩阵
0 1 0 0 0 1
1 0 1 1 0 0
0 1 0 1 1 0
0 1 1 0 1 0
0 0 1 1 0 1
1 0 0 0 1 0

深度优先遍历

屏幕输出: 1 2 3 4 5 6

广度优先遍历

屏幕输出:1 2 6 3 4 5
(2)输入验收用例,验证其输出结果。

#include <iostream>
#ifndef DATA_STRUCTURE_STATUS_H
#include <stdio.h>
//状态码
#define TRUE              1
#define FALSE            0
#define OK                  1
#define ERROR           0
#endif
#ifndef OVERFLOW
#define OVERFLOW    -2
#endif // OVERFLOW
#ifndef NULL
#define NULL((void*) 0)
#endif // NULL
typedef int Status;
#define MaxInt 32767  //表示极大值
#define MVNum 100     //表示最大顶点数
using namespace std;//图的邻接矩阵存储表示:
typedef int VerTexType;//顶点字符类型
typedef int ArcType;    //边的权值
typedef struct
{VerTexType vexs[MVNum];//顶点表ArcType arcs[MVNum][MVNum];//邻接矩阵int vexnum,arcnum;//图的当前点数和边数
}AMGraph;typedef string OtherInfo;//图的邻接表存储表示:
typedef struct ArcNode//边结构
{int adjvex;struct ArcNode *nextarc;OtherInfo info;//其他信息
}ArcNode;typedef struct VNode//顶点结构
{VerTexType data;//存储顶点信息ArcNode *firstarc;
}VNode,AdjList[MVNum];typedef struct
{AdjList vertics;//邻接表int vexnum,arcnum;//顶点数和弧数int kind;
}ALGraph;bool visited[MVNum];int LocateVex(AMGraph G,VerTexType u)
{//定位每个顶点的位置int i;for(i=0;i<G.vexnum;i++){if(u==G.vexs[i])return i;}return -1;
}//构建无向网:
Status CreateUDN(AMGraph &G)
{cout<<"请输入图的顶点数目,边数目:";cin>>G.vexnum>>G.arcnum;//输入当前的顶点数目和边的数目for(int i=0;i<G.vexnum;i++){cout<<"请输入第"<<i<<"个顶点:";cin>>G.vexs[i];//初始化点的信息}for(int i=0;i<G.vexnum;i++){for(int j=0;j<G.vexnum;j++){G.arcs[i][j]=MaxInt;//初始化邻接矩阵}}int i,j;int v1,v2,w;for(int k=0;k<G.arcnum;k++){cout<<"边:";cin>>v1>>v2>>w;i=LocateVex(G,v1);j=LocateVex(G,v2);G.arcs[i][j]=w;G.arcs[j][i]=G.arcs[i][j];}return OK;
}//邻接矩阵转换成邻接表
void change(AMGraph G,ALGraph &p)
{int i,j;ArcNode *q;for(i=0;i<G.vexnum;i++){p.vertics[i].firstarc=NULL;}for(i=0;i<G.vexnum;i++){for(j=0;j<G.vexnum;j++){if(G.arcs[i][j]){q=new ArcNode;q->adjvex=j;q->nextarc=p.vertics[j].firstarc;p.vertics[j].firstarc=q;}}}
}//深度优先遍历:
void DFS_AM(AMGraph G,int v)
{cout<<v+1;visited[v]=true;for(int w=0;w<G.vexnum;w++)//依次检查邻接矩阵所在的行{if(G.arcs[v][w]!=0&&(!visited[w]))DFS_AM(G,w);//w是v的邻接点,如果w未访问,则递归调用DFS}
}//广度优先遍历:
void BFS(AMGraph G,int v)
{for(int i=0;i<G.vexnum;i++){visited[i]=false;}int Q[MaxInt];cout<<G.vexs[v];visited[v]=true;int w,u;int front=-1,rear=-1;Q[++rear]=v;while(front!=rear){u=Q[++front];for(w=0;w<G.vexnum;w++){if((!visited[w])&&(G.arcs[u][w]==1)){cout<<G.vexs[w];visited[w]=true;Q[++rear]=w;}}}
}int main()
{cout<<"无向网图"<<endl;cout<<"1.构建网图"<<endl;cout<<"2.输出邻接矩阵"<<endl;cout<<"3.深度优先遍历"<<endl;cout<<"4.广度优先遍历"<<endl;int n,a;AMGraph G;ALGraph P;while(1){cout<<"请输入你的选择:"<<endl;cin>>n;if(n==1){CreateUDN(G);cout<<"操作完成!"<<endl;}else if(n==2){cout<<"邻接矩阵为:";for(int i=0;i<G.vexnum;i++){cout<<endl;for(int j=0;j<G.vexnum;j++){if(G.arcs[i][j]==MaxInt){cout<<"0 ";}else{cout<<G.arcs[i][j]<<" ";}}}cout<<"\n操作完成"<<endl;}else if(n==3){cout<<"深度优先遍历为:";DFS_AM(G,0);cout<<"\n操作完成!"<<endl;}else if(n==4){cout<<"广度优先遍历为:";BFS(G,0);cout<<"\n操作完成"<<endl;}else if(n==5){cout<<"本次操作结束"<<endl;break;}}return 0;
}

在这里插入图片描述

相关文章:

  • day29--452. 用最少数量的箭引爆气球+435. 无重叠区间+763.划分字母区间
  • RABBITMQ的本地测试证书生成脚本
  • Windows右键没有新建Word、PPT与Excel的解决方法
  • vue + echart 饼形图
  • 每日刷题(二分图,二分查找,dfs搜索)
  • x.permute(0, 3, 1, 2).contiguous() 和 x.permute(0, 3, 1, 2)
  • C语言笔记29 •单链表经典算法OJ题-1.合并两个升序链表•
  • 在 PostgreSQL 里如何处理数据的归档和清理策略的优化?
  • Sentieon应用教程:本地使用-Quick_start
  • 笔记第二弹
  • 【BUG】已解决:JsonMappingException
  • 从零开始学习嵌入式---- C高级编译工具
  • FastAPI 学习之路(三十四)数据库多表操作
  • 基于术语词典干预的机器翻译挑战赛笔记Task1 跑通baseline
  • mybatis基础语法
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [译]前端离线指南(上)
  • export和import的用法总结
  • HTTP--网络协议分层,http历史(二)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java取消线程实例
  • java正则表式的使用
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Python十分钟制作属于你自己的个性logo
  • sessionStorage和localStorage
  • Spring Boot MyBatis配置多种数据库
  • SpringBoot几种定时任务的实现方式
  • 闭包,sync使用细节
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 批量截取pdf文件
  • 前端面试之CSS3新特性
  • 突破自己的技术思维
  • 找一份好的前端工作,起点很重要
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (四)linux文件内容查看
  • .jks文件(JAVA KeyStore)
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net后端程序发布到nignx上,通过nginx访问
  • .NET开源、简单、实用的数据库文档生成工具
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .Net实现SCrypt Hash加密
  • .NET委托:一个关于C#的睡前故事
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /etc/sudoer文件配置简析
  • ::什么意思
  • :O)修改linux硬件时间
  • @Autowired 和 @Resource 区别的补充说明与示例
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [20171101]rman to destination.txt
  • [2021 蓝帽杯] One Pointer PHP
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心