C语言《数据结构》——图的概念和创建,遍历

2023-11-07

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着计算机网络的发展,编程成了一种很常见且重要的职业,学好编程就要学好数据结构,下面将介绍数据结构中的图结构。

提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是“图”

图(Graph)结构是一种非线性的数据结构,图在实际生活中有很多例子,比如交通运输网,地铁网络,社交网络,计算机中的状态执行(自动机)等等都可以抽象成图结构。图结构比树结构复杂的非线性结构。

二、图的基础知识和表示

1.图的基础

在这里插入图片描述

2.图的分类

有向图和无向图
在这里插入图片描述
带权图和不带权图
在这里插入图片描述
邻接矩阵
在这里插入图片描述
带权值的图,不连通的边用无穷表示,连通的边用边的权值表示。

代码如下(示例):

//数据结构之图;
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int Graph[5][5] = { 0 };//先初始化为零。
	Graph[0][2] = 1;
	Graph[0][4] = 1;
	Graph[1][0] = 1;
	Graph[1][2] = 1;
	Graph[2][3] = 1;
	Graph[3][4] = 1;
	Graph[4][3] = 1;
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%5d", Graph[i][j]);
		}
		putchar('\n');
	}
}

在这里插入图片描述

2.图的另一种表示——邻接表

邻接表是一种顺序表和链表的组成结构,顺序表的每一个结点都是一个链式表的头结点。这种表可以运用到散列表中,线性探测法。前面的散列表已经介绍。
在这里插入图片描述

代码如下(示例):

//图——邻接表
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<Windows.h>
#include<string.h>
#define true 2
#define false -2
#define ok 1
#define erro -1
typedef int elemstyle;
//构建链表结构体;
typedef struct node 
{
	elemstyle key;
	struct node* next;
}GraphNode;
typedef struct graph
{
	GraphNode* pn;
	int n;//代表顺序表的长度;
}GraphList;
//创建结点;
GraphNode* creatGraphNode(elemstyle val)
{
	GraphNode* newnode = (GraphNode*)malloc(sizeof(GraphNode));
	newnode->key = val;
	newnode->next = NULL;
	return newnode;
}
//邻接表的初始化;
GraphList* Init_Graph(int n)
{
	GraphNode* pn = (GraphNode*)malloc(sizeof(GraphNode)*n);
	for (int i = 0; i < n; i++)
	{
		pn[i].key = i;
		pn[i].next = NULL;
	}
	GraphList* pt = (GraphList*)malloc(sizeof(GraphList));
	pt->n = n;
	pt->pn = pn;
	return pt;
}
//邻接表创建成功后,就可以对有联系的结点进行连接;
int insert_GraphNode(GraphList*pt,int pos,int pval)//pos代表连接的数据,pval代表连接数据的值.
{
	assert(pt != NULL);
	GraphNode* Node = creatGraphNode(pval);
		GraphNode* pmove = &(pt->pn[pos]);
		GraphNode* curr=pt->pn[pos].next;
		while (curr)
		{
			pmove = curr;
			curr = curr->next;
		}
		pmove->next = Node;
	return ok;
}
//遍历邻接表;
int printGraph(GraphList* pt)
{
	assert(pt != NULL);
	for (int i = 0; i < pt->n; i++)
	{
		printf("%3d:", pt->pn[i].key);
		GraphNode* curr = pt->pn[i].next;
		while (curr)
		{
			printf("->%3d", curr->key);
			curr = curr->next;
		}
		putchar('\n');
	}
	return true;
}
//调试函数;
int main(void)
{
	GraphList* pt;
	int n;
	scanf("%d", &n);
	pt=Init_Graph(n);
	insert_GraphNode(pt, 0, 2);
	insert_GraphNode(pt, 0, 3);
	insert_GraphNode(pt, 1, 0);
	insert_GraphNode(pt, 1, 2);
	insert_GraphNode(pt, 2, 3);
	insert_GraphNode(pt, 3, 4);
	printGraph(pt);
}


该处使用的url网络请求的数据。
在这里插入图片描述
这里只是简单的一个邻接表的实现;可以参考一下。

总结

图作为一种数据结构,他与树的不同在于它不再是一种简单的线性结构,他是一种复杂的非线性结构,具有更大的使用价值,如和广义表,散列表结合起来使用更好,可以解决很多问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言《数据结构》——图的概念和创建,遍历 的相关文章

  • 数组根据对象id去重的几种方法

    arr id 1 name 张一 age 20 id 1 name 张一 age 20 id 2 name 张二 age 20 id 3 name 张三 age 20 方法一 通过forEach再通过some方法判断数组是否包含当前对象id

随机推荐

  • 【Linux】解决Linux挂载的磁盘突然没有权限修改的问题

    可能由于异常关机导致磁盘挂在错误 我这的解决办法是 gt sudo ntfsfix dev sda3 Mounting volume The disk contains an unclean file system 0 0 Metadata
  • 网站服务器发生故障,全国DNS服务器发生故障

    关键词 DNS故障 网页打不开 上不去网 DNS 网站故障 从今天下午三点左右开始中心接受用户反映故障数十起 用户均反映网页打开有问题 中心客服人员调查后发现全国出现了大范围的DNS故障 导致大量网站域名解析不正常 此次DNS故障可能是国外
  • windows

    简介 RabbitMQ是一套开源 MPL 的消息队列服务软件 是由 LShift 提供的一个 Advanced Message Queuing Protocol AMQP 的开源实现 由以高性能 健壮以及可伸缩性出名的 Erlang 写成
  • rsa生成公钥秘钥中产生的问题

    解决 module object has no attribute newkeys 1 需要导入模块rsa 自己在学习的过程中遇到了以下的错误 显示没有这个属性 解决办法 1 检查是否有rsa模块 如果没有就下载该模块 进入cmd后输入py
  • APK反编译破解方法与加密措施

    所谓APK指的是Android操作系统的应用程序安装文件 所谓Crack 简单地理解为 破解 我具体指的是反编译APK文件进行汇编级的代码分析 并修改或插入自己的代码 重新签名打包为APK文件 以达到改变程序原有行为的目的 由以上的说明可知
  • MySQL-HAVING语句

    语法 SELECT column1 column2 column n aggregate function expression FROM tables WHERE predicates GROUP BY column1 column2 c
  • Loaded runtime CuDNN library: 7102 (compatibility version 7100) but source was compiled with 7004

    我被这个cuDNN可谓坑的很惨 最开始下载了7 1 1 for CUDA9 0 跑程序的时候出现了Loaded runtime CuDNN library 7101 compatibility version 7100 but source
  • 保存textarea编辑格式到数据库,并在div中正确显示出来

    一 保存textarea编辑格式到数据库 在textarea中输入回车符 在js读取textarea中的值有 r n然后到业务层转换到string中就有可能变成空格形式然后被存入数据库 当在取出此值的时候则会变成空格的形式 因此我们需要将不
  • javaWeb监听器

    JavaWeb监听器 三大组件 Servlet Listener Filter 监听器 接口 内容由我们来实现 它需要注册 例如注册在按钮上 监听器中的方法 会在特殊事件发生时调用 观察者 事件源 事件 监听器 javaweb中的监听器 事
  • 如何画时序图

    10年产品经理教你3步画好UML时序图 轻松掌握流程分析利器 建议收藏 知乎 转自知乎 上次介绍了活动图 这次分享 UML 中 另一种流程分析利器 时序图 以前每次要分析流程 我都会用活动图 直到有一次 我面对一个业务流程 画活动图 画来画
  • 用UDP实现client程序发送字符串到server程序,server程序将字符串打印出来。

    server c include
  • Java中Scanner.useDelimiter( )方法使用

    在Java语言中 格式化输入是通过类java util Scanner来完成的 默认情况下 Scanner是使用 空白 作为分隔符将输入分解为标记 然后使用它所提供的不同的next方法将得到的标记转换为不同的类型的值 Scanner sca
  • matlab 图像压缩 奇异值分解 SVD 代码仿真实现

    首先 在对图像进行奇异值分解之前 我们应当明白SVD的原理 在矩阵原理这门课里 我们曾经学过奇异值分解 其中讲到 奇异值分解可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示 这些小矩阵描述的是矩阵的重要的特性 在这里 我推荐对奇
  • 开源订单管理系统

    系统概述 随着企业信息化管理的不断深化 数字化技术对企业发展影响加深 为优化企业服务 最大程度提升客户体验及企业管理 开源字节与客户进行深入沟通需求 定制研发了开源订单管理系统 客户订单管理是现代企业商务业务的重要组成部分 可以帮助企业解决
  • HashMap源码-Put详解(HashMap是如何添加元素的)

    HashMap是Java中很重要一个部分 内容较多 因此笔者在此将其拆成一个个小块 作为自己学习知识整理的同时 也和广大网友一起讨论 也因此 在完成系列的学习之前 将以这种小节的形式进行学习分享 并在学习结束后进行整合 排序 一 HashM
  • Vagrant快速入门教程

    之前学习Docker的时候 发现了Vagrant 感觉这也是一个挺方便的技术 但是我下载安装完Vagrant的时候 发现恰好VirtualBox发了新版本 Vagrant还没兼容 所以这篇文章一直拖到了现在 昨天正好Vagrant更新了版本
  • function函数

    一 第一个function函数 1 在代码中书写的function函数默认情况下是不执行的 2 function函数只有在调用的时候才能被执行 函数是使用函数名来进行调用的 并且函数名的后面必须带有一对括号 3 可以多次调用函数 可以使用循
  • top命令详解

    一 参数 参数 意义 使用示例 hv 显示版本和帮助 top h top v top hv d 每隔多长时间刷新一次 单位是秒 默认5s top d 3 n 最多刷新几次退出 top n 5 u U 展示指定用户的信息 top u root
  • Windows10下实现输出到屏幕并且保存在文件中

    日期 2018 06 23 问题描述 有时 我们需要将执行后的输出不仅要显示在屏幕上 还想要将其保存一份文件 以便日后查看 这里 主要利用Windows10下PowerShell实现该功能 Windows PowerShell可以认为是命令
  • C语言《数据结构》——图的概念和创建,遍历

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 例如 随着计算机网络的发展 编程成了一种很常见且重要的职业 学好编程就要学好数据结构 下面将介绍数据结构中的图结构 一 什么是 图 二 图的基础知识和表示 1