第2章线性表-2

合集下载

数据结构习题及答案与实验指导(线性表)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.顺序表顺序存储的线性表称为顺序表。

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

实用数据结构电子教案第二章 数组与线性表

实用数据结构电子教案第二章 数组与线性表
当i=n时,则循环一次也不执行,只是将 元素数目n比原来减少一个,而第n个数 据元素不必再考虑,其余的各单元的元 素均维持不变,这是最好的情况。
第二章 数组与线性表
3. 算法的时间复杂性
可以用数据元素的移动次数来度量这两个算 法的时间复杂性。
插入时,最少循环0次,最多循环n次,如i 的各种取值概率相同,则平均循环次数为 n/2;
else {
x=ST[top]; top=top-1; /*栈顶位置下移*/ } }
第二章 数组与线性表
2.3.2 堆栈的应用
1. 堆栈在函数调
A1
用中的应用:
设有三个函数A1,
A2
A2,A3,这三个 r
函数有如下的调 用关系:函数A1
在其函数体的某
A3 t
处r调用函数A2,
函数A2又在其函
数体某处t调用函
计算机处理表达式时,常把运算符放在两个 运算数的后面或前面。
1. 把运算符放在两个运算数的后面,例如 AB+ , 称为后缀形式,也叫做波兰式 。
2. 把运算符放在两个运算数的前面,例如 +AB, 则称做前缀形式,也叫做逆波兰表达式。
第二章 数组与线性表
算术表达式的不同运算符有不同的运算优先 顺序,如,在没有括号时,乘除运算(*或/) 要比加减运算(+或-)优先进行。
数据结构数据结构第二章数组与线性表第二章数组与线性表第第二数组与线性表数组与线性表数组的基本特点及寻址方式线性数据结构的基本特征和基本运算堆栈的定义和基本运算队列的定义和基本运算循环队列的特征运算以及判断溢出的条件与普通队列的差别堆栈队列的简单应用循环队列的特点及判断溢出的条件利用本章的基本知识设计有效的算法解决与线性相关的应用问题第二章数组与线性表熟练掌握以下内容

第二章 线性表

第二章 线性表

(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依然是有序的。(基于对顺序表的拆分 和合并操作的运算)

线性表

线性表

举例:
La=(34,89,765,12,90,-34,22) 数据元素类型为int。 Ls=(Hello,World, China, Welcome) 数据元素类型为 string。 Lb=(book1,book2,...,book100) 数据元素类型为下列所示的结 构类型: struct bookinfo { int No; //图书编号 char *name; //图书名称 char *auther; //作者名称 ...; };
素的方法被称为随机存取法,使用这种存取方法的存储结构被
称为随机存储结构。
在C语言中,实现线性表的顺序存储结构的类型定义
typedef int ElemType; //定义顺序表中元素的类型 #define INITSIZE 100 //顺序表存储空间初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef struct { ElemType *data; int length; //存储空间的基地址 //线性表的当前长度
说明:
1. 某数据结构上的基本运算,不是它的全部运算,而是一些 常用的基本的运算,而每一个基本运算在实现时也可能根据不 同的存储结构派生出一系列相关的运算来, 没有必要全部定义 出它的运算集。掌握了某一数据结构上的基本运算后,其它的 运算可以通过基本运算来实现,也可以直接去实现。 2. 在上面各操作中定义的线性表L仅仅是一个抽象在逻辑结 构层次的线性表,尚未涉及到它的存储结构,因此每个操作在 逻辑结构层次上尚不能用具体的某种程序语言写出具体的算法, 而算法的实现只有在存储结构确立之后。
4. 求顺序表的长度 int getlen(sqlist L) { return (L.length); } 5. 判断顺序表是否为空 int listempty(sqlist L) { if (L.length==0) return 1; else return 0; }

线性表练习题答案

线性表练习题答案

第2章线性表练习题答案一、填空1. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动n-i+1 个元素。

2. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动n-i 个元素。

3. 在顺序表中访问任意一结点的时间复杂度均为O(1),因此,顺序表也称为随机存取的数据结构。

4. 在单链表中,除了首元结点外,任一结点的存储位置由其直接前驱结点的链域的值指示。

5.在n个结点的单链表中要删除已知结点*p,需找到它的前驱结点的地址,其时间复杂度为O(n)。

二、判断正误(×)1. 链表的每个结点中都恰好包含一个指针。

答:错误。

链表中的结点可含多个指针域,分别存放多个指针。

例如,双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继结点的指针。

(×)2. 链表的物理存储结构具有同链表一样的顺序。

错,链表的存储结构特点是无序,而链表的示意图有序。

(×)3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。

错,链表的结点不会移动,只是指针内容改变。

(×)4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。

错,混淆了逻辑结构与物理结构,链表也是线性表!且即使是顺序表,也能存放记录型数据。

(×)5. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。

错,正好说反了。

顺序表才适合随机存取,链表恰恰适于“顺藤摸瓜”(×)6. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。

错,前一半正确,但后一半说法错误,那是链式存储的优点。

顺序存储方式插入、删除运算效率较低,在表长为n的顺序表中,插入和删除一个数据元素,平均需移动表长一半个数的数据元素。

(×)7. 线性表在物理存储空间中也一定是连续的。

错,线性表有两种存储方式,顺序存储和链式存储。

线性表

线性表

2.1 线性表的类型定义
例3:下图为10个个学生的成绩表,它也是一个 线性表,该线性表的数据元素类型为结构体类型。
2.1 线性表的类型定义
从以上例子可看出线性表的逻辑特征是: 在非空的线性表中,有且仅有一个被称作 “第一个”的数据元素a1,它没有直接前趋, 而仅有一个直接后继a2; 有且仅有一个被称作“最后一个”的数据元 素an,它没有直接后继,而仅有一个直接前 趋 a n-1; 其余的数据元素ai(2≦i≦n-1)都有且仅有一个 直接前趋a i-1和一个直接后继a i+1。 线性表是一种典型的线性结构。
2.2 线性表的顺序表示和实现
#define MAXNUM 100 Elemtype List1[MAXNUM] ; /*定义线性表L1*/ int length1;
Elemtype List2[MAXNUM] ; /*定义线性表L1*/ int length2;
Elemtype List3[MAXNUM] ; /*定义线性表L1*/ int length3;
2.2 线性表的顺序表示和实现
而只需要将数组和表长封装在一个结构体中,然 后定义三个结构体变量即可: struct L_list { Elemtype List[MAXNUM]; int length; }; struct L_list L1, L2, L3; /*定义三个线性表L1,L2,L3*/
2.1 线性表的类型定义
例1:26个英文字母组成的字母表 (A,B,C、…、Z) 例2:某公司2000年每月产值表(单位:万元) (400,420,500,…,600,650) 是一个长度为12的线性表。

上述两例中的每一个数据元素都是不可分割的, 在一些复杂的线性表中,每一个数据元素又可 以由若干个数据项组成。

数据结构(严蔚敏)课件 第2章 线性表C(链表的操作)

//插入非空表的剩余段 //释放Lb的头结点 ?:是条件运算符(为真则取第1项,见P10条件赋值)
22
注:Lc用的是La的头指针

考:
1、不用Lc,直接把La表插到Lb表中;或者 把Lb表插到La表中,怎么修改?
2、重复的数据元素不需要插入,怎么修改?
23
一个带头结点的线性链表类型定义如下 (用类C语言,见P37):
29
续例2:一元多项式的计算 (参见教材P39 – 43) 后续内容
12
(2) 单链表的修改(或读取)
(3) 单链表的插入(P29)
在链表中插入一个元素X 的示意图如下: p a p
b
插 入 X
a
b
p->next
s
X
s->next
链表插入的核心语句: Step 1:s->next=p->next; Step 2:p->next=s ; 思考:Step1和2能互换么?
//链表中元素个数(长度)
表结构
前面的归并算法可改写为P39算法2.21
24
例2:一元多项式的计算 (参见教材P39 – 43) 讨论:
1. 一元多项式的数学通式? 2. 用抽象数据类型如何描述它的定义?
3. 用C语言如何描述它的定义?
4. 如何编程实现两个一元多项式相加?
25
1. 一元多项式的数学通式?
新手特别容易忘记!!
8
void display()
/*字母链表的输出*/
{p=head; sum=0; while (p) //当指针不空时循环(仅限于无头结点的情况) {printf("%c",p->data); p=p->next; //让指针不断“顺藤摸瓜” } sum++; }

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


如何找指定位置的结点?
• 与顺序表不同,单链表无法直接访问指定 位置的结点,而是需要从哨位结点开始, 沿着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、其它操作 复制、分解、合并、分类等

第2章线性表辅导

第2章线性表辅导本章通过实例给出线性表的定义,介绍线性表的逻辑结构、顺序存储结构和链式存储结构,讨论线性表在两种不同存储结构下对应的顺序表和链表的相关操作,介绍线性表的简单应用。

通过本章学习,要求同学们:1.掌握线性表的定义和逻辑结构。

2.掌握线性表的顺序存储结构的有关概念,能利用C语言的数组和指针实现对顺序表的相关操作。

3.掌握线性表的链式存储结构的有关概念,并重点掌握单向链表的特点和访问方式,能利用C语言的结构变量和指向结构体的指针实现对链表的相关操作。

4.正确理解线性表两种存储结构各自的特点和应用场合,能利用所学知识和按照相关要求设计算法、编制程序,利用线性表解决简单的应用问题。

一、本章知识点1. 线性表的定义及特点线性表是一种最简单、最常用的一种数据结构。

线性表中的元素存在着一对一的相互关系。

线性表是n(n≥0)个数据元素的有限序列。

其中n为数据元素的个数,定义为数据表的长度。

当n为零时的表称为空表。

当n>0时,一般将线性表记为:(a1,a2,…a i-1,a i,…a n),其中a i(i=1,2,3,…,n)是属于某个数据对象的元素,由线性表的定义,若线性表至少包含2个元素,则线性表中的数据元素之间存在以下关系:1.表中存在称作“第一个”的元素,例如上表中的a1,存在称作“最后一个”的数据元素,例如上表中的a n。

2.表中第一个元素a1前面没有元素和它相邻,称它没有直接前驱,它后面有且只有一个元素a2与它相邻,称它有且只有一个直接后继。

而表中“最后一个”元素a n有且只有一个直接前驱a n-1,没有直接后继。

3.除“第一个”元素和“最后一个”元素外,其它每个元素均有且只有一个直接前驱和一个直接后继。

2.线性表的顺序存储结构用一组地址连续的存储单元依次存放线性表的数据元素,该结构的特点是逻辑上相邻的数据元素在物理上也相邻,可以随机访问,一对一的关系。

用顺序存储结构存储的线性表称为顺序表3.顺序表的操作(1)插入操作插入操作的算法步骤为:从a n开始逐次将a n,a n-1.,…,a i向后平移一个存储位置,然后将x存入到a[i]中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档