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

news2024/9/29 5:34:03

实验内容:

实现教材算法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;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[AI 快手 LivePortrait] 引领高效肖像动画新时代

快手推出了 LivePortrait&#xff0c;具有拼接和重定向控制的高效肖像动画。 快速开始 下载代码&#xff0c;准备环境 git clone https://github.com/KwaiVGI/LivePortrait cd LivePortrait# create env using conda conda create -n LivePortrait python3.9.18 conda activ…

mysql8多值索引

MySQL8新出了一个多值索引&#xff0c;我还没体验过呢&#xff0c;今天试一试。 建表 我先建个表试一试多值索引的效果。我粗略地看了下多值索引的介绍&#xff0c;发现是只适用于数组类型的。所以我建一个含有数组字段的表试一试。语法还是挺麻烦的&#xff1a; create tabl…

创建 ComfyUI 自定义节点的基本指南

ComfyUI 自定义节点基础教程 开始前的准备理解 ComfyUI 节点创建自定义节点1. 定义节点参数2. 实现节点逻辑3. 与 ComfyUI 集成 测试和改进节点结论 ComfyUI 是一个多功能的Stable Diffusion图像/视频生成工具&#xff0c;能够让开发者设计并实现自定义节点&#xff0c;扩展功能…

python库(9):prettytable库快速实现ASCII表格

下面介绍一个快速制作ASCII表格库——prettytable&#xff0c;可以方便地制作简单表格。 1 安装prettytable pip install -i https://pypi.tuna.tsinghua.edu.cn/simple prettytable 结果如下&#xff1a; 2 代码实例 from prettytable import PrettyTable table PrettyTa…

arm架构安装chrome

在ARM架构设备上安装谷歌软件或应用通常涉及到几个步骤&#xff0c;这取决于你要安装的具体谷歌产品&#xff0c;比如谷歌浏览器、Google Play服务或者是其他谷歌开发的软件。下面我会给出一些常见的指导步骤&#xff0c;以安装谷歌浏览器为例&#xff1a; 在Linux ARM64上安装…

微软发布Win11 21H2七月更新补丁KB5040431,快来体验!

系统之家于7月10日发出最新报道&#xff0c;微软为Win11 21H2用户发布了七月的安全更新补丁KB5040431。用户升级系统后&#xff0c;会发现版本号升至22000.3079。此次更新针对远程桌面MultiPoint Server在争用条件会导致服务停止响应等多个问题进行修复。接下来跟随小编看看此次…

移动校园(9):uniapp照片上传,以及从nodejs服务器获取照片

后端&#xff1a; 安装中间件multer,刚好对应前端提交数据 npm install --save multer Multer详解&#xff08;Node.js中间件&#xff09;-CSDN博客 一直这样 又看了二个小时&#xff0c;搜遍全网&#xff0c;改了又改&#xff0c;各种测试&#xff0c;终于让我发现了问题&a…

哈喽GPT-4o,程序员如何通过GPT-4o提高办公效率

目录 一、编写工作汇报Prompt&#xff1a;我是一名Java开发工程师&#xff0c;请写一份工作总结&#xff0c;工作内容是一个SpringBootVue实现的图书管理系统&#xff0c;按下面的结构来撰写&#xff1a;1. 工作背景&#xff1b;2. 工作内容&#xff1b;3. 工作建议&#xff1b…

Golang期末作业之电子商城(源码)

作品介绍 1.网页作品简介方面 &#xff1a;主要有&#xff1a;首页 商品详情 购物车 订单 评价 支付 总共 5个页面 2.作品使用的技术:这个作品基于Golang语言&#xff0c;并且结合一些前端的知识&#xff0c;例如:HTML、CSS、JS、AJAX等等知识点&#xff0c;同时连接数据库的&…

【效率提升】多功能组织和整理软件一Notion

Notion下载地址&#xff1a;https://www.notion.so/desktop Notion 是一款多功能办公软件&#xff0c;非常适合进行知识整理、团队协作、项目整理等。 下面是几个我推荐Notion的关键点&#xff1a; 一、排版高度自由&#xff1a;Notion的页面可以嵌套&#xff0c;在页面中还支…

无线网的ip地址固定吗

在数字化日益普及的今天&#xff0c;无线网络已成为我们生活与工作中不可或缺的一部分。然而&#xff0c;对于许多非专业用户来说&#xff0c;无线网络背后的技术细节仍然充满了神秘感。其中&#xff0c;一个常见的问题是&#xff1a;无线网的IP地址是固定的吗&#xff1f;本文…

工厂水电燃气表流量计等能耗计量仪表非侵入式拍照抄表的方案

在企业园区、工厂等企事业单位&#xff0c;传统的手动抄表方式已逐渐不能满足现代化、信息化管理的需求。为了提高抄表工作的效率&#xff0c;减少人工操作的误差&#xff0c;同时保障数据的安全性和实时性&#xff0c;我们提出了拍照采集抄表方案。本方案旨在通过拍照的方式&a…

java使用poi-tl模版引擎导出word之饼状图生成及循环批量生成饼状图

文章目录 一、单个饼状图生成1.word模版制作2.编写接口完整代码3.导出结果 二、批量生成饼图1.word模版制作2.编写接口完整代码3.导出结果 一、单个饼状图生成 1.word模版制作 在word中创建一个饼状图&#xff0c;点击图表&#xff0c;点击“文本选项”&#xff0c;在可选文字…

Conformal low power-2.电源感知等效性检查

电源感知等效性检查 ■ 第24页&#xff1a;电源感知等效性检查概述 ■ 第24页&#xff1a;启动低功耗&#xff08;等效性检查&#xff09;软件 ■ 第25页&#xff1a;电源感知等效性检查流程 ■ 第28页&#xff1a;电源感知等效性检查示例Do文件 电源感知等效性检查概述…

【4】A-Frame样例指南——完结

一、如何构建基本场景&#xff1f; 让我们从构建一个基本的 A-Frame场景开始。为此&#xff0c;我们需要对 HTML 有基本的了解。我们将学习如何&#xff1a; 使用原语添加 3D 实体&#xff08;即对象&#xff09; 通过位置、旋转、缩放来变换 3D 空间中的实体 添加环境 添加…

泰迪智能科技大数据实验室产品-实训管理平台介绍

高校大数据实验室通常配备有先进的计算机硬件和软件工具&#xff0c;以及专门的数据库和分析平台&#xff0c;以便研究人员和学生能够进行复杂的数据处理、分析和解释。主要利用大数据技术进行科学研究、技术开发和人才培养。 泰迪智能科技实训管理平台作为教学核心&#xff0c…

DBeaver 最新激活应用,亲测可用!!快来试试!!

DBeaver 最新激活应用&#xff0c;亲测可用&#xff01;&#xff01;快来试试&#xff01;&#xff01;简介DBeaver是一种通用数据库管理工具&#xff0c;适用于需要以专业方式使用数据的每个人&#xff1b;适用于开发人员&#xff0c;数据库管理员https://mp.weixin.qq.com/s/…

WEB安全:网络安全常用术语

一、攻击类别 漏洞&#xff1a;硬件、软件、协议&#xff0c;代码层次的缺陷。 后⻔&#xff1a;方便后续进行系统留下的隐蔽后⻔程序。 病毒&#xff1a;一种可以自我复制并传播&#xff0c;感染计算机和网络系统的恶意软件(Malware)&#xff0c;它能损害数据、系统功能或拦…

vs2022报找不到.netframework,version=V4.8的引用程序集

最近在win7上面安装vs2022 17.6版本&#xff0c;打开.net项目编译的时候出现了这个提示。 解决方案就是安装.net4.8开发者工具包&#xff0c;不是运行工具包。 安装完成之后在项目的属性中修改&#xff1a; 点击下载&#xff1a;.net4.8开发者工具包

性价比高的照明品牌有哪些?揭秘五款性价比高的照明灯

我国整体近视率呈低龄高发态势。为什么会这样呢?原因不外乎就是用眼时间长、不良坐姿、不合适的用眼环境。国内的学习压力一直就没有降低过&#xff0c;这也就导致学生课业多&#xff0c;晚上挑灯读写成常态。高强度的用眼自然会对眼睛伤害大。护眼台灯就是一个不错的选择&…