GDPU 数据结构 天码行空11

文章目录

  • 数据结构实验十一 图的创建与存储
    • 一、实验目的
    • 二、实验内容
    • 三、【实验源代码】
      • 🍻 CPP版
      • 🍻 c 语言版
      • 🍻 java版
    • 四、【实验结果】
    • 五、【实验总结】

数据结构实验十一 图的创建与存储

一、实验目的

1、 理解图的存储结构与基本操作;
2、 掌握图的创建过程

二、实验内容

1.请把下图以邻接矩阵的结构存储,并打印输出此邻接矩阵。
图的创建代码参考教材例题.
提示:首先构建图的逻辑模型,得出该图的顶点集和边集,调用相应的函数生成图的邻接矩阵,并打印出邻接矩阵。
2.用邻接表存储上图,并输出邻接表。(此题为选做)

三、【实验源代码】

🍻 CPP版

#include<iostream>
using namespace std;

const int MAX_N = 6;
const int MAX_M = 6 * 5;

int g[MAX_N][MAX_N]; // 邻接矩阵
int h[MAX_N], e[MAX_M], w[MAX_M], ne[MAX_M]; // 邻接表
int n = 6, m = 0, idx = 0; // n为节点数,m为边数,idx为邻接表中下一条边的索引

void add(int a, int b, int c)
{
	// 邻接矩阵加边
	g[a][b] = c;
	
	// 邻接表加边 (头插法)
	e[idx] = b; // b表示当前边的终点
	w[idx] = c; // c表示当前边的权值
	ne[idx] = h[a]; // h[a]表示节点a的第一条边在邻接表中的位置,ne[idx]表示a节点的下一条边在邻接表中的位置
	h[a] = idx++; // 更新节点a的第一条边的位置
}

void init()
{
	// A B C D E F
	// 0 1 2 3 4 5
	
	// 初始化邻接表的头结点
	for (int i = 0; i < n; i++)
		h[i] = -1;
	
	// 加边
	add(1, 0, 2);
	add(2, 1, 15);
	add(0, 2, 5);
	add(0, 3, 30);
	add(2, 5, 7);
	add(1, 4, 8);
	add(4, 3, 4);
	add(5, 3, 10);
	add(5, 4, 18);
}

void print()
{
	// 输出邻接矩阵
	cout << "输出邻接矩阵:" << endl;
	cout << "   A  B  C  D  E  F" << endl;
	char c = 'A';
	for (int i = 0; i < n; i++)
	{
		cout << c++ << "  ";
		for (int j = 0; j < n; j++)
			printf("%-2d ",g[i][j]);
//          cout << g[i][j] << " ";
		cout << endl;
	}
	
	// 输出邻接表
	cout << "\n	输出邻接表:" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << (char)('A' + i); // 输出当前节点的名称
		int x = h[i]; // 获取当前节点的第一条边在邻接表中的位置
		while (x != -1)
		{
			cout << " --[" << w[x] << "]--> " << (char)('A' + e[x]); // 输出当前边的权值和终点
			x = ne[x]; // 移动到下一条边
		}
		cout << endl;
	}
}

int main()
{
	n = 6; // 设置节点数为6
	char nodes[] = { 'A', 'B', 'C', 'D', 'E', 'F' }; // 节点名称
	
	init(); // 初始化图
	print(); // 输出邻接矩阵和邻接表
	
	return 0;
}

🍻 c 语言版

#include <stdio.h>

#define MAX_N 6
#define MAX_M (6 * 5)

int g[MAX_N][MAX_N]; // 邻接矩阵
int h[MAX_N], e[MAX_M], w[MAX_M], ne[MAX_M]; // 邻接表
int n = 6, m = 0, idx = 0; // n为节点数,m为边数,idx为邻接表中下一条边的索引

void add(int a, int b, int c)
{
    // 邻接矩阵加边
    g[a][b] = c;

    // 邻接表加边 (头插法)
    e[idx] = b; // b表示当前边的终点
    w[idx] = c; // c表示当前边的权值
    ne[idx] = h[a]; // h[a]表示节点a的第一条边在邻接表中的位置,ne[idx]表示a节点的下一条边在邻接表中的位置
    h[a] = idx++; // 更新节点a的第一条边的位置
}

void init()
{
    // A B C D E F
    // 0 1 2 3 4 5

    // 初始化邻接表的头结点
    for (int i = 0; i < n; i++)
        h[i] = -1;

    // 加边
    add(1, 0, 2);
    add(2, 1, 15);
    add(0, 2, 5);
    add(0, 3, 30);
    add(2, 5, 7);
    add(1, 4, 8);
    add(4, 3, 4);
    add(5, 3, 10);
    add(5, 4, 18);
}

void print()
{
    // 输出邻接矩阵
    printf("输出邻接矩阵:\n");
    printf("   A  B  C  D  E  F\n");
    char c = 'A';
    for (int i = 0; i < n; i++)
    {
        printf("%c  ", c++);
        for (int j = 0; j < n; j++)
            printf("%-2d ", g[i][j]);
        printf("\n");
    }

    // 输出邻接表
    printf("\n	输出邻接表:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%c", (char)('A' + i)); // 输出当前节点的名称
        int x = h[i]; // 获取当前节点的第一条边在邻接表中的位置
        while (x != -1)
        {
            printf(" --[%d]--> %c", w[x], (char)('A' + e[x])); // 输出当前边的权值和终点
            x = ne[x]; // 移动到下一条边
        }
        printf("\n");
    }
}

int main()
{
    n = 6; // 设置节点数为6
    char nodes[] = { 'A', 'B', 'C', 'D', 'E', 'F' }; // 节点名称

    init(); // 初始化图
    print(); // 输出邻接矩阵和邻接表

    return 0;
}

🍻 java版

package 数据结构实验;

public class 图的创建和存储
{
	static int[][] g;// (邻接矩阵)
	static int n = 6, m = 6 * 5, idx = 0;
	static int[] h = new int[n];
	static int[] e = new int[m];
	static int[] w = new int[m];
	static int[] ne = new int[m];

	static void add(int a, int b, int c)
	{
//		邻接矩阵加边
		g[a][b] = c;
//		邻接表加边 (头插法)
		e[idx] = b;
		ne[idx] = h[a];
		w[idx] = c;
		h[a] = idx++;
	}

	static void init()
	{
//		A B C D E F
//		0 1 2 3 4 5
//		初始化邻接表的头结点
		for (int i = 0; i < n; i++)
			h[i] = -1;

//		加边
		add(1, 0, 2);
		add(2, 1, 15);
		add(0, 2, 5);
		add(0, 3, 30);
		add(2, 5, 7);
		add(1, 4, 8);
		add(4, 3, 4);
		add(5, 3, 10);
		add(5, 4, 18);
	}

	static void print()
	{
//		输出邻接矩阵
		System.out.println("输出邻接矩阵:");
		// 表头
		System.out.println("   A  B  C  D  E  F");
		char c = 'A';
		for (int i = 0; i < n; i++)
		{
			System.out.print(c++ + "  ");
			for (int j = 0; j < n; j++)
				System.out.printf("%-2d ", g[i][j]);
			System.out.println();
		}
//		输出邻接表
		System.out.println("\n输出邻接表:");
		for (int i = 0; i < n; i++)
		{
			System.out.print((char) ('A' + i));
			int x = h[i];
			while (x != -1)
			{
				System.out.print(" --" + w[x] + "--> " + (char) ('A' + e[x]));
				x = ne[x];
			}
			System.out.println();
		}
	}

	public static void main(String[] args)
	{
		n = 6;
		char[] nodes = { 'A', 'B', 'C', 'D', 'E', 'F' };
		g = new int[n][n];
		init();
		print();

	}
}

四、【实验结果】

在这里插入图片描述

五、【实验总结】

balabala

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac电脑系统活动监控:iStat Menus 中文 for Mac

iStat Menus是一款Mac操作系统上的系统监控工具&#xff0c;它提供了实时的系统状态和性能数据&#xff0c;让用户可以方便地监控和管理自己的电脑。iStat Menus以菜单栏图标的形式显示各种系统指标&#xff0c;用户可以轻松访问和查看这些信息。 以下是iStat Menus软件的一些…

基于SSM安全生产培训管理平台设计与实现 毕业设计源码26918

赠送源码-毕业设计&#xff1a;SSM 安全生产培训平台https://www.bilibili.com/video/BV1gH4y1z7c6/?vd_source72970c26ba7734ebd1a34aa537ef5301 目录 摘 要 Abstract 第1章 前 言 1.1 研究背景 1.2 研究现状 1.3 系统开发目标 第2章 系统开发环境 2.1 JAVA简介…

VOC数据集转换为COCO数据集

VOC数据集格式 get_list.py import os import random import shutil# 设置随机种子 random.seed(1000)# 判断Annotations和JpegImages是否对应 train_precent=0.8 label_path= "../../Annotations" print(os.path.abspath(label_path)) save="../Main" pr…

服务号升级成订阅号容易弄吗

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;一、文章推送的篇数不同服务号在文章的推送篇数上是有所限制的&#xff08;每月推4次&#xff09;订阅号则每天可推送一篇文章。二、定义不同服务号主要是为关注用户提供服务使用的&#xff1b;订阅…

千兆光模块和万兆光模块的发展趋势

千兆光模块和万兆光模块是一种高速光电子器件&#xff0c;以其高速传输、长距离传输和高可靠性而广受关注。光模块是光学通讯系统中极为重要的组成部分之一。不同类型的光模块由于其不同的特性&#xff0c;可以适用于不同的应用场景。下面我们将着重介绍千兆光模块和万兆光模块…

数据结构与算法之美学习笔记:25 | 红黑树(上):为什么工程中都用红黑树这种二叉树?

目录 前言什么是“平衡二叉查找树”&#xff1f;如何定义一棵“红黑树”&#xff1f;为什么说红黑树是“近似平衡”的&#xff1f;解答开篇 前言 本节课程思维导图&#xff1a; 二叉查找树是最常用的一种二叉树&#xff0c;它支持快速插入、删除、查找操作&#xff0c;各个操作…

了解冶金行业MES系统的重要性与优势

冶金行业生产工艺极为复杂&#xff0c;冶金行业生产的产品种类多而繁复&#xff0c;并且每种企业生产的产品差异性极大&#xff0c;加上该行业生产需要各种大型生产设备&#xff0c;导致其工艺流程繁琐复杂&#xff0c;也因此在其生产过程中存在许多不安全的因素&#xff0c;若…

uniapp打包的ipa上架到appstore的傻瓜式教程

​ 转载&#xff1a;uniapp打包的ipa上架到appstore的傻瓜式教程 uniapp打包 在HBuilder X编辑器中打开需要打包的项目&#xff0c;然后点击上面菜单栏中 发行 > 原生App-云打包&#xff0c;对以下弹出的弹窗进行内容填写 ​ 填写完成以后&#xff0c;点击打包操作 ​ ​ …

rk3588配置uac功能,android13使能uac及adb的复合设备

最近&#xff0c;因新增需求需要在现有产品上增加UAC的功能&#xff0c;查阅并学习相关知识后&#xff0c;在rk3588 SOC硬件平台搭载android13系统平台上成功配置了uac及uac&adb的复合设备。基于开源共享精神希望给大家提供些参考。 1.技术可行性预研 &#xff08;1&#…

什么是 TLS/SSL 握手

TLS/SSL 握手是一个加密过程&#xff0c;每当客户端&#xff08;如浏览器&#xff09;与服务器建立连接时&#xff0c;都会在后台进行&#xff0c;此握手协议有助于客户端和服务器之间的安全连接&#xff0c;从而促进隐私、数据完整性和机密性。 TLS/SSL 握手何时发生 每当客…

Android笔记(十四):JetPack Compose中附带效应(一)

在Android应用中可以通过定义可组合函数来搭建应用界面。应用界面的更新往往是与可组合函数内部定义的状态值相关联的。当界面的状态值发生变更&#xff0c;会导致应用界面进行更新。在Android笔记&#xff08;九&#xff09;&#xff1a;Compose组件的状态&#xff0c;对Compo…

数据库实验五 数据库设计

数据库实验五 数据库设计 一、实验目的二、实验内容三、实验内容四、验证性实验五、设计性实验 一、实验目的 1.了解E-R图构成要素以及各要素图元。 2.掌握概念模型E-R图的绘制方法。 3.掌握概念模型向逻辑模型的转换原则和步骤。 4.运用sql编程实现 二、实验内容 1.选取一个…

TCP 重传、滑动窗口、流量控制、拥塞控制的剖析

TCP 是一个可靠传输的协议&#xff0c;那它是如何保证可靠的呢&#xff1f; 为了实现可靠性传输&#xff0c;需要考虑很多事情&#xff0c;例如数据的破坏、丢包、重复以及分片顺序混乱等问题。如不能解决这些问题&#xff0c;也就无从谈起可靠传输。 那么&#xff0c;TCP 是…

使用骨传导耳机会伤耳朵吗?一文读懂骨传导耳机有哪些优点

首先说明&#xff0c;如果是正确的使用骨传导耳机是不会伤耳朵。 一、骨传导耳机的传声原理是什么&#xff1f; 声音的传播需要介质&#xff0c;传统的耳机是通过空气来进行传播&#xff0c;也被称为“空气传导耳机”&#xff0c;而骨传导耳机最大的特别之处就在于&#xff0…

linux安装zsh、oh-my-zsh及常用插件

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/xjintong。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 一、安装zsh 这个不用多说了&#xff0…

[HOW TO]-VirtualBox的虚拟机通过宿主机上网

快速链接: . &#x1f449;&#x1f449;&#x1f449; [专栏目录]-环境搭建安装问题笔记目录 &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】:&#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&a…

uni-app,nvue中text标签文本超出宽度不换行问题解决

复现&#xff1a;思路&#xff1a; 将text标签换为rich-text&#xff0c;并给rich-text增加换行的样式class类名解决&#xff1a;

nf_conntrack内核模块常见问题

nf_conntrack内核模块常见问题 问题描述排查步骤前置条件&#xff1a;启用nf_conntrack内核模块检查nf_conntrack配置 解决办法1:半数减少nf_conntrack buckets的值解决办法2:加倍调大m.min_free_kbytes值解决办法3:Linux社区权威答复-忽略告警 问题描述 内核报错 falling bac…

【C++初阶】四、类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载函数)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】三、类和对象 &#xff08;面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针&#xff09; -CSDN博客 引入&#xff1a;类的六个默认成员函数…

Web(6)Metasploit缓冲区溢出漏洞

利用ms17_010漏洞建立会话&#xff1a; 原理&#xff1a; 因为window低级版本中存在漏洞&#xff0c;端口445.SMB是一个协议名&#xff0c;全称是Server Message Block&#xff08;服务器消息快协议&#xff09;&#xff0c;用于计算机之间共享文件&#xff0c;打印机&#x…