本次笔记内容:
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​+a1​x+...+an−1​xn−1+an​xn

方法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)。

线性表的链式存储实现

  • 不要求逻辑上相邻的两个元素物理上也相邻,用“链”建立起元素间的逻辑关系。

  1. 求表长
int Length ( List PtrL)
{List p = PtrL;int j = 0;while(p) {p = p->Next;j++;}return j;
}
  1. 查找

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
}
  1. 插入
  • 在第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;}
}
  1. 删除
  • 删除链表的第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】线性结构:线性表及其实现相关推荐

  1. 2022天勤考研数据结构笔记 第2章 线性表

    2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...

  2. 数据结构与算法——线性结构——线性表及其表示

    -"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...

  3. 数据结构笔记(一) 线性表(C语言描述)

    数据结构(一) 线性表 顺序表 存储结构 #define ElemType int #define MAXSIZE 100 typedef struct{ElemType *elem;//初始地址in ...

  4. 【数据结构笔记40】哈希表冲突处理方法:开放地址法(线性探测、平方探测、双散列、再散列),分离链接法

    本次笔记内容: 11.3.1 开放定址法 11.3.2 线性探测 11.3.3 线性探测-字符串的例子 11.3.4 平方探测法 11.3.5 平方探测的实现 11.3.6 分离链接法 文章目录 冲突 ...

  5. 小蚂蚁学习数据结构(4)——线性结构——线性表的链式表示和实现(下)

    2019独角兽企业重金招聘Python工程师标准>>> 用代码实现对链表的操作. /*创建一个链表,实现对链表的创建,插入/追加,删除等操作 */ # include <std ...

  6. 线性结构 —— ST 表与 RMQ

    [概述] RMQ(Range Minimum/Maximum Query),是对于长度为 n 的数列 A,回答若干次询问 RMQ(i,j),返回数列 A 中下标在区间 [i,j] 中的最值,即:区间最 ...

  7. 【数据结构笔记39】哈希表/散列表、(数据关键字/字符串关键字)散列构造函数

    本次笔记内容: 11.1.1 引子:散列的基本思路 11.1.2 什么是散列表 11.2.1 数据关键词的散列函数构造 11.2.2 字符串关键词的散列函数构造 文章目录 散列表背景 基本思想引出 已 ...

  8. 【数据结构笔记42】哈希表应用:文件中单词词频统计

    本次笔记内容: 11.5 文件中单词词频统计 文章目录 题目 分析 程序框架 题目 如上图,对单词词频进行统计. 分析 如上图,涉及到对已有单词进行查找,因此要进行单词的管理,使用散列表. 程序框架 ...

  9. 数据结构——线性结构(线性表)

    文章目录 一. 线性结构概述 1. 线性结构(线性表的逻辑结构)的定义 2. 线性表的特点 二. 线性结构分类 1. 连续存储[顺序表] (1). 什么叫数组 (2). 顺序表算法的基本操作 (3). ...

最新文章

  1. Windows Server 2012
  2. java的Comparator和Comparable
  3. Fegion-4解决Fegion第一次请求timeout的问题
  4. 如何使用Spring设置安全的REST API
  5. android 坐标点计算器,Android实现简易计算器
  6. 筛选法求1到100以内的素数
  7. python并发处理list数据_3种方式实现python多线程并发处理
  8. server 2008中新建AD域控制器
  9. Java---读取.properties配置文件空指针异常
  10. 逻辑斯谛(Logistic)回归、参数估计教程
  11. Atitit 操作系统原理索引 目录 1. 操作系统原理(cpu,process,mem,file,device mana) 1 1.1. 第1章 操作系统概述 1 2. 处理器管理 2 2.1.
  12. 也谈POV旋转LED制作,经验及技术点。
  13. extjs6 表格行选中时去掉默认背景颜色
  14. PSV微豆瓣FM v0.1.0
  15. 微信投票python脚本_微信刷票Python脚本教程
  16. ES6最详细/易懂教程
  17. mac mini u盘安装系统_用PE系统U盘启动盘安装操作系统
  18. Python Basic - Python open() 、closed()、write()、read()、 readline()、readlines()、with与文件进行交互
  19. 2021数学基础30讲扫描版 网盘(里面直接是文档,免费)
  20. sbt介绍与构建Scala项目

热门文章

  1. error LNK2019: unresolved external symbol “__declspec(dllimport) public: __thiscall 的解决方案
  2. 模拟退火算法解决TSP问题
  3. Oracle 11g EM安全证书问题无法访问的解决办法
  4. Springboot token令牌验证解决方案 在SpringBoot实现基于Token的用户身份验证
  5. Maven 手动安装JAR包到本地maven仓库后,但在项目中依旧报错找不到JAR包解决方法
  6. MYSQL问题解决方案:Access denied for user ‘root‘@‘localhost‘ (using password:YES)
  7. c语言中0xa0f对应的十进制,全国计算机二级C基础知识重点讲解
  8. 升级win11系统需要预留多少磁盘空间 Windows11系统盘需要多少空间的介绍
  9. rosweb,roslib,ROS2D.PolygonMarker 绘制多边形
  10. mysql json字符串_mysql如何截取一个json字符串?