【C语言版】数据结构教程(一)绪论(上)

news2024/9/22 17:21:22

【内容简介】本文整理数据结构(C语言版)相关内容的复习笔记,供各位朋友借鉴学习。本章内容更偏于记忆和理解,请读者们耐心阅读。

数据结构教程 · 绪论(上)

        本节学习目标

        1.1 基本概念

        1.2 抽象数据类型的表示与实现

本节学习目标

  • 熟悉数据结构相关的一些概念和术语
  • 了解如何书写抽象数据类型的形式定义

1.1 基本概念

下面我们简要介绍一下数据结构相关的一些概念和术语,这在之后的学习过程中都经常会用到。

1、数据(data)是所有能输入到计算机中并被计算机程序处理的符号的总称。例如:声音、图像、字符串等等。

2、数据元素(data system)是数据的基本单位。例如:下面这张“图”中由许多圆圈组成,这些圆圈就可以认为是数据元素。     

3、数据项(data item)是组成数据元素的单位,也是数据的不可分割的最小单位。例如:书籍的目录对于这本书而言是一个数据元素,目录中每一章的信息(章名、页码等)就是一个数据项。

4、数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合 N = {0,1,-1,2,-2,···}。

以上是数据的一些详细概念。而我们着重要学习的数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。数据元素之间的关系称为结构(structure)。一般而言,数据元素之间存在以下 4 种基本结构:

  1. 集合:结构中的数据元素之间除了“同属于一个集合”之外,没有其它关系。
  2. 线性结构:结构中的数据元素之间存在一个对一个的关系。
  3. 树形结构:结构中的数据元素之间存在一个对多个的关系。
  4. 图状结构或网状结构:结构中的数据元素之间存在多个对多个的关系。

数据的定义方式并不唯一,除上述之外,还有一种形式定义:数据结构是一个二元组,

Data_Structure = { D,S }

其中:D 是数据元素的有限集,S是D上存在的关系的有限集。这样的说法比较抽象,我们举个例子:

【例1】现在我们需要编写一个公司职工管理系统,那么我们首先需要构思这个系统中的数据结构。假设这个公司有 1 个董事长,1 个总经理和 3 个员工,那么这个公司的职工之间存在的关系是:董事长管理总经理,总经理管理员工。则可以定义如下的数据结构:

Group = ( P,R )

其中:P 包含这个公司的所有职员,

           R = { R1,R2 },

           R1 = { <董事长,总经理> },

           R2 = { <总经理,员工1>,<总经理,员工2>,<总经理,员工3> }。

上述定义仅仅只是一种从对象的角度抽象出来的数学模型。结构定义中的“关系”描述为数据元素之间的逻辑关系,因此又称为数据的逻辑结构

但是,为了在计算机中实现对其的操作,还需要研究在计算机中如何来表示一个数据结构。数据结构在计算机中的表示称为数据的物理结构,又称为存储结构。它包括数据元素的表示以及关系的表示。在计算机中,表示信息的最小单位是二进制数的一位,叫做位(bit)。由若干个位组成的位串表示一个数据元素,通常称为元素结点,例如:用 8 位二进制数表示一个字符。

数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像非顺序映像,并由此得到两种不同的存储结构:顺序存储结构链式存储结构

顺序映像的特点是,借助元素在存储器中的相对位置来表示逻辑关系,例如:假设用 2 个字长的位串表示一个实数,则相邻 4 个字长的位串可以表示一个复数。而对于非顺序映像而言,通常通过指针来指示元素存储地址,从而将数据元素之间的逻辑关系表示出来。如下图所示:

而存储结构可以分别用“一维数组”来描述顺序存储结构,用“指针”描述链式存储结构。

数据类型(data type)是和数据结构密切相关的一个概念。它包括了一个值的集合和定义在这个值集上的一组操作的总称。例如:C语言中的整型变量,其值集为某个区间上的整数,定义在上面的操作为加、减、乘、除和取模等算术运算。根据“值”的不同,数据类型可分为两类:一类是不可分解的原子类型,例如:实数;一类是由若干成分按某种结构组成,可以分解的结构类型,例如:数组。

1.2 抽象数据类型的表示与实现

抽象数据类型(abstract data type,简称 ADT)是指一个数学模型以及定义在该模型上的一组操作。也就是说,只要这个数据类型的逻辑特性不发生变化,就不影响它在外部的使用,类似我们常说的“面向对象的设计”原则。

一个含抽象数据类型的软件模块通常应包含定义、表示和实现 3 个部分。由于抽象数据类型的定义由一个值域和定义在该值域上的一组操作组成。按照其值的不同特性,可以分为:原子类型固定聚合类型可变聚合类型。后两者分别代表组成值的成分数量一定或是可变。

与数据结构的形式定义类似,抽象数据类型可用以下三元组表示:( D,S,P )。其中,D 是数据对象,S 是 D 上的关系集,P 是对 D 的基本操作集。具体来书写可以如下:

ADT 抽象数据类型名 {
    数据对象:<数据对象的定义>
    数据关系:<数据关系的定义>
    基本操作:<基本操作的定义>
} ADT 抽象数据类型名

其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为:

基本操作名(参数表)
    初始条件:<初始条件描述>
    操作结果:<操作结果描述>

基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以 & 打头,除了提供输入值以外,还将返回操作结果。

【例2】一个抽象数据类型三元组的定义:

ADT Triplet {

        数据对象:D = {e1, e2, e3 | e1, e2, e3 属于这个集合}

        数据关系:R1 = {<e1, e2> , <e2, e3>}

        基本操作:

                InitTriplet (&T, v1, v2, v3)

                        操作结果:构造三元组 T,元素 e1, e2, e3 分别被赋以参数 v1, v2,v3的值。

                DestroyTriplet (&T)

                        操作结果:三元组 T 被销毁。

                Get (T, i , &e)

                        初始条件:三元组 T 已存在,i = 1,2,3。

                        操作结果:用 e 返回 T 中第 i 个元素的值。

                ...

} ADT Triplet


继续阅读下一篇(点击跳转):【C语言版】数据结构教程(一)绪论(下)

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

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

相关文章

苹果电脑怎么录制屏幕?3招教你轻松录制,高效实用

随着数字化时代的快速发展&#xff0c;屏幕录制已经成为我们日常工作和生活中不可或缺的一部分。它不仅是展示产品、教授知识、分享经验的重要工具&#xff0c;更是我们展现个性和创造力的新舞台。在苹果电脑上&#xff0c;屏幕录制功能的应用更是将这一体验推向了新的高度。 …

优思学院|不良产品留到客户产线上了,8D报告要如何写?

8D问题解决法是一个经常用作公司内部改善以及应付客户投诉的关键方法&#xff0c;不过&#xff0c;在改善的过程中却有一些误区&#xff0c;如果没有注意&#xff0c;那么这份8D报告将会变得徒劳无功。这里有一个这样的案例&#xff1a; 一个经验丰富的工程师把客户图纸看错了&…

【面向PM考试】挣值分析的计算场景介绍

前言 PM考试目前还是挺火热的&#xff0c;有些人是因为行业所需&#xff0c;有些人是因为自身学习&#xff0c;总而言之&#xff0c;需要经过系统的学习&#xff0c;才能胜任当下的工作。 关于挣值分析&#xff0c;包括一些基础概念&#xff0c;博主有一篇文章已详细介绍&…

基于ip/域名/端口的server配置、nodej项目、部署nfs服务器

回顾复习 jdk环境 tomcat服务器需要jdk环境 版本对应 tomcat>jdk17 tomcat9>jdk1.8 tomvat10>jdk17 1、配置系统变量 JAVA_HOME sed -i $aexport JAVA_HOME/usr/local/jdk22/ /etc/profile sed -i $aexport PATH$JAVA_HOME/bin:$PATH /etc/profile sour…

猫用空气净化器应该如何挑选?国内养猫空气净化器哪个好?

有没有友友跟我一样是鼻炎患者&#xff0c;可偏偏家里两只猫都是掉毛怪&#xff0c;行走的大型蒲公英&#xff0c;多猫家庭确实很快乐&#xff0c;但一到换毛季&#xff0c;家里地上、空气里全是猫毛。每天都需要拼命的吸地板&#xff08;累鼠个人&#xff09;&#xff0c;毛一…

金牌九宫格!经常跑步的人,没有一个是弱者——早读(逆天打工人爬取热门微信文章解读)

我在学习龙头战法&#xff0c;有了解的吗&#xff1f; 引言Python 代码第一篇 洞见 经常跑步的人&#xff0c;没有一个是弱者第二篇 今天尝试结尾 引言 时间是什么&#xff1f; 我越来越觉得是一个限定 因为没有时间 我们很多事情就有点乱套 你说你的 我说我的 十分混乱 没有一…

Matplotlib面积图绘制秘籍:让你的数据‘膨胀’起来,但不吹泡泡哦!

1. 引言 嘿&#xff0c;数据迷们&#xff01;想不想让你的数据‘活’起来&#xff0c;跳一曲色彩斑斓的面积舞&#xff1f;Matplotlib面积图&#xff0c;不只是数字的堆砌&#xff0c;它是故事的讲述者&#xff0c;让复杂数据变得一目了然&#xff0c;还带点小幽默。快来一探究…

第1天:Python基础语法(五)

正文&#xff1a; 在之前的文章中&#xff0c;我们已经学习了Python的基本语法集合和集合的一些常用操作。 在本篇文章中&#xff0c;我们将继续学习其他类型 字符串格式化 使用操作符%s来实现 ➢ 几个%s就几个变量 ➢ 超过一个变量时&#xff0c;需要用元组%&#xff08;…

SpringBoot SseEmitter,服务器单项消息推送

防止推送消息乱码 import org.jetbrains.annotations.NotNull; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.servlet.mvc.method…

阿里云实时计算Flink在多行业的应用和实践

摘要&#xff1a;本文整理自 Flink Forward Asia 2023 中闭门会的分享。主要分享实时计算在各行业的应用实践&#xff0c;对回归实时计算的重点场景进行介绍以及企业如何使用实时计算技术&#xff0c;并且提供一些在技术架构上的参考建议。内容分为以下四个部分&#xff1a; 业…

Magic-PDF:端到端PDF文档解析神器 构建高质量RAG必备!

项目结构 流程解析 预处理的作用是判断文档内容是否需要进行OCR识别&#xff0c;如果是普通可编辑的PDF文档&#xff0c;则使用PyMuPDF库提取元信息。 模型层除了常规的OCR、版面结构分析外&#xff0c;还有公式检测模型&#xff0c;可提取公式内容&#xff0c;用于后续把公式…

Ubuntu系统在两个屏幕上都显示任务栏

Ubuntu系统在两个屏幕上都显示任务栏 目标 希望在两个屏幕&#xff08;主屏和扩展屏&#xff09;上都显示下图的状态栏 解决方法 打开设置&#xff0c;找到>外观>Dock 2. 将显示于改成所有显示

明清进士人数数据

明清进士人数数据 指标&#xff1a;省份名称、城市名称、区县名称、明清各省进士人数、明清各城市进士人数、明清各县区进士人数 指标说明&#xff1a; Province[省份名称]-统计数据所属省份 City[城市名称]-统计数据所属地级市 Region[区县名称]-统计数据所属区县 MQpro…

ZooKeeper日志自动清理实用脚本

ZooKeeper日志自动清理:保持系统整洁的实用脚本 在管理ZooKeeper集群时,定期清理日志文件是一项重要但常被忽视的任务。本文将介绍一个简单而有效的bash脚本,用于自动清理ZooKeeper的日志和快照文件,并讨论如何使用cron来定期执行此脚本。 磁盘告警&#xff0c;所以写了一个脚…

如何用代码在数据库新建一个表格/HTML的跨行合并和跨列合并

1.用navicat新建一表格 数据库使用链接 2.前端代码 &#xff08;1&#xff09;跨行合并&#xff1a;rowspan“合并单元格的个数” 跨列合并&#xff1a;colspan“合并单元格的个数” <body> <table border"1”align"center” width"100%cellpaddin…

微信公众号,配置自定义菜单,跟回调授权网址配置入口,图讲解

微信公众号&#xff0c;配置自定义菜单&#xff0c;跟回调授权网址配置入口&#xff0c;图讲解

【图像识别】十大数据集合集!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 DanishFungi2020 发布方&#xff1a; Google 发布时间&#xff1a; 2021 简介&#xff1a; 补充材料&#xff1a;丹麦真菌 2020 - 不仅仅是另一个图像识别数据集为了支持细粒度植…

django网络爬虫系统- 计算机毕业设计源码81040

摘要 本论文主要论述了如何开发一个网络爬虫系统&#xff0c;对旅游景点信息进行爬取&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述网络爬虫系统的当前背景以及系统开发的目的&#x…

【计算机网络】TCP/IP四层模型

文章目录 TCP/IP模型应用层&#xff08;Application Layer&#xff09;传输层&#xff08;Transport Layer&#xff09;网络层&#xff08;Internet Layer&#xff09;网络接口层&#xff08;Network Interface Layer&#xff09; TCP/IP模型 经典的TCP/IP参考模型从上至下分为…

如何手动修复DLL丢失?directx修复工具收费吗?

在使用电脑时&#xff0c;我们有时会遇到DLL文件丢失或损坏的问题&#xff0c;导致软件无法正常运行。DLL&#xff08;动态链接库&#xff09;文件是Windows操作系统中重要的组成部分&#xff0c;用于共享程序代码和资源。本文将介绍如何手动修复DLL丢失问题&#xff0c;手动修…