数据结构与算法(Python语言描述)课件3
数据结构与算法ppt课件
![数据结构与算法ppt课件](https://img.taocdn.com/s3/m/0d87a97aed630b1c59eeb5c1.png)
队 头
队 尾
front
队 列 示意图
rear
举例1:到医院看病,首先需要到挂号处
挂号,然后,按号码顺序救诊。 举例2:乘坐公共汽车,应该在车站排
队,车来后,按顺序上车。
• 队列是指允许在一端(队尾)进入插入,而在另一端(队头) 进行删除的线性表。Rear指针指向队尾,front指针指向队头。
• 队列是“先进先出”(FIFO)或“后进后出”(LILO)的线 性表。
素存储位置的信息。这个信息称为指针(pointer)或链(link)。这两部分组成了
链表中的结点结构:
•
将线性表的元素放到一个具有头指针的链表中,链表中每 个结点包含数据域和指针域。
数据域存放数据,指针域存放后继结点的地址,最后一个 结点的指针域为空。逻辑上相邻的数据元素在内存中的物理存 储空间不一定相邻。
1、数据的逻辑结构
所谓逻辑结构实际上就是指数据元素之间的前后件关系。 其中前后件关系是指它们的逻辑关系,而与他们在计算机中的 存储位置无关。它包含两个要素:
数据元素的集合,通常记为D; 数据元素之间的关系(前后件关系),通常记为R。 形式表示如下:
B=(D,R) 其中B表示数据结构
2、数据的存储结构
1、队列(queue)的定义
队列是允许在一端(队尾rear)进行插入、而在另一端(队头 front)进行删除的线性表。它按照“先进先出”(FIFO– first in first out) 或“后进后出”(LILO—last in last out)的原则组织数 据。
a1 , a2 , a3 , a4 , ………… an-1 , an
在S(1:m)中,S(bottom)通常为栈底元素(在栈非空的情况 下),S(top)为栈顶元素。top=0表示栈空;top=m表示栈满。
数据结构与算法第三章幻灯片PPT
![数据结构与算法第三章幻灯片PPT](https://img.taocdn.com/s3/m/9331a6e3b52acfc788ebc9dc.png)
//赋值操作=,串s复制到本串 String operator+ (char *s);//拼接算子+,本串拼接标准串s String operator+ (String& s);//拼接算子+,本串拼接串s friend String operator+ (char *s1, String& s); //友函数作为拼接算子+ 其返回值是一个实例串,等于标准串str拼接串s
字符串变量
3.1.1.2 字符
字符(char) :组成字符串的基本单位。 在C和C++中
➢ 单字节(8 bits) ➢ 采用ASCII码对128个符号(字符集
charset)进行编码
3.1.1.3 字符的编码顺序
为了字符串间比较和运算的便利,字符 编码表一般遵循约定俗成的“偏序编码 规则”。
字符偏序:根据字符的自然含义,某些 字符间两两可以比较次序。 ➢ 其实大多数情况下就是字典序 ➢ 中文字符串有些特例,例如“笔划”序
2. 串复制 char *strcpy(char *s1, char*s2);
3.串拼接 char *strcat(char *s1, char *s2);
4.串比较 int strcmp(char *s1, char *s2);
3.1.1.4 C++标准string(续)
5.输入和输出函数 6.定位函数 char *strchr(char *s, char c); 7.右定位函数 char *strrchr(char *s, char c);
拼接在一起 //用数组str[]存储字符串,在内部可以用str[i]访问串的第i
《数据结构与算法 》课件
![《数据结构与算法 》课件](https://img.taocdn.com/s3/m/40669a9db8f3f90f76c66137ee06eff9aef849ff.png)
数据结构在人工智能中的优化可以提升算法的效率和准确性,例如通过使用哈希表实现快速特征匹配,提高图像识别速度。
THANK YOU
定义与分类
添加边、删除边、查找路径等。
基本操作
图中的边可以是有方向的,也可以是无方向的。节点之间可以有多种关系,如邻接、相连等。
特性
社交网络、交通网络、路由协议等。
应用场景
05
排序与查找算法
冒泡排序:通过重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
详细描述
链表的优势在于可以动态调整大小,插入和删除操作仅需修改指针,时间复杂度为O(1)。但链表访问特定元素需要从头部遍历,效率较低。
VS
栈和队列是特殊的线性数据结构,它们遵循特定的操作规则。栈遵循后进先出(LIFO)原则,队列遵循先进先出(FIFO)原则。
详细描述
栈用于保存按照后进先出顺序访问的数据元素,常见的操作有压栈、弹栈和查看栈顶元素。队列用于保存按照先进先出顺序访问的数据元素,常见的操作有入队、出队和查看队首元素。
03
线性数据结构
数组是线性数据结构中的基本形式,它以连续的内存空间为基础,用于存储固定长度的同类型元素。
数组具有固定的长度,可以通过索引直接访问任意元素。它适合于需要快速访问数据的场景,但插入和删除操作需要移动大量元素,效率较低。
详细描述
总结词
总结词
链表是一种线性数据结构,它通过指针链接各个节点,节点包含数据和指向下一个节点的指针。
《基于Python语言的数据结构与算法课件》
![《基于Python语言的数据结构与算法课件》](https://img.taocdn.com/s3/m/26eb96b6bb0d4a7302768e9951e79b8968026817.png)
学习动态规划算法的 核心思想,了解其适 用条件和解决问题的 步骤。
2 动态规划算法的
实现
通过实例演示动态规 划算法的具体实现方 法和优化技巧。
3 应用案例:最长
公共子序列
以最长公共子序列问 题为例,展示动态规 划算法的应用和实际 效果。
查找算法的分类和实现
顺序查找
顺序查找的基本原理和实 现步骤,介绍顺序查找的 特点和适用场景。
二分查找
二分查找的基本原理和实 现方式,演示二分查找的 应用场景和时间复杂度。
哈希查找
介绍哈希查找的原理和实 现方法,展示哈希查找在 查找大规模数据时的优势。
动态规划算法的基本思想和实现
1 动态规划的基本
应用案例:社交网络分析
通过社交网络分析案例,展示图结构的实际应用价值。
排序算法的分类和实现
排序算法类别 冒泡排序 插入排序 选择排序 快速排序 归并排序 堆排序
时间复杂度 O(n^2) O(n^2) O(n^2) O(nlogn) O(nlogn) O(nlogn)
空间复杂度 O(1) O(1) O(1) O(logn) O(n) O(1)
3 强大库支持
Python拥有丰富的第三方库,如NumPy、Pandas等,方便数据处理和分析。
数据结构基础
• 数据结构的定义和作用 • 线性结构与非线性结构的区别 • 常见的数据结构分类
线性表的实现与应用
顺序表
使用Python的列表实现顺序表,并探索其 基本操作和应用场景。
链表
使用节点和指针实现链表,介绍链表的特 点及常见操作。
基于Python语言的数据结 构与算法课件
通过这个课件,我们将介绍Python语言的特点和应用领域,并深入探讨数据 结构和算法的基本概念和实现方法。
数据结构与算法(Python语言描述)课件
![数据结构与算法(Python语言描述)课件](https://img.taocdn.com/s3/m/df0b2a4fbc64783e0912a21614791711cd79795e.png)
• //分配空间
•
L.elem = (ElemType *)malloc(LIST_INIT_SIZE
•
*sizeof(ElemType));
•
if(!L.elem) exit(OVERFLOW);
• //空间总长赋初值
•
L.listsize = LIST_INIT_SIZE;
•
• //表长赋初值0
a
a
a
a
a
a
a
1
2
3
4
5
6
7
•
int length; // 当前长度
listsize
•
inetlem listsize; // 当前分配的存储容量
• } List;
List类型的对象L
listsize 10 length 3
elem
279
动态内存空间
顺序存储时基 本操作的实现
• Status InitList(List &L) {
//起步 i = 1;
p = L.elem;
//在有效范围内查询 while(i <= L.length && !(*compare)(*p++, e)) ++i;
//返回元素的真实位置 if (i <= L.length) return i; else return 0;
}
int LocateElem(List L, ElemType e, Status (*compare)(ElemType, ElemType)) {
Status GetElem(List L, int i, ElemType &e) { // i 的合法性检测 if (i < 1 || i > L.length) return ERROR; //取元素 e = L.elem[i-1]; return OK; }
数据结构与算法:Python语言描述 栈和队列 ppt课件
![数据结构与算法:Python语言描述 栈和队列 ppt课件](https://img.taocdn.com/s3/m/f11bc94a01f69e3143329452.png)
裘宗燕,2019/12/22-/10/
栈的应用
栈是算法和程序里最常用的辅助结构,基本用途基于两方面: 用栈可以很方便地保存和取用信息,因此常作为算法或程序里的辅 助存储结构,临时保存信息,供后面的操作使用 利用栈后进先出的特点,可以得到特定的存储和取用顺序 许多实际运用结合了这两方面的特性
配对的原则
遇到的闭括号应该匹配此前遇到的最近的尚未匹配的对应开括号
由于多种/多次/可能嵌套,为检查配对,遇到的开括号必须保存
由于括号可能嵌套,需要逐对匹配,闭括号应与前面最近的尚未有 匹配的开括号匹配,后面括号应与更前面次近的括号匹配
可以删除匹配的括号,为后面的匹配做好准备
后遇到并保存的开括号应该先删除,这就是后进先出,而且要按照出现 顺序,显然应该/可以用一个栈保存开括号
概述
栈和队列保证元素存取之间的时间关系,特点是:
栈是保证缓存元素后进先出(Last In First Out,LIFO)的结构
队列是保证缓存元素的先进先出(先存者先用,First In First Out, FIFO)关系的结构
对于栈和队列,任何时候,下次访问或删除的元素都默认地唯一确定。 只有新的存入或删除(弹出)操作可能改变下次的默认元素
self._elems = [] # 所有栈操作都映射到list操作
def is_empty(self):
return self._elems == []
def top(self):
if self._elems == []:
raise StackUnderflow("in SStack.top()")
return self._elems[-1]
《数据结构与算法 》课件
![《数据结构与算法 》课件](https://img.taocdn.com/s3/m/38d89fa65ff7ba0d4a7302768e9951e79b8969c5.png)
自然语言处理中,数据结构用于表示句子、单词之间的关系,如依 存句法树。
计算机视觉
计算机视觉中的图像处理和识别使用数据结构来存储和操作图像信 息,如链表和二叉树。
算法在计算机科学中的应用
加密算法
加密算法用于保护数据的机密性和完整性,如 RSA算法用于公钥加密。
排序算法
排序算法用于对数据进行排序,如快速排序和归 并排序广泛应用于数据库和搜索引擎中。
归并排序
将两个或两个以上的有序表组合成一个新的有序表。
查找算法
线性查找:从数据结构的一端开始逐 个检查每个元素,直到找到所查找的 元素或检查完所有元素为止。
二分查找:在有序数据结构中查找某 一特定元素,从中间开始比较,如果 中间元素正好是要查找的元素,则搜 索过程结束;如果某一特定元素大于 或者小于中间元素,则在数组大于或 小于中间元素的那一半中查找,而且 跟开始一样从中间元素开始比较。如 果在某一步骤数组为空,则代表找不 到。这种搜索算法每一次比较都使搜 索范围缩小一半。
04
常见算法实现
排序算法
冒泡排序
通过重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复 地进行直到没有再需要交换,也就是说该数列已经排序完成。
快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按 此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
数据结构在计算机科学中的应用
1 2
数据库系统
数据结构是数据库系统的基础,用于存储、检索 和管理大量数据。例如,B树和哈希表在数据库 索引中广泛应用。
数据结构与算法(共11张PPT)
![数据结构与算法(共11张PPT)](https://img.taocdn.com/s3/m/88bf4b3c2379168884868762caaedd3383c4b5dd.png)
(b)入队3个元素(c)出队3个元素
(b) d, e, b, g入队
利用一组连续的存储单元(一维数组)依次存放从队 在循环队列中进行出队、入队操作时,队首、队尾指
队列示意图
在非空队列里,队首指针始终指向队头元素,而队
(b) d, e, b, g入队
8
Q.rear
a5
a4
Q.front
(d)入队2个元素
a1, a2, … , an
的指修针改 和是队依列先中进元先素出的Q的变.re原化a则情r 进况行。的,如图所示。
a3
Q.front
a2
a1
首到队尾的各个元素,称为顺序队列。
(c)
d, e出队Q.front
Q.front
◆出队:首先删去front所指的元素,然后将队首指针front+1,并
◆rear所指的单元始终为空(a。)空队列
i
i, j, k入队
(e)
1
2
3
k
r
01
j5
2
front
43
i
b, g出队
(f )
r, p,
p rear
s, t入队
循环队列操作及指针变化情况
入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针 ,故队空和队满时头尾指针均相等。因此,无法通过front=rear来 判断队列“空”还是“满”。解决此问题的方法是:约定入队前,
数据结构与算法
1算法基础 2数据结构
3栈
4队列
5链表 6树和二叉树
7查找
4队列
✓队列的基本概念 ✓队列运算
✓循环队列及其运算
4队列
1.队列的基本概念
数据结构与算法讲义课件
![数据结构与算法讲义课件](https://img.taocdn.com/s3/m/449e920b2f3f5727a5e9856a561252d380eb20a1.png)
04
基础算法
排序算法
冒泡排序
通过重复地比较相邻元素并交换位置,使得较大 的元素逐渐向数组尾部移动,最终实现数组序序列的合适位置, 使得已排序序列保持有序,直到所有元素均插入 完毕。
选择排序
每次从未排序的元素中选取最小(或最大)的一 个元素,将其放到已排序序列的末尾,直到所有 元素均排序完毕。
03
算法概述
算法的定义与特性
总结词
算法是解决问题的步骤集合,具有确定 性、有限性、输入和输出。
VS
详细描述
算法是解决问题的明确、具体的步骤集合 ,每个步骤都有确切的含义,不存在歧义 。算法在执行过程中,从开始到结束,是 确定性的,每一步都有确定的输入和输出 。算法在有限的时间内完成执行,无论何 种情况下都能得出结果。算法具有输入和 输出,可以接受外部数据,并对外输出结 果。
快速排序
通过选取一个基准元素,将数组分成两部分,其 中一部分的所有元素都比基准元素小,另一部分 的所有元素都比基准元素大,然后递归地对这两 部分进行快速排序。
查找算法
线性查找
从数组的第一个元素开始,逐个比较 每个元素,直到找到目标元素或遍历 完整个数组。
哈希查找
利用哈希函数将键值转化为数组下标, 然后在相应的数组下标处查找目标元 素。
性是指算法在修改和升级时的难易程度。
算法的分类
总结词
详细描述
根据不同标准可以将算法分为不同类型,如 按照功能、按照应用领域、按照设计方法等。
按照功能可以将算法分为排序算法、搜索算 法、图论算法等。按照应用领域可以将算法 分为计算机视觉算法、自然语言处理算法等。 按照设计方法可以将算法分为分治法、贪心 法、动态规划法等。
树
总结词
《图解Python数据结构与算法课件》
![《图解Python数据结构与算法课件》](https://img.taocdn.com/s3/m/53633126f4335a8102d276a20029bd64783e62dd.png)
图:定义、图的表示方法、遍 历算法
详解图的定义和不同的表示方法,如邻接矩阵和邻接表,并探讨图的遍历算 法和常见的应用场景。
排序算法:冒泡排序、选择排 序、插入排序、快速排序、归 并排序
介绍常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归 并排序。比较它们的优缺点和适用场景。
搜索算法:深度优先搜索、广度优先搜索、 A*算法
栈与队列:定义、应用场景、 实现
介绍栈和队列的概念及其在计算中的应用。探索它们的实现方式和特定场景 中的应用。
链表:定义、单链表、双向链 表、循环链表
深入了解链表的不同类型:单链表、双向链表和循环链表,以及它们在数据 结构中的用途和实现方法。
树:定义、二叉树、遍历算法、 应用场景
探索树的定义和不同类型,特别是二叉树,并研究树的遍历算法和在实际应 用中的应用场景。
Python数据类型回顾
回顾Python中的基本数据类型,包括数字与算法中的应用。
列表:基本操作、排序、查找
探索列表的基本操作,如添加、删除和修改元素,以及各种排序和查找算法的实现与应用。
字符串:基本操作、匹配算法
了解字符串的基本操作,例如拼接和切片,以及常见的字符串匹配算法,如 暴力匹配和KMP算法。
《图解Python数据结构与 算法课件》
本课件旨在图解Python数据结构与算法,帮助读者深入理解并掌握重要概念。 包括数据结构、算法的基本概念,Python数据类型,以及列表、字符串等的 操作和排序查找算法。
什么是数据结构和算法?
探索数据结构与算法的定义,它们在计算中的重要作用,以及为什么它们对 于Python编程至关重要。
总结与展望
总结所学内容并展望未来,鼓励读者持续探索和应用数据结构与算法的知识。
基于Python的数据结构与算法课件(含PPT和练习题)
![基于Python的数据结构与算法课件(含PPT和练习题)](https://img.taocdn.com/s3/m/f0aa0459974bcf84b9d528ea81c758f5f71f2978.png)
你好!欢迎来到基于Python的数据结构与算法课程。本课程旨在帮助你深入 理解和掌握常见的数据结构和算法,并利用Python编程语言进行实际应用。 让我们开始这段知识冒险之旅吧!
课程导言
在本节中,我们将介绍课程内容和目标,以及学习数据结构和算法的重要性。你将了解到如何应用这些知识来 解决实际问题,并为后续的学习做好准备。
综合案例分析:使用Python实 现常见算法
在本节中,我们将结合实际案例,使用Python编程语言实现一些常见的算法, 展示数据结构和算法在实际问题中的作用和应用。
递归算法
递归是一种强大而又有趣的算法技巧,它能够将复杂的问题简化为简单的子 问题。在本节中,我们将学习递归的原理和应用。
排序算法及其实现
排序算法是数据处理中常见的操作,我们将讨论多种排序算法的原理、性能 和实现方式。掌握这些算法将为你解决排序问题提供良好的基础。
散列表
散列表是一种高效的数据结构,具有快速查找和插入的特点。在本节中,我 们将介绍散列表的概念、实现和优化方法,以及应用实例。
Python基础语法回顾
在本节中,我们将回顾Python编程语言的基础语法,包括变量、数据类型、 条件语句、循环语句等。这将为接下来的课程内容打下坚实的基础。
算法与数据结构基础
在本节中,我们将介绍算法和数据结构的基本概念。你将学习到算法的定义和特性,以及各种常见数据结构的 基本原理和应用场景。
数组及其操作
贪心算法
贪心算法是一种简单而有效的算法思想,每步都采取局部最优的选择。我们 将讨论贪心算法的适用场景和常见问题。
回溯算法
回溯算法是一种穷举求解的算法思想,它通过逐步构建解空间树并进行回溯搜索来找到问题的解。我们将详细 讨论回溯算法的实现和优化。
Python程序设计第三章常用数据结构.ppt
![Python程序设计第三章常用数据结构.ppt](https://img.taocdn.com/s3/m/87c8008051e2524de518964bcf84b9d529ea2c60.png)
Python程序设计第三章常用数据结构.ppt 幻灯片 1:Python 程序设计第三章常用数据结构主讲人姓名幻灯片 2:目录列表(List)元组(Tuple)字典(Dictionary)集合(Set)幻灯片 3:列表(List)列表是 Python 中最基本的数据结构之一。
列表中的元素可以是不同的数据类型,如整数、字符串、甚至其他列表。
列表使用方括号``来定义,元素之间用逗号分隔。
示例代码:```pythonmy_list = 1, 'hello', 2, 3```幻灯片 4:列表的操作访问列表元素:通过索引值来访问,索引从 0 开始。
切片操作:可以获取列表的一部分。
列表的修改:可以添加、删除、修改元素。
示例代码:```pythonmy_list = 1, 2, 3, 4, 5print(my_list0) 输出 1print(my_list1:3) 输出 2, 3my_listappend(6) 在末尾添加 6my_listpop(2) 删除索引为 2 的元素my_list0 = 0 修改索引为 0 的元素为 0```幻灯片 5:元组(Tuple)元组与列表相似,但元组中的元素不能修改。
元组使用小括号`()`来定义,元素之间用逗号分隔。
示例代码:```pythonmy_tuple =(1, 'hello',(2, 3))```幻灯片 6:元组的操作访问元组元素:与列表相同,通过索引值访问。
元组的切片操作:也与列表类似。
示例代码:```pythonmy_tuple =(1, 2, 3, 4, 5)print(my_tuple0) 输出 1print(my_tuple1:3) 输出(2, 3)```幻灯片 7:字典(Dictionary)字典是一种无序的键值对数据结构。
键必须是唯一的,且不可变的数据类型(如字符串、整数、元组等),值可以是任意数据类型。
字典使用花括号`{}`来定义,键值对之间用冒号`:`分隔,键值对之间用逗号分隔。
数据结构与算法Python语言描述课件
![数据结构与算法Python语言描述课件](https://img.taocdn.com/s3/m/0d97bea15727a5e9846a617c.png)
}
插入操作:Status InsertList( )
插入前的线性表:(a1,…,ai-1,ai,ai+1,…,an) 插入后的线性表:(a1,…,ai-1,b,ai,ai+1,…,an)
时间复杂度:最坏和平均的情况O(n) 逻辑关系发生了变化
– LocateElem( L, e, compare() ) //定位函数
• 初始条件:线性表L已存在,e为给定值,
•
compare()是元素判定函数。
• 操作结果:返回第1个与e满足compare关系的元素 的位序。
• //加工型操作:&L !!!
• ClearList( &L ) //线性表置空
– 方法:只要从LB中依次取出每个数据元素,并依值在 LA中进行查访,若不存在,则插入。
线性表类型的应用——求集合的并集
void unionSet(List &La, List Lb){
La_len = ListLength(La); Lb_len = ListLength(Lb);
for(i = 1; i <= Lb_len; i++){ GetElem(Lb, i, e); if(!LocateElem(La, e, EQUAL)) InsertList(La, ++La_len, e);
• 线性表的顺序表示和实现
• 线性表的链式表示和实现
线性表的顺序表示
• 是指用一组地址连续的存储单元依次存放线性表 的数据元素
以元素在计算机内“物理位置相邻”来表示线性表中数 据元素之间的逻辑相邻
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
typedef struct LNode { ElemType data; struct LNode *next; } LNode, *LinkList; LinkList L;
next
// 数据域 // 指针域
// L 为单链表的头指针
单链表的操作
void ListInit(LinkList &L){ //初始化 L=(LNode *)malloc(sizeof(LNode)); L->next=NULL; }
L
单链表的遍历
L a1 a2 a3 a4 a5 ∧
p=L->next; while(p!=NULL){ 第p指向的结点操作; p=p->next; //指针前行 }
确定链表中的第i个元素位置
L a1 a2 a3
j=0;
a4
a5 ∧
p=L->next; j=1; //可替换为:p=L; while(p!=NULL && j<i){ p=p->next; j++ } if (p!=NULL) 对第i个结点操作; else 第i个结点不存在;
}
算法时间复杂度:O(ListLength(L))
void CreateList_L(LinkList &L, int n) { // 逆序输入n 个数据元素,建立带头结点的单链表 // 先建立一个带头结点的单链表 L = (LinkList) malloc (sizeof (LNode)); L->next = NULL; for (i = n; i > 0; --i) { p = (LinkList) malloc (sizeof (LNode)); scanf(&p->data); // 输入元素值 p->next = L->next; L->next = p; // 插入L之后 }
//取得第i个元素
}
算法时间复杂度为:O(ListLength(L))
Status ListInsert_L(LinkList &L, int i, ElemType e){ // L 为带头结点的单链表的头指针,在第i 个结点之前插入元素e //确定第i-1个元素的位置 p = L; j = 0; while (p && j < i-1) { p = p->next; ++j; } if (!p || j > i-1) return ERROR; 生成结点插入在p之后; return OK;
ai-1 s e
ai
删除指针p指向的结点
q = p->next; p->next = q->next; e = q->data; free(q);
p ai-1
q ai ai+1
void ClearList(&L) { // 将单链表重新置为一个空表 while (L->next) { p=L->next; L->next=p->next; free(p); }
}
算法的时间复杂度为: O(ListLength(L))
生成结点插入在p之后
// 生成新结点 s = (LinkNode *) malloc ( sizeof (LNode)); s->data = e; s->next = p->next; p->next = s; //先连后! //再改前!
p
ai-1 p
ai
ai+1
双向循环链表
空表
非空表
a1
a2 … ...
an
a2 … ...
data next
an
// 数据域 // 指向前驱的指针域 // 指向后继的指针域
双向链表的插入
s->next = p->next; p->next = s; s->next->prior = s; s->prior = p;
p
ai-1 e s ai
双向链表的删除
p->next = p->next->next; p->next->prior = p;
线性表的链式存储
链式存储
• 用一组地址任意的存储单元存放线性表中的数据 元素,结点动态生成,利用指示元素位置的指针 表示逻辑关系 • 几种形式:
– 单链表、循环链表、双向链表、双向循环链表
单链表
• 每个结点包括数据域和指向链表 ∧
头结点
首元素结点
单链表的表示
Status GetElem_L(LinkList L, int i, ElemType &e){ // L是带头结点的链表的头指针,以e 返回第i 个元素 // 确定第i个元素的位置 p = L->next; j = 1; while (p && j<i) { p = p->next; ++j; } if ( !p || j>i ) return ERROR; e = p->data; return OK; // 第i个元素不存在
}
算法的时间复杂度为: O(Listlength(L))
循环链表
a1
a2
… ... an
• 和单链表在搜索操作上的差别:
– 单链表:while ( p!=NULL ) {…}
– 循环链表:while ( p!=L ) {…}
双向链表
a1
prior
typedef struct DuLNode { ElemType data; struct DuLNode *prior; struct DuLNode *next; } DuLNode, *DuLinkList;