二十一.数据结构学习笔记.1

2023-11-02

一.抽象数据类型
抽象数据类型(Abstract Data Type,ADT)是一些操作的集合。抽象数据类型是数学的抽象,在ADT定义中根本没涉及如何实现这些操作。
例如:表、集合、图及它们的操作,它们都可以看作抽象数据类型,就像整数、实数和布尔量是数据类型一样。整数、实数以及布尔量有与它们相关的操作。对于集合ADT,我们可以有并、交、求大小(size)以及取余等操作。或者,我们也可以只要两种操作——并和查找(find),这两种操作在该集合上定义了一种不同的ADT。

二.表

  1. 处理形如A1,A2,A3……AN的普通表。这个表的大小是N。我们称大小为0的表为空表(empty list)。
  2. 以 i 定义表中元素的位置,表中第一个元素是A1,最后一个元素是AN,将不定义A1的前驱元和AN的后继元。
  3. 与这些定义相关的是我们要在表ADT上进行操作的集合。printList和MakEmpty是常用操作。Find返回关键字首先出现的位置;Insert和Delete一般是从表的某个位置插入和删除某个关键字;而FindKth则返回某个位置上(作为参数指定)的元素。如果34,12,52,16,12是一个表,则Find(52)会返回3;Insert(X,3)可能把表变成34,12,52,X,16(如果在给定位置的后面插入的话);而Delete(52)则将该表变为34,12,X,16,12。
  4. 表的简单数组实现: 数组实现需要对表达到大小最大值进行估计,这会浪费大量空间。插入一个新的元素需要将后面整个数组后移一个位置一空出空间来,而删除一个元素则需要将表中的后面整个元素前移一个位置。这两种操作最坏的情况为O(N),所以也浪费运行时间。
  5. 链表: 可以不连续存储元素。链表由一系列不必在内存中相连的结构组成。每一个结构均含有表元素和指向包含该元素后继元的结构的指针。称之为Next指针。最后一个单元的Next指向NULL; 为了执行printList(L)或Find(L,Key),只要将一个指针传递到该表的第一个元素,然后用一些Next指针遍历该表。
  6. 一些细节问题:第一,并不存在从所给定义出发在表的起点端插入元素的真正显性的方法。第二,从表的起始端实行删除是一个特殊情况,因为他改变了表的起始端,编程中的疏忽将会造成表的丢失。第三个问题涉及一般的删除。虽然指针的移动很简单,但是删除算法要求记住删除元素前面的表元。上面三个问题通过留出一个标志节点即表头(header)来解决。

三.线性表的定义与操作-顺序表

typedef int Position;
typedef struct LNode *List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last;
};
 
/* 初始化 */
List MakeEmpty()
{
    List L;
 
    L = (List)malloc(sizeof(struct LNode));
    L->Last = -1;
 
    return L;
}
 
/* 查找 */
#define ERROR -1
 
Position Find( List L, ElementType X )
{
    Position i = 0;
 
    while( i <= L->Last && L->Data[i]!= X )
        i++;
    if ( i > L->Last )  return ERROR; /* 如果没找到,返回错误信息 */
    else  return i;  /* 找到后返回的是存储位置 */
}
 
/* 插入 */
bool Insert( List L, ElementType X, Position P ) 
{ /* 在L的指定位置P前插入一个新元素X */
    Position i;
 
    if ( L->Last == MAXSIZE-1) {
        /* 表空间已满,不能插入 */
        printf("表满"); 
        return false; 
    }  
    if ( P<0 || P>L->Last+1 ) { /* 检查插入位置的合法性 */
        printf("位置不合法");
        return false; 
    } 
    for( i=L->Last; i>=P; i-- )
        L->Data[i+1] = L->Data[i]; /* 将位置P及以后的元素顺序向后移动 */
    L->Data[P] = X;  /* 新元素插入 */
    L->Last++;       /* Last仍指向最后元素 */
    return true; 
} 
 
/* 删除 */
bool Delete( List L, Position P )
{ /* 从L中删除指定位置P的元素 */
    Position i;
 
    if( P<0 || P>L->Last ) { /* 检查空表及删除位置的合法性 */
        printf("位置%d不存在元素", P ); 
        return false; 
    }
    for( i=P+1; i<=L->Last; i++ )
        L->Data[i-1] = L->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */
    L->Last--; /* Last仍指向最后元素 */
    return true;   
}

四.线性表的定义与操作-链表

typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
 
/* 查找 */
#define ERROR NULL
 
Position Find( List L, ElementType X )
{
    Position p = L; /* p指向L的第1个结点 */
 
    while ( p && p->Data!=X )
        p = p->Next;
 
    /* 下列语句可以用 return p; 替换 */
    if ( p )
        return p;
    else
        return ERROR;
}
 
/* 带头结点的插入 */
bool Insert( List L, ElementType X, Position P )
{ /* 这里默认L有头结点 */
    Position tmp, pre;
 
    /* 查找P的前一个结点 */        
    for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;            
    if ( pre==NULL ) { /* P所指的结点不在L中 */
        printf("插入位置参数错误\n");
        return false;
    }
    else { /* 找到了P的前一个结点pre */
        /* 在P前插入新结点 */
        tmp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */
        tmp->Data = X; 
        tmp->Next = P;
        pre->Next = tmp;
        return true;
    }
}
 
/* 带头结点的删除 */
bool Delete( List L, Position P )
{ /* 这里默认L有头结点 */
    Position tmp, pre;
 
    /* 查找P的前一个结点 */        
    for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;            
    if ( pre==NULL || P==NULL) { /* P所指的结点不在L中 */
        printf("删除位置参数错误\n");
        return false;
    }
    else { /* 找到了P的前一个结点pre */
        /* 将P位置的结点删除 */
        pre->Next = P->Next;
        free(P);
        return true;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二十一.数据结构学习笔记.1 的相关文章

  • linux查看IP地址

    在命令窗口输入 ip addr 会出现以下页面 会发现没有IP地址 是因为配置没有把IP打开 输入 vi etc sysconfig network scripts ifcfg e按两下tab会有一个ifcfg e开头的文件 编辑 把no改
  • FFmpeg-4.3.2 嵌入式Linux交叉编译

    FFmpeg 4 3 2 嵌入式Linux交叉编译 FFmpeg 4 3 2 嵌入式Linux交叉编译 1 环境说明 2 安装FFmpeg依赖库 2 1 创建文件夹 2 2 编译fdk aac 2 3 编译x264 3 交叉编译FFmpeg
  • 移动端unet人像分割模型--3

    前两篇文章已经完成基本从mxnet到ncnn的unet模型训练和转换 不过还存在几个问题 1 模型比较大 2 单帧处理需要15秒左右的时间 MAC PRO ncnn没有使用openmp的情况 3 得到的mask结果不是特别理想 针对这三个问
  • 应用环境下的TIME_WAIT和CLOSE_WAIT处理

    昨天解决了一个HttpClient调用错误导致的服务器异常 具体过程如下 http blog csdn net shootyou article details 6615051 里头的分析过程有提到 通过查看服务器网络状态检测到服务器有大量
  • 二叉树两个节点的最近公共祖先问题

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 五种方案实现CSS三栏布局

    方案一 浮动布局float
  • break在c语言中的应用,c语言中break的用法

    C语言中break语句有以下两种用法 1 当break语句出现在一个循环内时 循环会立即终止 且程序流将继续执行紧接着循环的下一条语句 2 它可用于终止switch语句中的一个case 如果使用的是嵌套循环 即一个循环内嵌套另一个循环 br
  • INNO Setup 使用笔记

    Setup AppName MyAppName AppVerName MyAppVerName AppPublisher MyAppPublisher AppPublisherURL MyAppURL AppSupportURL MyApp
  • chatgpt错误:Sorry, you have been blocked

    ChatGPT报错 Sorry You Have Been Blocked 解决办法 换个节点 就可以
  • 为了安全,把所有人平均分成两队,每一队分别从1开始编号,编号相同的同学组成互助组。在某个景点,领队发现有个同学掉队了,你能找出来是几号同学吗?

    问题 C 去旅游啊 时间限制 1 Sec 内存限制 128 MB 提交 746 解决 573 提交 状态 讨论版 命题人 admin 题目描述 放假了 许多同学准备组团去旅游 石大的同学组了一个旅游团 刚好偶数个人 为了安全 把所有人平均分
  • VS Code断点调式Cesium

    1 在VS Code中安装Debugger for Firefox插件 2 下载安Firefox Developer Edition 3 创建launch json 编辑并保存launch json Use IntelliSense to
  • Java学习笔记 01

    相关文章 Java学习笔记 02 快速之旅 Java环境配置及HelloWorld程序 Java学习笔记 03 基础语法总结 目录 一 解释型语言和编译型语言 编译型语言 解释型语言 Java是解释型语言 or 编译型语言 二 Java语言
  • 【Transformer架构】Transformers are RNNs (linear transformer)

    原始题目 Transformers are RNNs Fast Autoregressive Transformers with Linear Attention 中文翻译 Transformers 是RNNs 带线性Attention的快
  • C++ error: non-const lvalue reference to type

    今晚看交流群的消息 看到大家在讨论一个有意思的问题 int array 5 0 int const p array 编译通过 const int p array 编译失败 报错 error non const lvalue referenc
  • SpringBoot整合quartz(支持多个任务和job支持spring管理的对象)

    工作中经常遇到quartz的job注入的spring对象为null 原因是这样的 quartz每次执行一次job会将执行完成后的job销毁 下次执行的时候 重新new 这就导致job中的 Autowired注入的Spring对象为null
  • 前端如何获取文件后缀名

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前端如何获取文件后缀名 二 使用代码如下 1 引入库 总结 前端如何获取文件后缀名 二 使用代码如下 1 引入库 代码如下 示例 选择文件后返回 resultDat
  • 实现求欧拉回路算法(C++)

    一 算法介绍及实现过程 程序的输入为对应图的结点数和图中与各结点相连的点的编号 注 无向图中的多重边和自环需多次输入 有向图中的多重边需多次输入 程序的第一步是求出图的邻接矩阵 邻接矩阵反映了点与点之间的关系 通过输入各结点相连的点的编号
  • go的make用法

    make用法和参数用法 golang分配内存有一个make函数 该函数第一个数类型 第二个参数的分配的空间 第三个 参数时预留分配空间 前两个参数很好理解 但对第三个参数不是很理解 例如a make int 5 10 len a 输出结果为
  • Golang-语言源码级调试器 Delve

    前言 Go 目前的调试器有如下几种 GDB 最早期的调试工具 现在用的很少 LLDB macOS 系统推荐的标准调试工具 单 Go 的一些专有特性支持的比较少 Delve 专门为 Go 语言打造的调试工具 使用最为广泛 本篇简单说明如何使用
  • OC使用cocoapods导入swift库注意

    首先就是在 targets gt Build Setting gt Packaging 中设置 Defines Module为YES 然后创建swift文件时会生成 文件名 Bridging Header h 这样一个桥接文件 怎样使用co

随机推荐

  • 针对低分辨率或小目标的卷积-SPDConv

    针对低分辨率或小目标的卷积 SPDConv 摘要 引言 A New Building Block SPD Conv 附录 代码 摘要 卷积神经网络在许多计算机视觉任务中取得了巨大成功 然而 在图像低分辨率或目标较小任务上 他们的性能迅速下降
  • 数据分析统计题目

    提示 本文章数据和题目来源于互联网 如有雷同 请联系作者删除 文章目录 前言 二 题集 第一题 第二题 第三题 第四题 前言 公司内部招募数据分析团队 特出此题集 检测各位参与同学的学习态度和能力 二 题集 第一题 某地101例健康男子血清
  • 已解决 I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with on

    已解决WARNING tensorflow From
  • 规则引擎Drools使用 第一篇 规则引擎认知

    规则引擎有什么用呢 可以在那些实际场景使用呢 思考这样一个问题 申请信用卡 每个人去申请信用卡的时候 都会经过一遍核查 这个核查过程其实就可以当做是根据规则 去校验你的信息是否符合规则 只有符合规则的才可以申请信用卡 还记得以前自己写的那些
  • Elasticsearch的算法介绍

    1 算法介绍 relevance score算法 简单来说 就是计算出 一个索引中的文本 与搜索文本 他们之间的关联匹配程度 Elasticsearch使用的是 term frequency inverse document frequen
  • 深入了解JVM的底层原理

    引言 什么是JVM JVM在整个jdk java 运行环境 中处于最底层 负责与操作系统的交互 用来屏蔽操作系统环境 提供一个完整的Java运行环境 因此也就虚拟计算机 操作系统装入JVM是通过jdk中Java exe来完成 通过下面4步来
  • 蒙特卡洛模拟计算风险价值VAR之R语言实现

    一 解析VAR 当在分析方法中计算风险价值 VAR 时 我们需要假设金融工具的返回遵循一定的概率分布 最常用的是正态分布 这也是为什么我们通常称它为delta normal方法 要计算VAR 我们需要找到一个阈值 T 来确定显著性 如95
  • ApiSix 配置 jwt-auth认证

    有问题要学会阅读apisix官方文档 养成好习惯 点我开始学习 1 为签发 token 的 API 配置一个 Route 该路由将使用 public api 插件 在对应的服务器执行以下命令 我尝试通过面板来创建这个Route 发现创建的时
  • Fedora21 入门体验笔记

    以前都是由于对linux的好奇 所以把各种版本都装了个遍 但每次都会因为某些原因 eq 不能玩游戏 用 很麻烦而且不爽 没用几天然后又回到windows 而且最后什么都没有留下 这一次是想真正学习linux 顺便记下使用过程中遇到的一些问题
  • OpenGL 入门教程(八)

    OpenGL 入门教程 八 OpenGL中使用RGBA色彩体系 RGB为红绿蓝三原色 A为 值 该值代表色彩融合时所占的比例 颜色是顶点的重要属性之一 没有色彩的世界是毫无生气的 使用glColor R G B A 设定当前颜色 此后定义所
  • pyecharts各种图表实现(超级全)

    目录 平面直角坐标系 直方图 折线图 箱形图 散点图 带涟漪效果散点图 k线图 热力图 象型图 层叠图 地理图表 GEO 地理坐标系 MAP 地图 BMAP 百度地图 基本图表 饼图 漏斗图 仪表盘 水球图 日历图 关系图 平行坐标系 极坐
  • Springboot整合FastDFS

    文章目录 一 FastDFS Client的实践 1 FastDFS Client的主要特性 2 SpringBoot测试操作FastDFS 1 SpringBoot的配置 2 测试springboot环境下javaapi对分布式文件系统上
  • 商汤PySot的配置使用(1)---siam跟踪算法demo、test、eval

    文章目录 简介 一 环境配置 二 demo 2 1 步骤一 加入工程的python路径 2 2 步骤二 下载模型 2 3 步骤三 编辑demo 三 test 3 1 步骤一 数据集 json文件准备 3 2 步骤二 OTB100等数据集的注
  • 【区块链介绍】区块链的来龙去脉

    1 了解区块链技术的起源 分布式系统 弱中心化是区块链思想的核心 P2P网络 为区块链提供了网络层基础架构 任何一个节点都能与其他节点进行传输 与其它节点保持一致 共识算法 区块链技术的核心 实现了数据的一致存储 密码学 为区块链数据的传输
  • 高数——彻底搞懂如何判断反常积分收敛和发散

    反常积分收敛和发散 预备知识 复杂的反常积分 真题 预备知识 1 极限 不定积分与定积分的基本计算 2 找等价无穷小 3 无穷小和无穷大速度的比较 趋向无穷大的速度 x x x x xx gt e
  • Celery介绍以及使用

    文章目录 celery 一 什么是celery 1 celery是什么 2 使用场景 3 Celery的优点 4 Celery的安装 二 Celery执行异步任务 1 创建异步任务执行文件 消费者 2 创建生产者文件 3 创建result文
  • InnoDB引擎架构

    逻辑存储结构 表空间 ibd文件 一个mysql实例可以对应多个表空间 用于存储记录 索引等数据 段 分为数据段 索引段 回滚段 InnoDB是索引组织表 数据段就是B 树的叶子节点 索引段即为B 树的非叶子节点 段用来管理多个Extent
  • Vue中vuex的使用(三)

    vuex中getters的使用 1 概念 当state中的数据需要经过加工后再使用时 可以使用getters加工 2 在store js中追加getters配置 准备getter 用于将state中sum加工 const getters b
  • vue如何获取当前页面的url

    如果你使用 vue router 文档在这里 路由信息对象的属性 const routes path portfolio year review component Portfolio 这个样子获取 this route params ye
  • 二十一.数据结构学习笔记.1

    一 抽象数据类型 抽象数据类型 Abstract Data Type ADT 是一些操作的集合 抽象数据类型是数学的抽象 在ADT定义中根本没涉及如何实现这些操作 例如 表 集合 图及它们的操作 它们都可以看作抽象数据类型 就像整数 实数和