数据结构_线性表

 线性表的定义和特点

线性表是具有相同特性的数据元素的一个有限序列

(a_{1},a_{2},a_{3},......a_{i-1},a_{i},a_{i+1},....a_{n})

a{_{1}}:线性起点/起始节点

a_{i-1} :a_{i}直接前驱

a_{i+1} :a_{i}直接后继

a_{n}:线性终点/终端节点

n:元素总个数,表长

下标:是元素的序号,表示元素在表中的位置

n=0时称为空表

线性表

由n(n>0)个数据元素(结点),a_{1},a_{2},...a_{n}组成的有限序列

将非空的线性表(n>0)记作:(a_{1},a_{2},...a_{n})

这里的数据元素a_{i}(1\leq i\leq n)只是一个抽象的符号,其具体含义在不同的情况下,可以不同

例1

分析26个英文字母组成的英文表

        (A,B,C...Z)

数据元素都是字母,元素间关系是线性关系

例2

分析学生情况登记表

每条记录也是线性关系

例3

某单位历年拥有计算机的数量(4,6,45,34,33) 线性关系(先后)

例4 

12星座 (白羊座,金牛座,...双鱼座) 线性关系(先后)

同一线性表的元素必定有相同特性,数据元素之间的关系是线性关系

综上 线性表的逻辑特征是:
在非空的线性表中,有且一个开始节点a_{1},它没有直接前趋,仅有一个后继a_{2}

在非空的线性表中,有且一个终端节点a_{n},它没有直接后继,仅有一个前趋a_{n-1}

其余节点a_{i}(2\leq i\leq n-1) 仅有一个前趋a_{i-1},仅有一个后继a_{i+1}

线性表是一种典型的线性结构

线性表案例

例1

一元多项式的运算:实现两个多项式加,减,乘运算

P_{n}(x) = p_{0} + p_{1}x + p_{2}x^{2} + ... + p_{n}x^{n}

线性表P=(p_{0},p_{1},p_{2},...,p_{n})

每一项的指数i隐含在其系数p_{i}的序号中

用数组来表示

P(x) = 10 + 5x - 4x^{2} + 3x^{3} + 2x^{4}

指数用下标表示,系数用具体值表示

操作

两个多项式相加

R_{n}(x) = P_{n}(x) + Q_{m}(x)

线性表R  = (p_{0} + q_{0},p_{1} + q_{1},p_{2} + q_{2},...p_{n} + q_{m...})

例2:稀疏多项式

S(x) = 1 + 3x^{10000} + 2x^{20000}

如果用前面下标代表指数,会造成空间浪费

多项式非零项的数组表示

A(x) = 7 + 3x + 9x^{8} + 5x^{17}

B(x) = 8x + 22x^{7} - 9x^{8}

线性表  P = ((p1,e1),(p2,e2),(p3,e3),....(pm,em))

线性表A=((7,0),(3,1),(9,8).(5,17))

线性表B=((8,1),(22,7),(-9,8))

创建一个新数组c

分别从头遍历比较a和b的每一项

指数相同,对应系数相加,若其和不为0,则在c中加一个新项

指数不相同,则将指数较少的项复制到c中

一个多项式遍历完毕时,将另一个剩余项依次复制到c即可

缺陷:并不知道数组c的空间要分配多少

顺序存储结构存在问题

存储空间分配不灵活

运算的空间复杂度高(需要额外的空间)

解决问题

链式存储结构 后续详细介绍

例3:图书信息管理系统

需要的功能: 增(插入)删改查排序计数

图书表抽象为线性表

表中每本书抽象成线性表中的数据元素

图书顺序表:数组存储

图书链表:链表存储

选择适当的存储结构

实现此存储结构上的基本操作

利用基本操作完成功能

总结:

线性表中数据元素的类型可以为简单类型,也可以为复杂类型

许多实际应用问题所涉及的基本操作有很大相似性,不应为每个具体应用单独编写一个程序

从具体应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其存储结构和基本操作

线性表的类型定义

抽象数据类型线性表的定义如下:

ADT List{

        数据对象: D = {   a_{i} | a_{i}属于Elemset,(i=1,2,....,n,n\geq 0)  }

        数据关系: R = { <a_{i-1},a_{i}> | a_{i-1},a_{i} 属于D_{i} (i=2,3,....n)}

        基本操作:

                InitList(&L)

        略

} ADT List

基本操作:

初始化线性表

InitList(&L)

操作结构:构造一个空的线性表L

销毁线性表

DestroyList(&L)

初始条件:线性表L已经存在

操作结果:销毁线性表L

清除线性表

ClearList(&L)

初始条件:线性表L已经存在.

操作结果:将线性表L重置为空表

判断线性表是否为空

ListEmpty(L)

初始条件:线性表L已经存在

操作结果:若线性表L为空表,则返回Ture,否则返回False

返回线性表L的元素个数

ListLlenth(L)

初始条件:线性表L已经存在

操作结果:返回线性表L中的数据元素个数

返回线性表第i个元素的值

GetElem(L,i,&e);

初始条件:线性表L已经存在,1<=i <= ListLenth(L)

操作结果:用e 返回线性表L中第i个元素的值

返回L中第1个与e满足compare()的数据元素的位序

LocateElem(L,e,compare())

初始条件:线性表L已经存在,compare()是数据元素判定函数

操作结果:返回L中第1个与e满足compare()的数据元素的位序,若这样的数据元素不存在则返回值为0.

待补充

忘保存,明天补上

线性表的顺序表示和实现2

顺序表的特点:

以物理位置相邻表示逻辑关系

任一元素均可随机存取(优点)

用高级语言实现数据类型

用一维数组表示顺序表

线性表可变(删除)

数组长度不可动态定义

注:一维数组的定义方式

类型说明符 数组名[常量表达式]

说明:常量表达式中可以包含常量和符号常量,不能包含变量,, 即C语言中不允许对数组的大小做动态定义

解决方式:用一变量表示顺序表的长度属性

如下所示

c定义结构体

#define LIST_INIT_SIZE 100 
//线性表存储空间的初始分配量
//定义了一个结构体 ​SqList​,包含一个数组和一个整型变量 
typedef struct { 
    Elem Type elem[LIST_INIT_SIZE];
    int length; //当前长度
} SqList;

实例

多项式的顺序存储结构类型定义

c实现

#define MAXSIZE 1000
//多项式可能达到的最大长度

//结构体:多项式非零项定义
typedef struct {
    float p; //系数
    int e; //指数
} Polynomial;

//结构体:多项式顺序存储结构
typedef struct{
    Polynomial *elem; //基地址
    int length; //当前项个数
} SqList;

图书表的顺序存储结构类型定义

#define MAXSIZE 10000
//图书表可能达到的最大长度

//图书信息定义
typedef struct {
    char no[20]; //图书ISBN
    char name[50]; //图书名字
    float price; //图书价格
} Book;

//图书表顺序存储结构类型为SqList
typedef struct {
    Book *elem; //存储空间的基地址
    int length; //图书表中当前图书个数
}SqList; //图书表的顺序存储结构类型为SqList

补充知识:

元素类型说明

顺序表类型定义

类c

typedef struct {
    ElemType data[]; //ElemType一般是自定义的顺序表里的元素类型
    int length;
} SqList; //顺序表类型

ElemType一般是自定义的顺序表里的元素类型

如下所示

typedef strcut {
    float p;
    int e;
} Polynomial;

typedef strcut {
    Polynomial *elem;
    int length;
}SqList;

数组定义

静态分配

typedef struct {
    ElemType data[MaxSize];
    int length;
} SqList; 

动态分配

typedef struct{
    ElemType *data;
    int length;
}SqList;

动态分配创建变量

#include <stdlib.h>
typedef struct{
    ElemType *data;
    int length;
}SqList;

SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize);
//MaxSize:数组最大长度 sizeof:获取类型长度 malloc分配固定长度的空间
//释放指针p所指变量的存储空间,即彻底删除一个变量
free(L.data)

c++动态存储分配

new 类型名(初值列表)

功能:申请用于存放T类型对象的内存空间,并根据初值列表赋初值

结果值;

成功:T类型的指针,指向新分配的内存

失败:0

int *p1 = new int;
int *p2 = new int(10);
delete p1;

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

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

相关文章

【系统架构设计师】计算机组成与体系结构 ⑩ ( 磁盘管理 | 磁盘移臂调度算法 | 先来先服务算法 | 最短寻道时间优先 | 扫描算法 | 循环扫描算法 )

文章目录 一、磁盘移臂调度算法1、磁盘移臂调度算法简介2、先来先服务算法3、最短寻道时间优先4、扫描算法5、循环扫描算法 二、最短寻道时间优先算法示例 一、磁盘移臂调度算法 1、磁盘移臂调度算法简介 磁盘 数据块读取 的 性能 主要由 寻道时间旋转延时 决定 ; 旋转延时 …

[SAP ABAP] 子例程

子例程 示例1 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 示例2 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 补充扩展练习 主程序(Z437_TEST_2024) INCLUDE文件(Z437_TEST_2024_F01) 输出结果如下所示 提示…

react+customize-cra使用less+less-loader时,可能遇到的问题及解决办法

目录 1、先附上各依赖版本和config-overrides.js配置代码&#xff0c;按这个版本和配置就没问题 2、问题&#xff08;注意&#xff1a;问题顺序没有先后之分哦&#xff09; 2.1、TypeError: Cannot read property tap of undefined 2.2、No module factory available for d…

谷歌地图Google JS API 实现

demo实现 实现源码&#x1f447; // 谷歌地图Google JS API 实现 <template><div class"myMap"><gmp-map :center"center" zoom"15" map-id"ab6b6643adfa1a70"><gmp-advanced-markerv-for"(res, index) in…

梅特勒同步热分析仪维修热重分析仪SDT650

仪器说明&#xff1a; 1、主要功能及应用范围&#xff1a; 一般可用于测量物质的晶态转变、熔融、凝固、纯度、蒸发、吸附水及结晶水含量、升华、吸附、解吸、吸收、玻璃化转变、液晶转变、热容的变化、燃烧、聚合、固化、催化反应、动力学。 2、主要规格及技术指标&#xff…

Redisson分布式锁、可重入锁

介绍Redisson 什么是 Redisson&#xff1f;来自于官网上的描述内容如下&#xff01; Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的 redis 常用数据结构命令服务&#xff0c;还提供了…

前端面试题14(贝塞尔曲线)

贝塞尔曲线在前端开发中经常用于创建平滑的动画路径或绘制复杂的矢量图形。贝塞尔曲线可以是一次、二次或三次的&#xff0c;其中三次贝塞尔曲线是最常见的&#xff0c;因为它提供了足够的灵活性来创建各种形状&#xff0c;同时保持计算上的可行性。 下面我将解释三次贝塞尔曲…

指标和量化交易那些事儿

最近很多朋友都在给我说&#xff0c;我要盘中打板的指标&#xff0c;我要盘中自动交易。今天我们来梳理下关于指标和量化交易这些事儿&#xff01; 第一&#xff1a;什么是指标&#xff1f;股票指标是属于统计学的范畴&#xff0c;依据一定的数理统计方法&#xff0c;运用一些…

【C++】认识使用string类

【C】STL中的string类 C语言中的字符串标准库中的string类string类成员变量string类的常用接口说明成员函数string(constructor构造函数)~string(destructor析构函数)默认赋值运算符重载函数 遍历string下标[ ]迭代器范围for反向迭代器 capacitysizelengthmax_sizeresizecapaci…

Outlook发送大文件的问题是什么?怎么解决?

Outlook不仅是一款电子邮件客户端&#xff0c;还包括日历、任务、笔记、联系人等功能&#xff0c;同时与Microsoft Office套件中的其他应用程序&#xff08;如Word、Excel、PowerPoint等&#xff09;集成紧密&#xff0c;方便用户在不同应用程序之间切换&#xff0c;提高工作效…

TC3xx NvM小细节解读

目录 1.FlsLoader Driver和FlsDmu Driver 2. FlsLoader小细节 3.小结 大家好&#xff0c;我是快乐的肌肉&#xff0c;今天聊聊TC3xx NvM相关硬件细节以及MCAL针对NvM的驱动。 1.FlsLoader Driver和FlsDmu Driver 在最开始做标定的时候&#xff0c;认为标定数据既然是数据&…

力扣双指针算法题目:复写零

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.解题思路 本题要求就是对于一个数组顺序表&#xff0c;将表中的所有“0”元素都向后再写一遍&#xff0c;且我们还要保证此元素之后的元素不受到影响&#xff0c;且复写零之后此数组顺序表的总长度不可以改变&#xff0c;…

C#(asp.net)房屋租赁管理系统-计算机毕业设计源码64421

目 录 摘要 1 绪论 1.1 研究背景与意义 1.2开发现状 1.3论文结构与章节安排 2 房屋租赁管理系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 …

如何利用好用便签提高工作效率?

在忙碌的工作中&#xff0c;我们经常需要记住许多琐碎的任务。如果这些任务被遗忘&#xff0c;可能会对我们的工作产生影响。这时&#xff0c;便签就成为了我们的得力助手。通过合理的使用和管理&#xff0c;便签不仅能帮助我们记住重要的事项&#xff0c;还能提高我们的工作效…

中科蓝讯AB5607E蓝牙5.4 低成本带插卡带U盘音箱方案

方案概述 中科蓝讯AB5607E蓝牙5.4 低成本带插卡带U盘音箱方案&#xff0c;我们已有成熟的方案&#xff0c;用户可以免开发&#xff08;零代码&#xff09;快速完成带插卡带U盘蓝牙音箱&#xff0c;提供原理图&#xff0c;PCB Layout指导。 方案优势 低成本&#xff0c;IC成本低…

【Linux进程】进程优先级 Linux 2.6内核进程的调度

前言 进程是资源分配的基本单位, 在OS中存在这很多的进程, 那么就必然存在着资源竞争的问题, 操作系统是如何进行资源分配的? 对于多个进程同时运行, 操作系统又是如何调度达到并发呢? 本文将以Linux kernel 2.6为例 , 向大家介绍进程在操作系统中 (OS) 的调度原理; 1. 进程优…

【开发工具-前端必备神器】WebStrom2024版-安装和使用(小白学习)

一、官方下载地址 Other Versions - WebStorm 选择适合自己电脑的下载 二、安装步骤 1、双击下载的exe安装 2、选择安装目录【建议不要安装在C盘下】 3、安装选项&#xff0c;可以全选 4一直点击下一步就行了 5.双击运行 安装遇到问题&#xff1a; 我是下错版本了&#xff0…

Motion Guidance: 扩散模型实现图像精确编辑的创新方法

在深度学习领域&#xff0c;扩散模型&#xff08;diffusion models&#xff09;因其能够根据文本描述生成高质量图像而备受关注。然而&#xff0c;这些模型在精确编辑图像中对象的布局、位置、姿态和形状方面仍存在挑战。本文提出了一种名为“运动引导”&#xff08;motion gui…

【LLM】一、利用ollama本地部署大模型

目录 前言 一、Ollama 简介 1、什么是Ollama 2、特点&#xff1a; 二、Windows部署 1.下载 2.安装 3.测试安装 4.模型部署&#xff1a; 5.注意 三、 Docker部署 1.docker安装 2.ollama镜像拉取 3.ollama运行容器 4.模型部署&#xff1a; 5.注意&#xff1a; 总结 前言…

【C++】哈希表 ---开散列版本的实现

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 开散列版本的实现 1 前言2 开散列版本的实现2.1 节点设计2.2 框架搭建2.3 插入函数2.4 删除函数2.5 查找操作2.6 测试 Thanks♪(&#xff65;ω&#x…