第2章线性表1(顺序表)

合集下载

数据结构习题及答案与实验指导(线性表)2

数据结构习题及答案与实验指导(线性表)2

第2章线性表线性表是一种最基本、最常用的数据结构,它有两种存储结构——顺序表和链表。

本章主要介绍线性表的定义、表示和基本运算的实现。

重点讨论了线性表的存储结构,以及在顺序、链式两种存储结构上基本运算的实现。

重点提示:●线性表的逻辑结构特征●线性表的顺序存储和链式存储两种存储结构的特点●在两种存储结构下基本操作的实现2-1 重点难点指导2-1-1 相关术语1.线性表线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,通常记为:(a1,a2,…,a n),其中n为表长,n=0时称为空表。

要点:一种逻辑结构,其数据元素属于相同数据类型,之间的关系是线性关系。

2.顺序表顺序存储的线性表。

要点:按线性表中的元素的逻辑顺序依次存放在地址连续的存储单元里,其存储特点:用物理上的相邻实现逻辑上的相邻。

3.链表用链表存储的线性表。

要点:链表是通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的,对每个结点的地址是否连续没有要求。

4.单链表每个结点除了数据域外还有一个指向其后继的指针域。

要点:通常将每个元素的值和其直接后继的地址作为一个结点,通过每个结点中指向后继结点的指针表示线性表的逻辑结构。

5.头指针要点:头指针是一个指针变量,里面存放的是链表中首结点的地址,并以此来标识一个链表。

如链表H,链表L等,表示链表中第一个结点的地址存放在指针变量H、L中。

通常用头指针来惟一标识一个链表。

6.头结点要点:附加在第一个元素结点之前的一个结点,头指针指向头结点。

当该链表表示一个非空的线性表时,头结点的指针域指向第一个元素结点;为空表时,该指针域为空。

7.头结点的作用要点:其作用有两个,一是使对空表和非空表的处理得到统一;二是在链表的第一个位置上的操作和在其他位置上的操作一致,无需特殊处理。

2-1-2 线性表的顺序存储1.顺序表顺序存储的线性表称为顺序表。

其特点是:用一组地址连续的存储单元来依次存放线性表的数据元素,因此数据元素的逻辑顺序和物理次序一致(这是顺序存储的核心所在)。

第二章 线性表

第二章 线性表

(7)已知顺序表L中的元素有序递增,设计算法将元素x插入到L 种,并依旧保持其有序递增;设计一个高效的算法,删除顺序表 中所有值为x的元素,要求空间复杂度为O(1)。(基于顺序表基本 操作的运算) (8)(2010年13分)设将n(n>1)个整数存放到一维数组R中。试 设计一个在时间和空间两方面尽可能有效的算法,将R中保有的 序列循环左移P(0<p< n)个位置,即将R中的数据由(X0 X1 ……Xn-1)变换为(Xp Xp+1 ……Xn-1 X0 X1……Xp-1) 要求: (1)给出算法的基本设计思想。 (2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处 给出注释。 (3)说明你所设计算法的时间复杂度和空间复杂度
2 3 4 5 6
30 60 20 40
6 -1 3 1
h
10
20Βιβλιοθήκη 304050
60∧
8、例题: (1)链表不具有的特点是( )。 A.可随机访问任一元素 B.插入删除不需要移动元素 C.不必事先估计存储空间 D.所需空间与线性表长度成正比 (2)在具有n个结点的单链表中插入一个新结点并使链表仍然有 序的时间复杂度是( )。 A. O(1) B. O(n) C. O(nlog2n) D. O(n2) (3)对于由n个元素组成的线性表,创建一个有序单链表的时间 复杂度是( )。 A. O(1) B. O(n) C. O(nlog2n) D. O(n2)
(4)设A是一个线性表,采用顺序存储结构。在等概率情况下, 平均插入一个元素需要移动多少个元素?若元素插在ai和ai+1之 间的概率为(n-i)/n(n-1)/2,则平均插入一个元素需要移动多少 个元素? (5)以顺序表作为存储结构,实现线性表的就地逆置;判断回 文;设计一个时间复杂度为O(n)的算法,将顺序表中所有元素循 环左移k位;设计一个时间复杂度为O (n)的算法,将顺序表中所 有元素循环右移k位;(基于逆置操作的运算) (6)将顺序表中的元素调整为左右两部分,左边元素为奇数, 右边元素为偶数,要求算法的时间复杂度为O (n);将顺序表A拆 分为B 和C,其中B中的元素小于0,C中的元素大于0;将有序表A和 有序表B合并为C,合并后C依然是有序的。(基于对顺序表的拆分 和合并操作的运算)

最新数据结构李春葆 第2章 线性表讲解学习

最新数据结构李春葆 第2章  线性表讲解学习
该运算顺序查找第1个值域与e相等的元素的逻辑位序。若这样 的元素不存在,则返回值为0。
int LocateElem(SqList *L, ElemType e) { int i=0;
while (i<L->length && L->data[i]!=e) i++; if (i>=L->length) return 0; else return i+1; }
(3)判线性表是否为空表ListEmpty(L):若L为空表,则 返回真,否则返回假。
(4)求线性表的长度ListLength(L):返回L中元素个数。
(5)输出线性表DispList(L):当线性表L不为空时,顺序 显示L中各节点的值域。
(6)求线性表L中指定位置的某个数据元素 GetElem(L,i,&e):用e返回L中第 i(1≤i≤ListLength(L))个 元素的值。
地址 100 130 160 190 210
区号 010 021 027 029 025
城市名 Beijing Shanghai Wuhan Xian Nanjing
说明 首都 直辖市 湖北省省会 陕西省省会 江苏省省会
2.2.2 顺序表基本运算的实现
一旦采用顺序表存储结构,我们就可以用C/C++语言实 现线性表的各种基本运算。为了方便,假设ElemType为 char类型,使用如下自定义类型语句:
L->length=0;
0
}
返回到main()
后实参sq没有 sq
变化!!!
???
(2)使用引用的情况
main:
main()
{ SqList *sq;

算法与数据结构第2章 线性表

算法与数据结构第2章  线性表

利用已有基本运算求解问题 例2.1 假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员。编写一 个算法求一个新的集合C=A∪B,即将两个集合的并集放在线 性表LC中。 解题思路: LC LA LC LB中不在LA中的元素
void unionList(List LA,List LB,List &LC)
该运算返回L中第 i(1≤i≤ListLength(L))个元素的值,存放在e中。
e=L->data[i-1];
return 1; } 本算法的时间复杂度为O(1)。
(7) 按元素值查找LocateElem(L,e) 该运算顺序查找第1个值域与e相等的元素的位序。若这样的元 素不存在,则返回值为0。 int LocateElem(SqList *L, ElemType e) { int i=0; while (i<L->length && L->data[i]!=e) i++; if (i>=L->length) else } return i+1; return 0;
{ int lena,lenb,lenc,i; ElemType e; InitList(LC); lena=ListLength(LA); for (i=1;i<=lena;i++) //求线性表的长度
//将LA的所有元素插入到Lc中
{ GetElem(LA,i,e); ListInsert(LC,i,e);
0
返回到 sq Main:
???
main:
引用的作用 main() { SqList *sq; InitList(sq); op(sq);

2.1 线性表的类型定义1.线性表的定义 是由n(n=0)个数据元素a1.

2.1 线性表的类型定义1.线性表的定义 是由n(n=0)个数据元素a1.

18
20 21
健康
一般 健康
张立立
……..
790634
……..

…….
17
…….
神经衰弱
…….
3
• 注意:
(1)线性表中的所有数据元素的数据类型是一致的。 (2)数据元素在线性表中的位置只取决于它的序号。 (3)相邻数据元素之间存在着序偶关系。 (4)结点间的逻辑关系是线性的。
4
3.抽象数据类型线性表的定义如下:
11
(2)插入运算 在第i(1<=i<=n+1)个元素之前插入一个新的数据元素x。 使长度为n的线性表变为长度为n+1的线性表:
(a1,a2,…,ai-1,ai,…,an)
(a1,a2,…,ai-1,x, ai,…,an)
12

插入算法的思想:
1. 将线性表中的第i个至第n个数据元素后移一个位置(共需 移动n-i+1个数据元素),
1
2.线性表(a1,a2,a3, ……an)的特点:
在数据元素的非空有限集中, (1)存在唯一的一个被称为“第一个”的数据元素; (2)存在唯一的一个被称为“最后一个”的数据元素; (3)除第一个之外,集合中的每个数据元素均只有一个 前驱; (4)除最后一个外,集合中的每个数据元素均只有一个 后继。 线性表中的数据元素类型多种多样,但同一线性表 中的元素必定具有相同特性,在一些复杂的线性表中, 每一个数据元素又可以由若干个数据项组成,在这种情 况下,通常将数据元素称为记录(record)。
10
4.顺序表的几种基本运算
(1)初始化运算 Status InitList_Sq(Sqlist &L){ L.elem=(Elemtype *)malloc (LIST_INIT_SIZE*sizeof(Elemtype)); //分配内存单元 if (! L.elem) exit (OVERFLOW); //存储分配失败 L.Length=0; //空表长度为0 L.Listsize=LIST_INIT_SIZE; //初始存储容量 return OK; }//InitList_Sq

线性表的顺序存储结构

线性表的顺序存储结构
E is =

n +1 i =1
p i ( n i + 1)
1 不失一般性,若在线性表的任何位置插入元素都是等概率的,即 p i = 不失一般性,若在线性表的任何位置插入元素都是等概率的, , n + 1 上式可化简为: 上式可化简为: 1 n+1 n
Eis =
∑(n i +1) = 2 n +1
第二章 线性表
2.1 线性表的类型定义 2.2 线性表的顺序表示和实现
2.3 线性表的链式表示和实现
2.4 一元多项式的表示及相加
2.2 线性表的顺序表示和实现 线性表的顺序表示指的 是用一组地址连续的存储单 元依次存储线性表的数据元 素.
£2.2 线性表的顺序存储结构
(1)线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性 ) 表的数据元素.如下图2.1所示 所示: 表的数据元素.如下图 所示: 存储地址 b b+l … b+(i-1)l … b+(n-1)l b+nl … b+(maxlen-1)l 内存状态 a1 a2 … ai … an 空闲 数据元素在线性表中的位序 1 2 … i … n
// 为顺序表分配大小为 maxsize 的数组空间
if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = maxsize; return OK; 算法时间复杂度 O(1) 时间复杂度: 时间复杂度 } // InitList_Sq
(4)线性表的插入和删除运算 ) 序号 数据元素 1 2 3 4 5 6 7 8 12 13 21 24 28 30 42 77 (a) 序号 数据元素 1 2 3 4 5 6 7 8 9 12 13 21 24 25 28 30 42 77 (b) 序号 数据元素 1 2 3 4 5 6 7 8 12 13 21 24 28 30 42 77 (a) 序号 数据元素 1 2 3 4 5 6 7 12 13 21 28 30 42 77

吉林大学数据结构_第二章 线性表

吉林大学数据结构_第二章 线性表

如何找指定位置的结点?
• 与顺序表不同,单链表无法直接访问指定 位置的结点,而是需要从哨位结点开始, 沿着next指针逐个结点计数,直至到达指定 位置。
操作
• • • • 存取 查找 删除 插入
存取算法
算法Find(k.item) /*将链表中第k个结点的字段值赋给item*/ F1. [k合法?] IF (k<1) THEN (PRINT “存取位置不合法”. RETURN.) F2. [初始化] p←head. i ←0. F3. [找第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) item←data(p). ▍ 存取算法的时间复杂性分析。P30
插入算法
算法Insert(k,item) /*在链表中第k个结点后插入字段值为item的结点*/ I1.[k合法?] IF (k<0) THEN (PRINT “插入不合法”. RETURN) I2.[初始化] p←head. i ←0. I3.[p指向第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “插入不合法”. RETURN. ) I4.[插入] s<= AVAIL. data(s) ←item. next(s) ←next(p). next(p) ←s. ▍
删除算法
算法Delete(k.item) /*删除链表中第k个结点并将其字段值赋给item*/ D1.[k合法?] IF (k<1) THEN (PRINT “删除不合法”. RETURN.) D2.[初始化] p←head. i ←0. D3.[找第k-1结点] WHILE (p ≠NULL AND i<k-1) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) D4.[删除] q ← next(p). next(p) ← next(q) . item←data(q). AVAIL<=q.▍

《数据结构》课程课件第二章线性表

《数据结构》课程课件第二章线性表

Step2:数据域赋值
插入后: Step3:插入(连接)
X q
(1)式和(2)式的顺序颠倒,可以吗?
4、插入元素(在第i个元素之前插入元素e)
为什么时间复杂度不再是O(1)?
第i-1个元素
第i个元素
p
s
新插入元素
5、删除p所指元素的后继元素
P
删除前:
P->next P->next->next
删除:
五、线性表ADT的应用举例
Void mergelist(list La,list Lb,list &Lc)
{ //已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc中的元素也按值非递减排列
例: 将两个各有n个元素的有序表归并成一个有序表, 其最小的比较次数是( )。 A、n B、2n-1 C、2n D、n-1
三、线性表的ADT
四、线性表的分类
五、线性表ADT的应用举例
例1:已知有线性表L,要求删除所有X的出现
五、线性表ADT的应用举例
例2: 已知有两个分别有序的线性表(从小到大),要 求合并两个线性表,且合并后仍然有序。——归并 方法1: 合并,再排序O((m+n)2)
方法2: 归并,利用分别有序的特点O((m+n))
二、线性表上常见的运算
8、删除 Delete(L,i):删除线性表的第i个元素 删除前 a1 a2 … ai-1 ai ai+1 … an 删除后 a1 a2 … ai-1 ai+1 … an 9、判断是否为空 Empty(L):线性表空,则返回TRUE, 否则FALSE 10、输出线性表 Print(L):输出线性表的各个元素 11、其它操作 复制、分解、合并、分类等
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.线性表抽象数据类型
它包括两个方面: 数据集合:{ a0, a1, … , an-1 } ai的数据类型为 DataType 操作集合:(1)ListInitiate(L) 初始化线性表
(2)ListInsert(L,i,x) 插入数据元素 (3)ListLength(L) 求当前数据元素个数 (4)ListDelete(L,i,x) 删除数据元素 (5)ListGet(L,i,x) 取数据元素等
6
3.线性表的存储结构
(1)顺序存储结构:它是使用一片地址连续的有限内存单ห้องสมุดไป่ตู้元空间存储数据元素的一种计算机存储数据方法。
特点:(任意两个在逻辑上相邻的数据元素在物理位置 上也必然相邻)逻辑上相邻的元素,物理上也相邻。
(2)链式存储结构:它是把数据元素和指针定义成一个存 储体,使用指针把发生联系的数据元素链接起来的 一种计算机存储数据方法。
所有可能的元素移动次数合计: 0+1+…+n = n(n+1)/2
共有多少种插入形式?——连头带尾有n+1种!
故 插 入 时 的 平 均 移 动 次 数 为 : n(n+1)/2÷ ( n+1 ) = n/2≈O(n)
22
同理可证:顺序表删除一元素的时间效率为: T(n)=(n-1)/2 ≈O(n)
特点:任意两个在逻辑上相邻的数据元素在物理上不 一定相邻,数据元素的逻辑次序是通过链中的指针 链接实现的。
7
2.2 线性表的顺序表示和实现
一 、 顺序表的存储结构 二、 顺序表的实现 三、 顺序表的运算效率分析
8
一、 顺序表的存储结构表示 可以利用数组V[n]来实现
1、顺序表:用一组地址连续的存储单元依次存储线
元素存放位置亦可求出(利用数组V[n]的下标)。 设首元素a0的存放地址为LOC(a0)(称为首地址), 设每个元素占用存储空间(地址长度)为L字节, 则表中任一数据元素的存放地址为:
LOC ( ai+1 ) = LOC( ai ) + L LOC ( ai ) = LOC( a0 ) + L *i
12
例1 设有一维数组M,下标的范围是0到9, 每个数组元素用相邻的5个字节存储。存储器 按字节编址,设存储数组元素M[0]的第一个 字节的地址是98,则M[3]的第一个字节的 地址是多少?
113
解:已知地址计算通式为: LOC(ai) = LOC(a0) + L *i
LOC( M[3] ) = 98 + 5 ×3 =113
性表的各个数据元素。即采用顺序存储结构的线性 表。它通常采用静态数组实现数据元素的存储。
注意:在C语言中数组的下标是从0开始,即: V[n]的有效范围是从 V[0]~V[n-1]
9
2、线性表顺序存储特点:
(1) 逻辑上相邻的数据元素,其物理上也相邻; (2) 若已知表中首元素在存储器中的位置,则其他
20
三、 顺序表操作的效率分析
时间效率分析: 算法时间主要耗费在移动元素的操作上,因此 计算时间复杂度的基本操作(最深层语句频度)
T(n)= O (移动元素次数) 而移动元素的个数取决于插入或删除元素的位置.
思考:若插入在尾结点之后,则根本无需移动(特别快); 若插入在首结点之前,则表中元素全部要后移(特别慢); 应当考虑在各种位置插入(共n+1种可能)的平均移动次数才合理。
教材有对执行效率的推导:
插入效率:Eis

n1 i 1
pi (n i 1)

1 n 1
n1
(n i
i 1
1)

n 2
删除效率:Edl

n i 1
qi (n i)

1 n
n i 1
(n i)

n 1 2
即插入、删除算法的平均 时间复杂度为 O(n)
23
本节小结
线性表顺序存储结构特点:逻辑关系上相邻的两个元素 在物理存储位置上也相邻; 优点:可以随机存取表中任一元素,方便快捷; 缺点:在插入或删除某一元素时,需要移动大量元素。 解决问题的思路:改用另一种线性存储方式:
链式存储结构
24
作业:
参考教材课后习题 (<<数据结构题集>>,严蔚敏、吴伟民 著)
线性结构的定义:
若结构是非空有限集,则有且仅有一个开始结点和一个 终端结点,并且所有结点都最多只有一个直接前趋和一个直 接后继。 →可表示为:(a1 , a2 , ……, an) 特点① 只有一个首结点和尾结点; 特点② 除首尾结点外,其他结点只有一个直接前驱和一个直
接后继。
简言之,线性结构反映结点间的逻辑关系是 一对一 (1:1) 的。
个相同类型数据元素a0, a1, … , an-1组成的线
性结构。
3
线性表的逻辑结构:
(a0, a1, … ai-1,ai, ai+1 ,…, an-1)
线性起点
下标,是元素的 序号,表示元素 在表中的位置
数据元素
ai的直接前趋 ai的直接后继 线性终点
n=0时称为 空表
n为元素总
个数,即表 长。n≥0
2.10,2.12
25
15
int ListInsert(SeqList *L,int i,DataType x)
{ int j;
if(L->size>=MaxSize) {

printf(“顺序表已满无法插入!\n”);

return 0;

} else if(i<0 // i>L->size) {

printf(“参数i不合法!\n”);
L->size--; // 表长减1
return 1;
18
删除顺序表中某个指定的元素的示意图如下:
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
19
例:建立一个线性表,先依次输入数据元素1,2, 3,4,…,10,然后删除5,最后依次显示当前 线性表中的数据元素。假设该线性的数据元素个 数最坏情况下不会超过100个。 实现方法: 1、采用直接编写一个主函数实现。 2、利用已设计实现的抽象数据类型模块。(存 放在头文件名为SeqList.h中,通过 #include “SeqList.h” )
对上述公式的解释如图所示
10
3、线性表的顺序存储结构示意图
地址 b=LOC(a0)
b+L b +iL
b +(n-1)L
内容
a0 a1 …… ai ai+1 …… an-1
元素在表中的位序 L0
1
i i+1
n-1
b +(MaxSize1)L LOC ( ai ) = LOC( a0 ) + L *i
6 30
7 42
8 77
1 12 2 13 3 21 4 24 5 25 6 28 7 30 8 42 9 77
17
3)删除 删除线性表的第i个位置上的元素 实现步骤: 将第i+1 至第n 位的元素向前移动一个位置; 表长减1。 注意:事先需要判断,删除位置i 是否合法?
核心语句: for ( j=i+1; j<=L->size-1; j++ ) L->list[j-1]= L->list[j] ; // 元素前移一个位置
线性结构包括:线性表、堆栈、队列、字符串、数组
等,其中最典型、最常用的是------ 线性表
1
第2章 线性表
2.1 线性表的基本概念 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 应用举例
2
2.1 线性表的基本概念
1、线性表 它是一种最简单的线性结构。是一种可以在任
意位置进行插入和删除数据元素操作的,由n(n≥0)

return 0;
素}
else {
for (j=L->size; j>i; j--) L->list[j]=L->list[j-1] ;
L->list[i]=x;
L->size++;
return 1;
}
}
16
在线性表的第i个位置前插入一个元素的示意图如下:
1 12
2 13
3 21
插入254
5
24 28
18 2003级电信0302 班
01200301081 王 泽 男 3
19 2003级电信0303 班
01200301090 薛 荃 男 6
19 2003级电信0304 班
0120注0意830:11同01一线王性春表中的男元素必定19具有相20同03特级性电班信!0305 分析:数:据元素都是:同类型(: 记录),:元素间关系:是线性的。 5
4
例1 分析26 个英文字母组成的英文表是什么结构。
( A, B, C, D, …… , Z)
分析: 数据元素都是同类型(字母), 元素间关系是线性的。
例2 分析学生情况登记表是什么结构。
学号
姓名 性别 年龄
班级
01200301062 陈建武 男 2
19 2003级电信0301 班
01200301070 赵玉凤 女 4
21
推导:假定在每个元素位置上插入x的可能性都一样(即 概率P相同),则应当这样来计算平均执行时间:
将所有位置的执行时间相加,然后取平均。
若在首结点前插入,需要移动的元素最多,后移n次; 若在a1后面插入,要后移n-1个元素,后移次数为n-1; …… 若在an-1后面插入,要后移1个元素; 若在尾结点an之后插入,则后移0个元素;
相关文档
最新文档