C/C++语言 数据结构 创建邻接表存储的无向图及其邻接表的输出

news2024/11/24 6:49:50

目录

1.邻接表相关知识补充

 2. 图的邻接存储表示

3.测试输入与输出样例

4.代码实现

4.1 创建无向图邻接表

4.2 输入无向图的邻接表


1.邻接表相关知识补充

定义:

对于图中每个顶点 vi,把所有邻接于 vi的顶点(对有向图是将从vi出发的弧的弧头顶点链接在一起)链接成一个带头结点的单链表,将所有头结点顺序存储在一个一维数组中。

示例:下面左图G2对应的邻接表如右边所示。

 2. 图的邻接存储表示

#define MAXVEX 20 /*最大顶点数*/
typedef enum{DG,DN,UDG,UDN} GraphKind; /*有向图,有向网,无向图,无向网*/
typedef struct ENode /*表结点类型*/
{
    int adjvex;
    struct ENode *nextarc;
    int weight;
}ENode;
typedef int VexType;
typedef struct VNode /*头结点类型*/
{
    VexType vex;
    ENode *firstarc;
}VNode, AdjList[MAXVEX]; /*邻接表类型定义*/
typedef struct
{
    AdjList vertices; /*用邻接表存储顶点集合及边集合*/
    int vexnum,edgenum;
    GraphKind kind;
}ALGraph; /*邻接表存储的图的类型定义*/

3.测试输入与输出样例

测试输入:

2 5 6

0 1 0 3 1 2 1 4 2 3 2 4

预期输出:

0->3->1

1->4->2->0

2->4->3->1

3->2->0 4->2->1

4.代码实现

这里主要写了两个函数,一个用于生成无向图的邻接表,一个用于输出其邻接表

4.1 创建无向图邻接表

void CreateUDG_ALG(ALGraph &g) /*构造无向图的邻接表*/
{
    int kind,dot,edges;
    scanf("%d %d %d",&kind,&dot,&edges);
    g.vexnum=dot;g.edgenum=edges;g.kind=(GraphKind)kind;
/*这里有关枚举的类型再赋值问题(g.kind),枚举变量的再赋值不能直接是数字,如果是数字的话需要一个枚举/类型的强制转换*/
    VNode*pn=NULL;
    for(int i=0;i<dot;i++) //创建六个头结点
    {
        pn=new VNode;
        pn->vex=i;// VexType类型就是int类型
        pn->firstarc=NULL;//初始化置空
        g.vertices[i]=*pn;   //vertices数组类型是头结点类型
    }
    int x,y;
    ENode *en=NULL;ENode *tn=NULL; //都是边结点类型
    for(int j=0;j<edges;j++) //6个变,所以循环6次 开始创建邻接表
    {
        en= new ENode;    //边结点指针
        // scanf("%d",&x);  //第一个点
        // scanf("%d",&y);  //第二个点
        scanf("%d%d",&x,&y);  //也可以写在一起

        //将输入的信息添加到边结点上去,采用链表头插法的方式不停改变我们的指针
        en->adjvex=y;en->weight=0;en->nextarc=g.vertices[x].firstarc;
        g.vertices[x].firstarc=en;

        //下面这段代码也是一样的,采用链表头插法的方式        
        tn= new ENode;    //边结点指针
        tn->adjvex=x;tn->weight=0;tn->nextarc=g.vertices[y].firstarc;
        g.vertices[y].firstarc=tn;
    } 
}

4.2 输入无向图的邻接表

void PrintAdjList(ALGraph g) /*输出邻接表*/
{
    ENode *sn;//定义一个边结点指针,用于移动改变输出的边结点
    for(int i=0;i<g.vexnum;i++)
    {
        sn=g.vertices[i].firstarc;//初始化为每个顶点的第一条边的地址
        printf("%d",i);
        while(sn!=NULL)//循环输出我们的每个顶点的边结点信息
        {
            printf("->%d",sn->adjvex);

//每输出完一个边结点就移动至下一个边结点,直到最后一个边结点为止,也就是指针为空的时候
            sn=sn->nextarc;
        }
        printf("\n");//完成一个顶点的全部边结点输出后,换行
    }
}

整体就是采用循环的方式,头插法创建我们的无向图的邻接表,关键在于其中我们指针的移动。

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

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

相关文章

windows/linux命令行操作快捷方式

命令行快捷键 Ctrla&#xff1a;光标回到命令行首。 &#xff08;a&#xff1a;ahead&#xff09; Ctrle&#xff1a;光标回到命令行尾。 &#xff08;e&#xff1a;end&#xff09; Ctrlb&#xff1a;光标向行首移动一个字符。 &#xff08;b&#xff1a;backwards&#xff…

【模拟面试】23届本科生拿下字节/京东/网易研发offer,到底有多强?

这是一场模拟面试&#xff0c;面试选手是今年的应届生&#xff0c;拿下了字节/京东/网易的offer。 如果你想参加模拟面试欢迎私聊我&#xff0c;仅限后端&#xff0c;go语言更好。 下面可以看看这个同学的简历 我个人觉得挺不错的 总共问了几个问题 你们这个计费系统是干什么的…

想要精通算法和SQL的成长之路 - 判断子序列问题

想要精通算法和SQL的成长之路 - 判断子序列问题前言一. 判断子序列1.1 动态规划做法1.2 双指针二. 不同的子序列前言 想要精通算法和SQL的成长之路 - 系列导航 一. 判断子序列 原题链接 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字…

阿里p8实战总结SpringCloud微服务分布式系统文档

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

Interval Envision图像库,非常强大的图像功能

Interval Envision图像库被认为具有增强Borland和Embarcadero Delphi的能力&#xff0c;并为用户和开发人员提供非常强大的图像功能。该库能够为用户提供一个图像文件I/O&#xff0c;用于文件的流行格式、扫描、打印过程、ocr的接口&#xff0c;以及最终的图片处理&#xff0c;…

Linux文件系统——文件系统、挂载点、目录结构

目录 一、目录结构 1.1 基本介绍 1.2 详细说明目录作用 二、挂载点 一、目录结构 1.1 基本介绍 Linux是一切皆文件&#xff0c;将所用的东西当做文件处理 目录结构就是一个单一的树状结构 整个的目录树只有一个树根&#xff1a;/ 根目录 文件夹分门别类的放到根目录…

vue配置环境变量

vue配置环境变量目录概述需求&#xff1a;设计思路实现思路分析1.URL管理2.网页3.加载.env4.分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for c…

卷积神经网络kernel/filter/stride

【关于神经网络的学习】 【参考】&#xff1a;卷积核filter和kernal的区别 - 一杯明月 - 博客园 (cnblogs.com) 【参考】&#xff1a;(1条消息) 卷积神经网络的卷积核&#xff08;kernel&#xff09;、输入尺寸&#xff08;input&#xff09;、步长&#xff08;stride&#x…

[附源码]计算机毕业设计springboot学生疫情防控信息填报系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用frp进行内网穿透

frp概述 frp 是一个高性能的反向代理应用&#xff0c;可以帮助您轻松地进行内网穿透&#xff0c;对外网提供服务&#xff0c;支持 tcp, http, https 等协议类型&#xff0c;并且 web 服务支持根据域名进行路由转发。frp 采用 C/S 模式&#xff0c;将服务端部署在具有公网 IP 机…

Kafka - topic producer consumer 常用命令

Kafka常用命令 Topic相关 创建topic bin/kafka-topics.sh --create --zookeeper node02:2181 --replication-factor 1 --partitions 1 --topic testkafka3.3.1新版本就会提示不兼容&#xff0c;需要改用新版本 Exception in thread "main" joptsimple.Unrecogniz…

单链表初阶的两道基础题

初阶链表刷题翻转单链表&#xff08;链接在末尾&#xff09;链表的倒数第K个结点&#xff08;链接在末尾&#xff09;普通解法进阶解法注意&#xff01;&#xff01;&#xff01;学习的是解题的思维&#xff01; 翻转单链表&#xff08;链接在末尾&#xff09; 解题思路 如果给…

Java#31(不可变集合,Stream流和方法引用)

目录 一.创建不可变集合: 不可以被修改的集合 1.List接口创建不可变集合 2.Set接口创建不可变集合 3.Map接口创建不可变集合 二.Stream流 1.如何获取Stream流? 2.Stream流的中间方法 3.Stream流终结方法 三.方法引用 1.引用静态方法 2.引用成员方法 3.引用结构方法…

【Java学习】JavaWeb---Request Response

文章目录1. Request1. 1Request继承体系1.2 Request获取请求数据1.3 Request请求转发2. Response2. 1 Response设置响应数据功能介绍2. 2 Response完成重定向2. 3 Response响应字符数据2. 4 Response响应字节数据1. Request 1. 1Request继承体系 1.2 Request获取请求数据 1.3 …

制造企业如何借数字化能力进军万亿国际市场?

历时七十余载&#xff0c;中国建立了世界最完整的现代工业体系&#xff0c;实现了从“制造大国”向“制造强国”的历史性跨越&#xff0c;同时&#xff0c;这片土地也孕育了全球最庞大的自动化物流系统。 报告显示&#xff0c;从2012到2021年&#xff0c;中国社会物流总额和社…

转行软件测试我后悔了

很多时候&#xff0c;都在想当初做的转行软件测试行业的决定是对的吗&#xff1f;现在后悔还来得及吗&#xff1f; 记得在求职的时候&#xff0c;面试官经常问我&#xff1a;“为什么要选择软件测试工作?” 而我也会经常说一堆自己有的没的优势去应付。 工作这么久了&#x…

anaconda迁移深度学习虚拟环境 and 在云服务器上配置

1 anaconda 虚拟环境操作 1、 查看虚拟环境 conda info -e2、 创建新的虚拟环境 conda create -n deeplearning_all pip python3.63、 激活新建的虚拟环境 Conda activate deeplearning_all2 环境中相关库的版本即安装说明&#xff08;这些库都是对应匹配的&#xff09; …

【git】git@github.com: Permission denied (publickey).报错问题

1、引发这个问题的情况 本媛开发&#xff0c;会经常性用到gitee & GitHub两个库 毕竟国内项目转战仓到gitee&#xff0c; 但是国外原框架还是GitHub居多 于是就出现连接pull-push经常性切换问题 这个报错是因为本地两个仓都有ssh公共私有密钥导致的 2、解决方案&#xff…

ECharts数据可视化(案例)

ECharts数据可视化 ECharts介绍 官网链接&#xff1a;https://echarts.apache.org/zh/index.html ECharts是一个使用 JavaScript 实现的开源可视化库&#xff0c;可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Ch…

华为高级技术专家多年经验分享微服务治理体系、架构及实践文档

前言 都说程序员工资高、待遇好&#xff0c; 2022 金九银十到了&#xff0c;你的小目标是 30K、40K&#xff0c;还是 16薪的 20K&#xff1f;作为一名 Java 开发工程师&#xff0c;当能力可以满足公司业务需求时&#xff0c;拿到超预期的 Offer 并不算难。然而&#xff0c;提升…