数据结构第二章 线性表part7

合集下载

数据结构2线性表

数据结构2线性表
例:在顺序表{12,15,33,45,67,89, 57,78}的第三个元素处插入元素44。
12 15 33 45 67 89 57 78 01234567
44
整理ppt
15
程序实现
Templet <class type> int Seqlist<type> ::Insert(type &x, int i){ If(i<0||i>last+1||last==MaxSize-1) return 0; //procondition校验 Else{ last++; for(int j=last;j>i;j--)data[j]=data[j-1]; data[i]=x; //插入 return 1;
整理ppt
10
顺序表上实现的基本运算
1.查找 例:在顺序表{12,15,33,45,67,89,
57,78}查找57(找到),查找66(找 不到)。
12 15 33 45 67 89 57 78
01234567
整理ppt
11
程序实现
Templet <class type> int Seqlist<type>
➢ 在非空的线性表,有且仅有一个开始结
点a1,它没有直接前趋,而仅有一个直 接后继a2;
➢ 有且仅有一个终端结点an,它没有直接 后继,而仅有一个直接前趋a n-1;
➢ 其余的内部结点ai(2≦i≦n-1)都有且仅有 一个直接前趋a i-1和一个直接后继a i+1
整理ppt
5
线性表的特点
线性表 的逻辑结构:线性结构 数据的运算是定义在逻辑结构上的。 运算的具体实现则是在(物理)存储

《数据结构》课件第二章

《数据结构》课件第二章

线性表的基本操作(逻辑)
➢ 构造一个空表L ➢ 获取L的长度(即元素个数) ➢ 访问L中第i个数据元素的值 ➢ 访问L中第i个数据元素的前驱/后继的值 ➢ 在L中第i个元素之前插入新的元素e ➢ 删除L的第i个数据元素
➢ 注意在插入或者删除之后,线性表的长度应 能随之改变
一 顺序存储
➢ 线性表的顺序表示:用一组地址连续的存储单 元依次存储线性表的数据元素。

将Temp_b插入到 LC的第k个位置上
Temp_a ≤ Temp_b
是 将Temp_a插入到 LC的第k个位置上
否 i ≤ LA.len 否
j← j + 1
i← i + 1
j ≤ LB.len
Temp_a = Temp_b



j← j + 1
k← k + 1
结束

将LA表的第i个元 素插入到LC表的
插入操作的时间复杂度 O(n/2) 链表中的插入、删除操作没有上溢的情况, 并且节省内存资源
思考:若现已知道指向某元素节点的指针 p,希望能在该节点之前插入元素x,该如 何操作?其算法时间复杂度是多少?
3) 单链表的删除
p
删除第i个元素,由e返回值 删除b
a
Hale Waihona Puke bc … 1) 寻找第i-1个结点
2) 保留结点b的地址
9 SHI 5
0
1
1 ZHAO 2
2 QIAN 3
3 SUN 4
4 LI
9
5 ZHOU 6
6 WU 8
7 ZHENG 8
8 WANG 0
9 SHI 5
i=s[i].cur 指针后移

《数据结构》--第二章线性表

《数据结构》--第二章线性表

《数据结构》--第二章线性表《数据结构》第二章线性表在计算机科学中,数据结构是一门非常重要的基础课程,它为我们有效地组织和管理数据提供了理论和方法。

而在数据结构的众多内容中,线性表是一个关键且基础的概念。

线性表,简单来说,就像是一排整齐排列的元素。

这些元素按照一定的顺序依次排列,每个元素都有其特定的位置。

想象一下排队买奶茶的人群,从第一个人到最后一个人,就形成了一个线性的队列,这就是一种线性表的形象体现。

线性表具有一些显著的特点。

首先,它的元素个数是有限的。

就像排队买奶茶的队伍,长度不可能是无限的。

其次,元素具有相同的数据类型。

比如在一个记录学生成绩的线性表中,每个元素都是学生的成绩数据。

再者,元素之间是顺序排列的,有先后之分。

从存储结构上来看,线性表可以分为顺序存储和链式存储两种。

顺序存储的线性表,就好比是把一系列物品紧密地摆放在一个连续的空间里。

比如,我们可以把一系列数字存储在一个连续的数组中。

这种存储方式的优点是可以随机访问,也就是说,如果我们想获取第 5 个元素,直接通过计算就可以快速得到。

但它也有缺点,那就是插入和删除操作比较麻烦。

当我们要在中间插入一个新元素时,可能需要移动后面的一系列元素来腾出位置;删除一个元素时,又需要把后面的元素向前移动来填补空缺。

相比之下,链式存储的线性表就灵活得多。

它就像是一串珍珠,每个珍珠(节点)通过一根线(指针)与下一个珍珠相连。

每个节点包含数据域和指针域,数据域用来存放数据,指针域则指向链表中的下一个节点。

链式存储的优点是插入和删除操作比较方便,只需要修改相关节点的指针即可。

但它的缺点是不能随机访问,要找到特定位置的元素,需要从链表的头开始逐个遍历。

线性表在实际应用中无处不在。

比如,我们的通讯录就是一个线性表,按照联系人的添加顺序依次排列。

操作系统中的任务队列也是线性表,任务按照先后顺序等待被执行。

在编程实现线性表时,我们需要根据具体的需求来选择合适的存储方式。

数据结构第2章线性表

数据结构第2章线性表
线性结构的定义:
若结构是非空有限集,则有且仅有一个开始结点和一个 终端结点,并且所有结点都最多只有一个直接前趋和一个直 接后继。 →可表示为:(a1 , a2 , ……, an) 特点① 只有一个首结点和尾结点; 特点② 除首尾结点外,其他结点只有一个直接前驱和一个
直接后继。
简言之,线性结构反映结点间的逻辑关系是 一对一 (1:1) 的。
班级
012002009524 刘禹圻 男
18
2002级计科0201班
012002009613 武 锐 男
18
2002级计科0202班
012002009710 彭 隽 男 012002009801 郭 芳 女
17
2002级计科0203班
18
2002级计科0204班
012002009904 张珍珍 女
18
n--;
// 表长减1
整理ppt
11
删除顺序表中某个指定的元素的示意图如下:
1 12 2 13 3 21 4 24 5 25 6 28 7 30 8 42 9 77
1 12 2 13 3 21 4 24 5 28 6 30 7 42 8 77
整理ppt
12
2.2.3 顺序表的运算效率分析
时间效率分析:
顺序存储方法:用一组地址连续的存储单元依次 存储线性表的元素。
可以利用数组V[n]来实现。
注意:在C语言中数组的下标是从0开始,即: V[n]的有效范围是从 V[0]~V[n-1]
整理ppt
4
线性表顺序存储特点: 1. 逻辑上相邻的数据元素,其物理上也相邻;
2. 若已知表中首元素在存储器中的位置,则其他元 素存放位置亦可求出(利用数组V[n]的下标)。

《数据结构》第2章线性表的学习总结

《数据结构》第2章线性表的学习总结

《数据结构》第2章线性表的学习总结《数据结构》第2章-线性表 我刚刚开始第⼆章学习时候,对线性表的了解特别模糊,只是对数组(线性表的推⼴,它的数据元素是⼀个线性表)⽐较熟悉,所以就开始对这⼀章内容的学习和探索。

通过⽼师由浅及深的引导,总算在学习中清楚了许多。

 其中包括两⼤内容:线性表的顺序表⽰和实现、线性表的链式表⽰和实现。

⼀、顺序表 顺序表≠数组,数组只是其中⼀部分,在这⾥⽼师谈到栈和堆,我感兴趣就记了下来,作为备忘。

⼀般定义⼀个数组是在main函数⾥⾯,是⼀个局部变量,局部变量在物理空间上被分配到栈中,⽽栈空间⼩(1M-2M),以最⼤计算 2M = 2*1024*1024bytesint类型为4个字节,这样数组最多也就50万个数据左右,如果数组申请空间太⼤,就会出现栈溢出,程序崩溃。

那如果真需要开⼀个超⼤数组,如何解决这个情况呢?这时就要使⽤“堆”的空间了,对空间⽐栈⼤得多,⼀个100万个数据的数组都可以做到,我们有 2个⽅法,⼀是定义为全局变量,⼆是动态申请数组空间#include<iostream>using namespace std;int main(){int *a;a=new int[所需数组长度]; ... delete a; return0;}这两种分配物理内存都在“堆”,所以可以开超⼤数组。

(相关博客链接:)顺序表能够实现随机存取,在取值的时间复杂度都是O(1),查找(时间耗费在⽐较上)、插⼊删除(时间耗费在移动元素)是O(n)。

⼆、链式表(线性链表/单链表) 我觉得链式表的学习⽐顺序表难,主要就是在各个指针的指向,它的每个结点包含有下个结点的指针域,⼀个链表⼀般都有头指针、头结点、⾸元结点,这三个开始我不太明⽩其作⽤,很容易混淆,后来观察⼏个例题,画⼀下图,才慢慢理清思路。

从链式表基本操作开始,我就感觉怎么这么抽象,实际操作起来好像不是很简单,它的存储结构是链式的,通过指针把表串起来,不跟顺序结构⼀样是⼀⽚连续的区域,逻辑很清晰。

数据结构第2章

数据结构第2章

ListDelete(&L,i,&e) 初始条件:线性表L已存在且非空,
1≤i≤ListLength(L)。 操作结果:删除L的第i个数据元素,并用e返回其
值,L的长度减1。 GetElem(L,i,&e)
初始条件:线性表L已存在,1≤i≤ListLength(L)。 操作结果:用e返回L中第i个数据元素的值。
2020年5月22日星期五
算法2.1的时间复杂度取决于抽象数据类型List定 义中基本操作的执行时间。假设GetElem、 ListLength和ListDelete这3个基本操作的执行时间 和表长无关,则算法的时间复杂度为 O(ListLength(L))。
要存储线性表,至少要保存两类信息: (1)线性表中的数据元素。 (2)线性表中数据元素的顺序关系。
(a1,…,ai-1,ai,ai+1,…,an)
2020年5月22日星期五
2020年5月22日星期五
线性表具有如下特性:
(1)不同线性表中数据元素的类型可以是各种各样的, 但同一线性表中的元素必须是同一类型的。
(2)在表中ai-1领先于ai,ai领先于ai+1,称ai-1是 ai的直接前驱,ai+1是ai的直接后继。
}ADT List 以上仅列出了线性表的一组最基本的操作。对于实
际应用中所涉及到的其他更复杂的操作,可以用基本操 作的组合来实现。
2020年5月22日星期五
【例2-1】已知线性表L中的元素按元素值非递减 有序排列,编写一个函数删除线性表中多余的值相同 的元素。例如,设
L=(1,3,3,5,9,13,13,13,17,21) 执行过函数后,则
2.1.2 线性表的抽象数据类型
线性表的抽象数据类型可以由数据对象、数据 关系及基本操作3个要素来定义。定义如下: ADT List{ 数据对象:D={ai |ai∈ElemSet,i=1,2,…,n,n≥1} 数据关系:R1={<ai-1 ,ai>|ai-1 ,ai∈D,i=2,…,n} 基本操作: InitList(&L)

数据结构--线性表

数据结构--线性表

2020/4/7
14
2.3.1单链表
2020/4/7
15
2.3.1单链表
单链表的基本操作算法
查找运算
按序号查找 按值查找
插入运算
结点插入到链表的第一个结点前 结点插入到两个结点之间 结点插入到链表的最后一个结点后
删除运算
2020/4/7
16
2.3.1单链表
按序号查找 算法描述:设带头结点的单链表的头指针为L,要查
3
2.1 线性表的基本概念
线性表基本运算 初始化运算InitList(L) 求表长运算ListLength(L) 元素定位运算 LocateElem(L,x) 取元素运算GetElem(L,i,e) 插入运算ListInsert(L,i,x) 删除运算ListDelete(L,i,e) 遍历运算ListTraverse(L)
第2章 线性表
本章的基本内容是:
线性表的逻辑结构 线性表的顺序存储 线性表的链式存储 顺序表和链表的比较
2020/4/7
1
2.1 线性表的基本概念
线性表(Linear List): 是由n(n≥0)个类型相同的数据元素组成的 有限序列,记为(a1,a2,a3,…,an)。
a1
a2
a3
a4
next
2020/4/7
13
2.3.1单链表
上图所示为线性表(Sun,Mon,Tue,Wed,Thu, Fri,Sat)的线性链式存储结构。这种链表有一个头 指针(H),如果线性表非空,H指向链表中第一个结 点,否则它为空指针(即不指向任何结点的指针,通 常用NULL或∧表示)。由于最后一个结点设有直接后 继,所以它的指针域为空。
d
Loc(a1)

数据结构 课件 第2章线性表 原创力文档

数据结构 课件 第2章线性表 原创力文档

数据结构课件第2章线性表原创力文档线性表是计算机科学中经常使用的一种基本数据结构。

它的定义是指由一系列元素(有序)构成的有限序列,它的基本特征是存储元素有序可重复,其大小受限。

线性表可以用于存储大量类似或者相关的数据,并且支持高效的查找、遍历、访问、插入和删除操作。

线性表可以分为两种,即顺序存储结构和链式存储结构。

顺序存储结构是指将元素序列存储在一组连续的存储空间中,元素紧凑地存储在一起,方便统一管理,但是插入和删除操作效率不高。

而链式存储结构是指以数据元素节点为基本单位,以链表的形式组织起来的数据结构。

它可以采用动态分配的存储空间,使在插入和删除操作的效率更高。

线性表的应用十分广泛,它可以用于存储数据,进行算法表示等。

例如,它可以在字符串和图形处理中用来存储字符或像素点,用于搜索和排序操作,以及时间复杂度分析等。

无论是在计算机科学中,还是在实际工程应用中,线性表都有着重要的作用。

线性表的基本操作是插入、删除、查找和修改。

这四种操作都是基本的数据结构操作,其中插入、删除操作可以在表的任意位置进行,而查找和修改操作则需要先找到指定元素的地址。

线性表的特殊操作也包括求表长、求表中最大、最小值、求前驱、后继元素等操作。

线性表是一种非常有用的数据结构,它可以用在许多不同的地方,例如计算机科学中的图像处理、多媒体处理、数据库管理等,也可以用于实际的应用领域中的自动控制、工程计算、规划计算和解决问题等。

因此,学习和使用线性表是解决计算机问题的重要一步。

综上所述,线性表是一种基本的数据结构,有着广泛的应用,极其方便。

要想更好地了解线性表,需要掌握最基本的概念、基本操作以及特殊操作,以及应用该数据结构的知识。

深入地学习和使用线性表有助于解决大量实际问题,为实现自动化和信息管理提供重要支持。

数据结构讲义第2章-线性表

数据结构讲义第2章-线性表

t个单元
a1 a2 ai-1 ai ai+1 an
2.2 线性表的顺序存储和实现
线性表的顺序存储结构——顺序表 一 线性表的顺序存储结构 顺序表
顺序表的定义: 一维数组+表长
例1: 写出线性表(6,17,28,50,92,188)的顺序 存储结构表示。 # define ListSize 100 typedef int ElemType; ElemType List[ListSize]; int length;
思考:采用其它的定义如何初始化空表?
2.2 线性表的顺序存储和实现
三 顺序表应用举例
1. 设有两个按元素值递增有序排列的顺序表A和B,请编写算法将A 和B归并成一个按元素值递增有序排列的线性表C。 void merge(SeqList A,SeqList B,SeqList &C) {i=0;j=0;k=0; while ( i<A.length && j<B.length ) if (A.data[i]<B.data[j]) C.data[k++]=A.data[i++]; else C.data[k++]=B.data[j++]; while (i<A.length ) C.data[k++]= A.data[i++]; while (j<B.length ) C.data[k++]=B.data[j++]; C.length=k; }
调用示例: main() {SeqList L; ElemType e; ... delete_ListSq(L,2,e); ... }

数据结构第二章

数据结构第二章
L.elem[j] = L.elem[j+1]; --L.1ength; //表长减1 }// ListDelete_Sq
数据结构
17/58
插入/删除操作时间复杂度分析
第2章 线性表
基本操作:移动元素操作
n1
插入操作移动元素次数的期望值 Eis pi (n i 1) i 1
删除操作移动元素次数的期望值
GetElem(L, i, &e) 求表L中的第i个元素,结果由e返回;
ListInsert(&L, i, x) 在线性表中第i个元素之后(或之前) 插入一个新元素x;
ListDelete(&L, i, &e) 删除线性表中的第i个元素;
……
}ADT List
数据结构
5/58
第2章 线性表
利用上面的基本操作,还可以进行一些更复杂的操作,例如:
数据结构
1/58
基本内容
第2章 线性表
一、线性表的定义 二、线性表的顺序表示与实现 三、线性表的链式表示与实现 四、一元多项式的表示及相加 五、本章小结
数据结构
2/58
一、线性表的定义
第2章 线性表
线性结构的特点:在数据元素的非空有限集中
(1)存在惟一的一个被称作“第一个”的数据元素;
(2)存在惟一的一个被称作“最后一个”的数据元素;
n
Edl qi (n i)
i 1
等概率情况下(
pi
1 n 1
,
1 qi n
)
Eis
1 n 1
n1 i 1
(n i
1)
n 2
Edl
1 n
n i 1
(n i)

数据结构第二章线性表

数据结构第二章线性表
线性表的顺序存储结构可用数组来实现。
线性表的顺序存储结构可用数组来实现。 数组元素的类型就是线性表中数据元素 的类型,数组的大小,最好大于线性表 的长度。因此,顺序存储结构是把线性 表中每个元素a1, a2, a3, …, an依次存放到数 组下标为0, 1, 2,…, n1的位置上。
假设用数组data[MAXSIZE]存储线性 表 A =(a1, a2, a3, …, an) 其顺序存储结构如图2.1所示。
➢2.2.1 线性表的顺序存储结构 ➢2.2.2 顺序表的基本运算 ➢2.2.3 插入和删除运算的时间分析 ➢2.2.4 顺序表的优点和缺点
2.2.1 线性表的顺序存储结构
线性表的顺序存储方法是:将线性表的所有元素 按其逻辑顺序依次存放在内存中一组连续的存储 单元中,也就是将线性表的所有元素连续地存放 到计算机中相邻的内存单元中,以保证线性表元 素逻辑上的有序性。 顺序表的特点是:其逻辑关系相邻的两个结点在 物理位置上也相邻,结点的逻辑次序和物理次序 一致。
图2.1 顺序存储结构示意图
由于线性表中所有结点的数据类型是相同 的,因此每个结点占用的存储空间也是
相同的。假设每个结点占用d个存储单元,
若 线 性 表 中 第 一 个 结 点 a1 的 存 储 地 址 为 LOC(a1) , 那 么 结 点 ai 的 存 储 地 址 LOC(ai) 可以通过下面的公式计算得到:
【例2.3】学生成绩统计表也是一个线性表, 见表2.1。在线性表中每个学生的成绩是
一个数据元素,它由学号、姓名、数学、 外语、物理、总分这6个数据项组成。该 线性表的长度为5。
学号 1 2 3 4 5
姓名 李华 王放 张利 田勇 成惠
表 2.1 某班学生成绩统计表

数据结构(第二章 线性表)

数据结构(第二章 线性表)

2.2 线性表的顺序存储和实现
顺序表-顺序表定义

由上可知,数据的存储逻辑位置由数组的下标决定。 所以相邻的元素之间地址的计算公式为(假设每个数 据元素占有d个存储单元): LOC(ai)=LOC(ai-1)+d 对线性表的所有数据元素,假设已知第一个数据元 素a0的地址为LOC(a0) ,每个结点占有d个存储 单元, 则第i个数据元素ai的地址为: LOC(ai)=LOC(a0)+i*d 线性表的第一个数据元素的位置通常称做起始位置 或基地址。 在使用一维数组时,数组的下标起始位置根据给定 的问题确定,或者根据实际的高级语言的规定确定。
2.1 线性表抽象数据类型
线性表的分类
顺序存储结构 (元素连续存储、 随机存取结构) 线性表 ADT 链式存储结构 (元素分散存储) 继承 顺序表类 排序顺序表类 继承 单链表类 循环单链表 双链表 继承 排序循环双链表类 排序单链表类

单链表
双链表

循环双链表类
线性表的存储结构
2.2 线性表的顺序存储和实现
线性表的基本操作 求长度:求线性表的数据元素个数。 访问:对线性表中指定位置的数据元素进行存取、替 换等操作。 插入:在线性表指定位置上,插入一个新的数据元素, 插入后仍为一个线性表。 删除:删除线性表指定位置的数据元素,同时保证更 改后的线性表仍然具有线性表的连续性。 复制:重新复制一个线性表。 合并:将两个或两个以上的线性表合并起来,形成一 个新的线性表。 查找:在线性表中查找满足某种条件的数据元素。 排序:对线性表中的数据元素按关键字值,以递增或 递减的次序进行排列。 遍历:按次序访问线性表中的所有数据元素,并且每 个数据元素恰好访问一次。

第二章线性表

第二章线性表

//最后元素在数组中的位置(下标值)
} SeqList;
其中elem数组的第 i 个分量为线性表第 i 个 数据元素的存储映像。注意区分元素的序号和 数组的下标,如a1的序号为1,而其对应的数组 下标为0。last 指最后一个数据元素在数组空间 中的位置。空表last置为-1
#define LIST_INIT_SIZE 100//线性存储空间 的初始分配量 #define LISTINCREMENT 10//线性表存储空 间的分配增量
内存空间状态
a1 a2

ai

an
逻辑地址
1 2

i

n
...
loc(a1)+(maxlen-1)k
顺序存储结构的C语言定义
#define maxsize=线性表可能达到的最大长度;
typedef struct
{ ElemType elem[maxsize]; // 线性表占用的数组空间
int last;
若没有与e相等的元素,则返回值为0。 Traverse(L,visit( )) 依次对L的每个元素调用函数
visit( )。一旦visit( )失败,则操作失败。
加工型操作
Clear(L) 将L置为空表。 Put(L, i, e ) 将e的值赋给L的 i号元素。
(1≤i≤Length(L) ) InsList(L,i,e) 在L的i号元素(1≤i≤Length(L)+1)
注:这里的数据元素ai(1≤i≤n)只是一个抽象的 符号,其具体含义在不同的情况下各不相同。
例1 26个英文字母组成的字母表: (A,B,C、…、Z)
例2 某校从1978年到1983年各种型 号的计算机拥有量的变化情况:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设m<n,则两个多项式相加的结果
Rn ( x)= Pn ( x)+ Qm(x)
可用线性表R表示
R=( p0+q0 , p1+q1, p2+q2 , …, pm+qm, pm+1, …, pn)
在通常应用中,多项式的次数很高且变化很大, 使得顺序存储结构的最大长度很难确定,特别是在 处理形如
S(x) = 1 + 3x10000 – 2x20000
⑷ 表的规模易扩充。
在实际应用中采用哪一种存储结构更合适?
对这个问题不能一概而论,这涉及到不同实现方法的选 择问题。一般而言,对存储结构的选择应从以下几条区别: ⑴ 应有利于基本运算的实现。因为运算的具体实现以存 储结构的确定为前提,存储结构在一定程度上、一定范围内 决定了运算的实现是否方便、高效; ⑵ 应有利于数据的特性。除了数据的逻辑性外,其他的 诸如数据规模也应在选择存储结构时加以考虑;
六、有序表类型
ADT Ordered_List { 数据对象: S = { xi|xi OrderedSet , i=1,2,…,n, n≥0 }
数据关系:R = {<xi-1, xi> | xi-1, xi S,
集合中 任意两个 元素之间 均可以 进行比较
xi-1≤ xi, i=2,3,…,n }
双向链表的操作特点:
有些操作如:ListLength、GetElem、和 LocateElem等仅需涉及一个方向的指针,所 以和单链表相同。
“插入”和“删除”时需要同时修改 两个方向上的指针。
插入
p
ai-1
e s s->next = p->next; s->next->prior = s;
ai
p->next = s; s->prior = p;
静态链表示例
0 1 2 3 4 5 ZHAO QIAN SUN LI 1 2 3 4 5 0 1 1
ZHAO
QIAN SUN LI ZHOU WU ZHENG
2
3 4 9 6 8 8
2
3 4 5 6 7 8
ZHOU
WU ZHENG
6
7 8
6
7 8
WANG
0
WANG
SHI
0
5
9 10
9 10
原始状态
假设S为SLinkList型的变量,则S[0].cur指示第 一个结点在数组中的位置。
若设i=S[0].cur,则S[i].data存储线性表的第一 个元素,且S[i].cur指示第二个结点在数组中的位置。 一般情况,若第i个分量表示链表的第k个结点, 则S[i].cur指示第k+1个结点的位置。 因此,在静态链表中实现线性表的操作和动态 链表相似,以整型游标i代替动态指针p,i= S[i].cur 的操作为指针后移(类似于p=p->next)。
InitList(LA); La_len = ListLength(La); Lb_len =ListLength(Lb); // 求线性表的长度
for (i = 1; i <= Lb_len; i++) {
GetElem(Lb, i, e);
// 取Lb中第i个数据元素赋给 e
if (ListEmpty(La) || !equal (en, e)) { ListInsert(La, ++La_len, e);
Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e) {
// 删除带头结点的双向循环链表L中第i 个元素 // i的合法值为 1≤i ≤表长+1。
if (!(p=GetElem_DuL(L,i))) // 第i 个元素的位置指针p return ERROR; // p=NULL,即第i个元素不存在 E=p->data; // 存储空间分配失败 p-> prior ->next = p->next; p->next->prior= p->prior; free(p); Return OK; 算法的时间复杂度为: } // ListDelete_DuL O(ListLength(L))
基本操作:
… …
Compare是一个
有序判定函数
LocateElem( L, e, &q, int(*compare)(ElemType,ElemType) )
初始条件:有序表L已存在。 操作结果:若有序表L中存在元素e,则q指示L中
第一个值为e 的元素的位置,并返回函 数值TRUE;否则q 指示第一个大于e 的元素的前驱的位置,并返回函数值 FALSE。
0≤ e1 < e2 < ┄ < em = n
可用一个长度为m且每个元素有两个数据项 (系数项和指数项)的线性表表示:
((p1, e1), (p2, e2), ……, (pm,em) )
例如:
P999(x) = 7x3 - 2x12 - 8x999
可用线性表
( (7, 3), (-2, 12), (-8, 999) )
的一元稀疏多项式时,就要用一长度为20001的线 性表来表示,表中仅有三个非零元素,这种对内存 空间的浪费是应该避免的。 如果只存储非零系数项,则显然必须同时存储 相应的指数。
一般情况下的一元稀疏多项式可写成
Pn(x) = p1xe1 + p2xe2 + ┄ + pmxem
其中:pi 是指数为ei 的项的非零系数,
⑵若求两个多项式之和,采用链式存储 结构为宜。
多项式选择顺序存储结构:
#define maxlen maxsize; typedef struct // 定义结点类型 { float coef; // 系数域 int exp; // 指数域 } elemtp; typedef struct { elemtp vec[maxlen];
③ 程序设计语言
这主要是指依据某种高级语言是否提供指针类型或者 依据实际需要决定存储结构是选用静态链表还是动态链表。 总之,线性表的顺序实现和链式实现各有优缺点,是 无法笼统地认定哪种优,哪种劣。只能根据实际问题的具 体实现需要,对各方面的优缺点加以综合平衡来确定适宜 的存储结构。
在数学上,一元n次多项式
会产生溢出。对于存储空间的考虑也可以存储密度的大小
来衡量。其中存储密度的大小定义为一个结点数据本身所 占用的存储量与结点结构所占用的存储量的比值。一般地, 存储密度越大,存储空间的利用率就越高。显然,顺序表 的存储密度为1,而链式存储结构的存储密度则小于1。
② 运算时间
顺序存储结构是一种随机存取的结构,便于元素的随机 访问。即表中任一元素都可在O(1)时间复杂度情况下迅速而 直接地存取。而链式存储结构,必须从头指针开始顺着链扫 描才能取得,一般情况下其时间复杂度为O(n),所以对于那 些只进行查找运算而很少做插入和删除等的运算,宜采用顺 序存储结构。但在顺序表中进行元素的插入和删除运算时, 需移动大量元素,平均要移动约半数的元素。尤其是当表中 每个元素的信息量较复杂时所花费的时间就更为可观。而采 用链式存储结构,由于进行元素的插入或删除,只需修改指 针并结合一定的查找。所以,对于那些需要经常频繁地进行 元素的插入和删除运算的线性表,其存储结构应采用链式存 储结构。
⑶ 应有利于软件环境。数据的存放方式对存储结构有不 同的要求,所以应依据情况适当选择存储结构。具体而言, 即应主要从存储空间、运算时间、程序设计语言三方面考虑。 即
① 存储空间
顺序表要求预先分配存储空间,一般在程序执行之前
是难以估计存储空间大小,估计过大会造成浪费,估计过
小又会产生空间溢出。而链式存储结构的存储空间是动态 分配,只要内存空间有空间,就可动态申请内存空间,不
静态链表中定位函数LocateElem的实现
int LocateElem_SL(SLinkList S,ElemType e) {
//在静态单链线性表L中查找第1个值为e的元素。 //若找到,则返回它在L中的位序; 否则返回0。
i=S[0].cur; // i 指示表中第一个结点 while (i&&S[i].data!=e) i=S[i].cur;
插入“SHI”和删除 “ZHENG”
如上描述的链表中,数组的一个分量表示一 个结点,同时用游标(指示器cur)代替指针指示 结点在数组中的位置。数组的第零分量可看成头 结点,其指针域指示链表的第一个结点。 这种存储结构仍需要预先分配一个较大的存 储空间,但在作线性表的插入和删除操作时不需 移动元素,仅需修改指针,故仍具有链式存储结 构的主要优点。 为了和指针型描述的线性链表相区别,我们 给这种用数组描述的链表起名为静态链表。
if (!(p=GetElem_DuL(L,i))) // 第i 个元素的位置指针p return ERROR; // p=NULL,即第i个元素不存在 if (!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; // 存储空间分配失败 S->data=e; s-> prior = p-> prior; p-> prior ->next = s; s->next= s; p->prior = s; return OK; 算法的时间复杂度为: } // ListInsert_DuL O(ListLength(L))
删除
ai-1
p
ai
ai+1
p->next = p->next->next; p->next->prior = p;
相关文档
最新文档