【数据结构笔记04】线性结构:线性表及其实现
本次笔记内容:
2.1.1 引子:多项式表示
2.1.2 线性表及其存储顺序
2.1.3 顺序存储的插入和删除
2.1.4 链式存储及查找
2.1.5 链式存储的插入和删除
2.1.6 广义表与多重链表
文章目录
- 引例:多项式表示
- 方法1:顺序存储结构直接表示
- 方法2:顺序存储结构表示非零项
- 方法3:链表结构存储非零项
- 什么是线性表
- 线性表的顺序存储实现
- 线性表的链式存储实现
- 广义表
- 例:二元多项式如何表示?
- Tag和union{}URegion来区分广义表中数据类型
- 多重链表
- 多重链表例:矩阵表示
引例:多项式表示
f(x)=a0+a1x+...+an−1xn−1+anxnf(x)=a_0+a_1x+...+a_{n-1}x^{n-1}+a_nx^nf(x)=a0+a1x+...+an−1xn−1+anxn
方法1:顺序存储结构直接表示
- 数组各分量对应多项式各项。
**弊端:**过于稀疏,存在浪费。
方法2:顺序存储结构表示非零项
- 可以将多项式看成一个(a,i)二元组的集合
- 用结构数组表示
方法3:链表结构存储非零项
什么是线性表
线性表(Linear List):由同类型的数据元素构成的有序序列的线性结构
- 表中元素个数成为线性表的长度
- 线性表没有元素时,成为空表
- 表起始位置称表头,表结束位置称表尾
数据对象集: 线性表是n(n>=0)个元素构成的有序序列(a1,a2,…,an)
操作集: 线性表L∈List,整数i表示位置,元素X∈ElementType,线性表的基本操作主要有:
- List MakeEmpty():初始化一个空线性表L;
- ElementType FindKth( int K, List L ):根据位序K,返回相应元素;
- int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置;
- void Insert( ElementType X, int i, List L ):在位序i前插入一个新元素X;
- void Delete( int i, List L ):删除指定位序i的元素;
- int Length( List L ):返回线性表L的长度n。
线性表的顺序存储实现
- 利用数组的连续存储空间顺序存放线性表的各元素
其中,typedef struct LNode *List指:为struct LNode *定义了一个别名List,List是指针。
其中,malloc()为申请动态内存的函数。令指针指向内存Ptrl=(List)malloc([内存大小])。
查找的时间复杂度为O(n)。
线性表的链式存储实现
- 不要求逻辑上相邻的两个元素物理上也相邻,用“链”建立起元素间的逻辑关系。
- 求表长
int Length ( List PtrL)
{List p = PtrL;int j = 0;while(p) {p = p->Next;j++;}return j;
}
- 查找
2.1 按序号查找
List FindKth(int K, List PtrL)
{List p = PtrL;int i = 1;while (p != NULL && i < K){p = p->Next;i++;}if (i == K)return p;elsereturn NULL;
}
2.2 按值查找
List Find(ELementType X, List PtrL){List p=PtrL;while (p!=NULL && p->Data!=X)p=p->Next;return p; // 没找到就返回NULL
}
- 插入
- 在第i−1(1≤i≤n+1)i-1(1\le i\le n+1)i−1(1≤i≤n+1)个结点后插入一个值为X的新节点
List Insert(ElementTypeX, int i, List PtrL)
{List p, s;if (i == 1){ /* 新节点插入在表头 */s = (List)malloc(sizeof(struct LNode));s->Data = X;s->Next = PtrL;return s;}p = FindKth(i - 1, PtrL) ; if (p == NULL){printf("参数i错");return NULL;}else{s = (List)malloc(sizeof(struct LNode));s->Data = X;s->Next = p->Next;p->Next = s;return PtrL;}
}
- 删除
- 删除链表的第i(1≤i≤n)i(1\le i\le n)i(1≤i≤n)位置上的结点
- 不要忘记释放s所指的空间,内存空间才不会泄露
List Delete(int i, List PtrL)
{List p, s;if (i == 1){s = PtrL;if (Ptrl != NULL)PtrL = PtrL->Next;elsereturn NULL;free(s);return PtrL;}p = FindKth(i - 1, PtrL);if (p == NULL){printf("第%d个结点不存在",i - 1);return NULL;}else if (p->Next == NULL){printf("第%d个结点不存在",i);return NULL}else{s = p->Next;p->Next = s->Next;free(s);return PtrL;}
}
广义表
例:二元多项式如何表示?
- **广义表(Generalized List)**是线性表的推广
Tag和union{}URegion来区分广义表中数据类型
- 可能是单元素也可能是广义表。
多重链表
- 链表中结点可能同时隶属于多个链;
- 多重链表中结点指针域会有多个,如前面例子包含了Next和SubList两个指针域;
- 但包含两个指针域的链表不一定是多重链表,比如双向链表不是多重链表。
- 多重链表有广泛的用途,基本上如树、图这样相对复杂的数据结构都可以采用多重链表的方式实现存储。
多重链表例:矩阵表示
- Term链表分别与同行同列的结点形成循环链表;
- Head头结点;
- 左上角Term[4,5,7],是链表的入口结点,表示4行5列7个非零元素。
- 实际上,第i行的Head和第i列的Head是同一个Head。
- Term和Head用统一的结构(Tag)表示。
代码可以见:用典型的多重链表(十字链表)存储稀疏矩阵,但是觉得很多地方写的不对。看代码时对照图看。
【数据结构笔记04】线性结构:线性表及其实现相关推荐
- 2022天勤考研数据结构笔记 第2章 线性表
2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...
- 数据结构与算法——线性结构——线性表及其表示
-"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...
- 数据结构笔记(一) 线性表(C语言描述)
数据结构(一) 线性表 顺序表 存储结构 #define ElemType int #define MAXSIZE 100 typedef struct{ElemType *elem;//初始地址in ...
- 【数据结构笔记40】哈希表冲突处理方法:开放地址法(线性探测、平方探测、双散列、再散列),分离链接法
本次笔记内容: 11.3.1 开放定址法 11.3.2 线性探测 11.3.3 线性探测-字符串的例子 11.3.4 平方探测法 11.3.5 平方探测的实现 11.3.6 分离链接法 文章目录 冲突 ...
- 小蚂蚁学习数据结构(4)——线性结构——线性表的链式表示和实现(下)
2019独角兽企业重金招聘Python工程师标准>>> 用代码实现对链表的操作. /*创建一个链表,实现对链表的创建,插入/追加,删除等操作 */ # include <std ...
- 线性结构 —— ST 表与 RMQ
[概述] RMQ(Range Minimum/Maximum Query),是对于长度为 n 的数列 A,回答若干次询问 RMQ(i,j),返回数列 A 中下标在区间 [i,j] 中的最值,即:区间最 ...
- 【数据结构笔记39】哈希表/散列表、(数据关键字/字符串关键字)散列构造函数
本次笔记内容: 11.1.1 引子:散列的基本思路 11.1.2 什么是散列表 11.2.1 数据关键词的散列函数构造 11.2.2 字符串关键词的散列函数构造 文章目录 散列表背景 基本思想引出 已 ...
- 【数据结构笔记42】哈希表应用:文件中单词词频统计
本次笔记内容: 11.5 文件中单词词频统计 文章目录 题目 分析 程序框架 题目 如上图,对单词词频进行统计. 分析 如上图,涉及到对已有单词进行查找,因此要进行单词的管理,使用散列表. 程序框架 ...
- 数据结构——线性结构(线性表)
文章目录 一. 线性结构概述 1. 线性结构(线性表的逻辑结构)的定义 2. 线性表的特点 二. 线性结构分类 1. 连续存储[顺序表] (1). 什么叫数组 (2). 顺序表算法的基本操作 (3). ...
最新文章
- Windows Server 2012
- java的Comparator和Comparable
- Fegion-4解决Fegion第一次请求timeout的问题
- 如何使用Spring设置安全的REST API
- android 坐标点计算器,Android实现简易计算器
- 筛选法求1到100以内的素数
- python并发处理list数据_3种方式实现python多线程并发处理
- server 2008中新建AD域控制器
- Java---读取.properties配置文件空指针异常
- 逻辑斯谛(Logistic)回归、参数估计教程
- Atitit 操作系统原理索引 目录 1. 操作系统原理(cpu,process,mem,file,device mana)	1 1.1. 第1章 操作系统概述	1 2. 处理器管理	2 2.1.
- 也谈POV旋转LED制作,经验及技术点。
- extjs6 表格行选中时去掉默认背景颜色
- PSV微豆瓣FM v0.1.0
- 微信投票python脚本_微信刷票Python脚本教程
- ES6最详细/易懂教程
- mac mini u盘安装系统_用PE系统U盘启动盘安装操作系统
- Python Basic - Python open() 、closed()、write()、read()、 readline()、readlines()、with与文件进行交互
- 2021数学基础30讲扫描版 网盘(里面直接是文档,免费)
- sbt介绍与构建Scala项目
热门文章
- error LNK2019: unresolved external symbol “__declspec(dllimport) public: __thiscall 的解决方案
- 模拟退火算法解决TSP问题
- Oracle 11g EM安全证书问题无法访问的解决办法
- Springboot token令牌验证解决方案 在SpringBoot实现基于Token的用户身份验证
- Maven 手动安装JAR包到本地maven仓库后,但在项目中依旧报错找不到JAR包解决方法
- MYSQL问题解决方案:Access denied for user ‘root‘@‘localhost‘ (using password:YES)
- c语言中0xa0f对应的十进制,全国计算机二级C基础知识重点讲解
- 升级win11系统需要预留多少磁盘空间 Windows11系统盘需要多少空间的介绍
- rosweb,roslib,ROS2D.PolygonMarker 绘制多边形
- mysql json字符串_mysql如何截取一个json字符串?