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.顺序表顺序存储的线性表称为顺序表。

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

第二章 线性表

第二章 线性表

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

DS02线性表习题参考解答

DS02线性表习题参考解答

第2章线性表习题参考解答一、简答题1.试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。

【答】头指针:是指向链表中的第一个结点的指针。

头结点:在开始结点之前附加上的一个结点。

开始结点:链表的第一个结点。

头指针是一个指向地址的变量,用于表示一个链表的开始。

引入头结点可以更加方便的进行链表是否为空的判断,同时方便了插入和删除结点。

开始结点用于存储链表的第一个数据元素。

2.何时选用顺序表、何时选用链表作为线性表的存储结构为宜?【答】顺序表中查找元素、获取表长非常容易,但是,要插入或者删除一个元素却需要移动大量的元素;相反,链表中却是方便插入或者删除元素,在查找元素的是,需要进行遍历。

因此,当所涉及的问题常常进行查找等操作,而插入、删除相对较少的是,适合采用顺序表;当常常需要插入、删除的时候,适合采用链表。

3.为什么在单循环链表中设置尾指针比设置头指针更好?【答】在单循环链表中,设置尾指针,可以更方便的判断链表是否为空。

4.在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?【答】本题分三种情况讨论:1、单链表:当知道指针p指向某结点时,能够根据该指针找到其直接后继,但是不知道头指针,因此不能找到该结点的直接前趋,因此,无法删除该结点。

2、双链表:根据指针p可以找到该结点的直接前趋和直接后继,因此,能够删除该结点。

3、单循环链表:和双链表类似,根据指针p也可以找到该结点的直接前趋和直接后继,因此,也可以删除该结点。

5.下述算法的功能是什么?LinkList Demo(LinkList *L) /* L是无头结点单链表*/{LNode *Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while (P->next) P=P->next;P->next=Q; Q->next=NULL;}return L;} /* Demo */【答】将原来的第一个结点变成末尾结点,原来的第二个结点变成链表的第一个结点。

数据结构课件第2章线性表

数据结构课件第2章线性表

27
线性表的顺序存储结构适用于数据 元素不经常变动或只需在顺序存取设备 上做成批处理的场合。为了克服线性表 顺序存储结构的缺点,可采用线性表的 链式存储结构。
28
2.3 线性表的链式存储结构
线性表的链式存储表示 基本操作在单链表上的实现 循环链表 双向链表 线性表链式存储结构小结
2.3.1 线性表的链式存储表示 29
2.1.1 线性表的定义
6
一个线性表(linear_list)是 n(n≥0)个具有相同属性的数 据元素的有限序列,其中各元素有着依次相邻的逻辑关系。
线性表中数据元素的个数 n 称为线性表的长度。当 n = 0 时 该线性表称为空表。当 n > 0 时该线性表可以记为:
(a1,a2,a3,…,ai,…,an)
数据域 指针域
结点 data next
31
(2) 线性表的单链表存储结构
通过每个结点的指针域将线性表中 n 个结点按其逻辑顺序链 接在一起的结点序列称为链表,即为线性表 ( a1, a2, a3, …, ai, …, an ) 的链式存储结构。如果线性链表中的每个结点只有一个指针域, 则链表又称为线性链表或单链表 (linked list)。
17
(2) 算法编写
#define OK 1
#define ERROR 0
Int InsList ( SeqList *L, int i, ElemType e ) /*在顺序线性表 L 中第 i 个位置插入新的元素 e。*/ /* i 的合法值为 1≤i ≤L->last+2*/ {
int k; if ( i < 1) ||( i > L->last+2)) /*首先判断插入位置是否合法*/ { printf(“插入位置i值不合法”);

第二章线性表

第二章线性表

;查询通讯录信息。
第2页
目录
目录 退出
第二章 线性表
struct TelRed {char name[20]; char tel[12]; }; struct TelRed TelBook[100]; int length; 结构体数组TelBook和表示通讯录长度length二者实际 上是作为通讯录的一部分出现的,将二者作为一个整体来 表示通讯录。
第21页
目录
目录 退出
第二章 线性表
算法思想:
1)检查 i 值是否超出所允许的范围 (1 i n + 1) ,若超出
,则进行“超出范围”错误处理; 2)将线性表的第 i 个元素和它后面的所有元素均后移一个 位置; 3)将新元素写入到空出的第 i 个位置上;
4)使线性表的长度增 1。
第22页
第10页
目录
目录 退出
第二章 线性表
③ DestroyList(&L) 初始条件:线性表L已存在。
操作结果:销毁线性表L。
④ ClearList(&L) 初始条件:线性表L已存在。 操作结果:将L置为空表。 ⑤ EmptyList(L) 初始条件:线性表L已存在。 操作结果:如果L为空表,则返回TRUE,否则返回FALSE。 ⑥ GetData(L,i,&a) 初始条件:表L存在,且1≤i≤ListLength(L)。 操作结果:用a返回线性表L中第i个数据元素的值。
2、有且仅有一个终端结点 an,它没有直接后继,而仅有 一个直
接前趋 an -1, an 叫表尾元素;
3、其余的内部结点 ai (2 i n -1) 都有且仅有一个直接 前趋 ai –1
和一个直接后继 ai +1。

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

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

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章 线性表

【例2】巳知有两个按元素值递增有序的顺序表La和 Lb,设计一个算法将表La和表Lb的全部元素归并 为一个按元素值递增有序的顺序表Lc。

算法思路:用i扫描顺序表La,用j扫描顺序表Lb。 当表La和表Lb都未扫描完时,比较两者的当前元 素,将较小者插入表Lc的表尾,若两者的当前元 素相等,则将这两个元素依次插入表Lc的表尾。 最后,将尚为扫描完的顺序表的余下部分元素依 次插入表Lc的表尾。算法如下: void MergeList_Sq(SqList La, SqList Lb, SqList &Lc)

表中ai-1领先于ai,称ai-1是ai的直接前驱,ai+1是 ai的直接后继。

线性表的抽象数据类型定义 (参见教材)
返回本章目录
2.2 线性表的顺序存储结构

线性表的顺序存储是指在内存中用地址连续的一块存储空间 依次存放线性表的数据元素,用这种存储形式存储的线性表 称其为顺序表。 假设每个数据元素占d个存储单元,且将ai的存储地址表示为 Loc(ai),则有如下关系: Loc(ai)=Loc(a1)+(i-1)*d Loc(a1)是线性表的第一个数据元素a1的存储地址,通常 称作线性表的基地址。

【例1】 编写一算法,从顺序表中删除自第i个元素开 始的k个元素。 算法思路: 为保持顺序表的逻辑特性,需将i+k ~ n位 置的所有元素依次前移k个位置。算法如下:

int deleteK(Sqlist &sq,int i,int k)
{ if (i<1||k<1||i+k-1>sq.len) return 0; for (j=i+k-1;j<=sq.len-1;j++) sq.data[j-k]=sq.data[j]; sq.len-=k; return 1; }// deleteK

第2章演示

第2章演示

2.2 线性表的顺序表示和实现 一、顺序表 3.顺序表类型定义 注意: ①存放线性表结点的向量空间的大小MaxSize应仔细 选值,使其既能满足表结点的数目动态增加的需求, 又不致于预先定义过大而浪费存储空间。 ② 由于C语言中向量的下标从0开始,所以若L是 SqList类型的顺序表,则线性表的开始结点a1和终端 结点an分别存储在L.data[0]和L.data[L.length-1]中。 ③若L是SqList类型的指针变量,则a1和an分别存储在 L->data[0]和L->data[L->length-1]中。 ④顺序表的的特点是逻辑上相邻的结点其物理位置亦 相邻。
单链表 6、指针变量和结点变量
注意:指针变量p与结点变量*p的关系。 指针变量p的值是地址; 结点变量*p的值是结点内容。
单链表 6、指针变量和结点变量
说明: ①生成结点变量空间的标准函数 p=( Lnode *)malloc(sizeof(Lnode)); //函数malloc分配一个类型为Lnode的结点变量的 空间,并将其首地址放入指针变量p中 ②释放结点变量空间的标准函数 free(p);//释放p所指的结点变量空间
2.1 线性表的类型定义
2.1 线性表的类型定义 二、线性表的逻辑结构特征 对于非空的线性表: ① 有且仅有一个开始结点a1,没有直接前趋,有且 仅有一个直接后继a2; ② 有且仅有一个终结结点an,没有直接后继,有且 仅有一个直接前趋an-1; ③ 其余的内部结点ai(2≤i≤n-1)都有且仅有一个 直接前趋ai-1和一个直接后继ai+1。
单链表 6、指针变量和结点变量
说明: ③结点分量的访问 利用结点变量的名字*p访问结点分量 方法一:(*p).data和(*p).next 方法二:p-﹥data和p-﹥next

第2章 线性表

第2章 线性表

数。
第2章 线性表
2.2 线性表的顺序存储结构表示
图2-2所示为线性表在存储介质中顺序分配的情况。
第2章 线性表
逻辑地址 1 2 记录内容 a1 a2 存储地址 LOC(a ) 1 LOC(a )+k 1 内存状况 a1 a2

i

ai LOC(a )+(i-1)× k 1

ai

n
图2-2 线性表的顺序分配
第2章 线性表
2.3 线性表元素的操作
2.3.1 线性表元素插入操作 插入一个记录,对有序线性表结构的影响可以从以下 两个方面分析。
(1) 若插入记录关键字的值比表中所有的数据元素的
关键字值都大,那么只需在表后添加一个新记录元素,同 时使表的当前长度修正为n+1即可。
(2) 若插入记录的位置出现在线性表的中间,则情况
LOC(ai)=LOC(a1)+(i-1)×k
从以上的地址计算公式可知,只要已知线性表第 一个数据元素在内存中的存储地址,又知道每一个数 据元素所占存储单元的个数,就能计算出第i个数据元 素在内存中的位置。
第2章 线性表 例如,线性表中第一个数据元素在内存中的地址 LOC(a1)为1000,每一个数据元素占用2个存储单位,
名称“数据结构”的属性就不相同,它们分别为字符
型和数值型。
第2章 线性表 2.1.2 线性表的逻辑结构表示 在任何问题中,数据元素之间可以存在多种关系。 从数据结构的观点来看,重要的是数据元素之间的逻辑 关系。所谓逻辑关系,是指数据元素之间的关联方式或 称“邻接关系”。表2-1中数据的逻辑结构如图2-1(b)所 示,其中的圆圈称为结点。一个结点代表一个数据元素 (有时也把结点和数据元素当作同义词),结点之间的连 线代表逻辑关系,即相应数据元素之间的邻接关系。图 2-1(b)中的逻辑结构反映了表2-1中表格作为一个数据的 组织形式,这种组织形式就是数据元素(记录)“一个接 一个地排列”。

数据结构 第2章线性表 习题 答案

数据结构 第2章线性表  习题  答案

第2章线性表参考答案一、填空1. 【严题集2.2①】在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与表长和该元素在表中的位置有关。

2. 线性表中结点的集合是有限的,结点间的关系是一对一的。

3. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动n-i+1 个元素。

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

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

6. 【严题集2.2①】顺序表中逻辑上相邻的元素的物理位置必定相邻。

单链表中逻辑上相邻的元素的物理位置不一定相邻。

7. 【严题集2.2①】在单链表中,除了首元结点外,任一结点的存储位置由其直接前驱结点的链域的值指示。

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

二、判断正误(在正确的说法后面打勾,反之打叉)( × )1. 链表的每个结点中都恰好包含一个指针。

答:错误。

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

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

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

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

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

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

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

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

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

错,正好说反了。

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

第2章 线性表

第2章 线性表
数组下标 data 数组 0 a1 1 a2 … …… i- 2 ai-1 i- 1 ai i ai+1 … …… n-1 an 空闲
MaxSize-1
说明:SqListClass<T>的模板类的一个对象L称为顺序 表对象L,也简称为顺序表L,其中主要有data、length数据 成员和相关的运算函数,通过L.data或L.length对数据成员进 行操作,后面的顺序栈、顺序队、顺序串等都采用相似的方 式。
(6)插入数据元素ListInsert(i,e) 该运算在线性表中逻辑序号为i的位臵上插入一个新元素 e。如图2.4所示是插入元素的示意图,由此看出,在一个线 性表中,可以在两端及中间任何位臵上插入一个新元素。
ቤተ መጻሕፍቲ ባይዱ
template <typename T> bool SqListClass<T>::ListInsert(int i, T e) //插入数据元素 { int j; if (i<1 || i>length+1) return false; //参数错误时返回false for (j=length;j>=i;j--) //将data[i-1]及后面元素后移一个位臵 data[j]=data[j-1]; data[i-1]=e; //插入元素e length++; //顺序表长度增1 return true; //成功插入返回true }
(5)按元素值查找LocateElem(e) 该运算顺序查找第一个值与e相等的元素的逻辑序号。若 顺序表中不存在这样的元素,则返回值为0。对应的算法如下:
template <typename T> int SqListClass<T>::LocateElem(T e) //按元素值查找其序号 { int i=0; while (i < length && data[i]!=e) i++; //查找元素e if (i>=length) return 0; //未找到时返回0 else return i+1; //找到后返回其逻辑序号 }

国家开放大学《数据结构》课程实验报告(实验2——线性表)参考答案

国家开放大学《数据结构》课程实验报告(实验2——线性表)参考答案
printf("\n");
//在链表中删除最高分和最低分结点
for(q=head,p=head->next;p!=NULL;q=p,p=p->next)
{
if(p==pmin) { q->next=p->next; p=q; } //删除最低分结点
};
typedef struct pw PW;
//定义链表结点
struct node
{
PW data;
struct node * next;
};
typedef struct node NODE;
NODE *create(int n); //建立单链表
void input(NODE *s,int i); //输入第i个评委信息
(5)遍历链表,累加求和,计算总分及平均分,并输出相关信息。
完整程序
//实验1.1线性表的链接存储结构
#include
#include
#include
#define PWRS 5 //定义评委人数
//定义评委信息
struct pw
{
char name[8]; //姓名
short age; //年龄
float score; //评分
NODE *create(int n)
{
NODE *head,*p,*q;
inti;
p=(NODE*)malloc(sizeof(NODE));
head=p; q=p; p->next=NULL;
for(i=1; i<=n; i++)
{
p=(NODE*)malloc(sizeof(NODE));

数据结构导论 第2章 线性表

数据结构导论 第2章 线性表
线性表(linear list) 第二章 线性表
线性表是一种线性结构,线性结构的特点是数据元 素之间是一种线性关系,数据元素“一个接一个的 排列”。 线性结构是n(n>=0)个结点的有穷序列。对于 n>0的线性结构表示成: (a1,a2,… ai-1,ai,ai+1,…an) a1称为起始结点 an称为终端结点 起始结点, 终端结点; 起始结点 终端结点 ai-1 称为 ai 的直接前趋 i+1 称为 ai 的直接后继 直接前趋,a 直接后继。 直接前趋 直接后继
4.查找(定位) locate(L,x): .查找(定位) :
依次将顺序表L中的每个元素与给定的值x进行比 较。若找到则返回其序号(下标+1),否则返回0。 int locate (sqlist L, datatype x) { int i; for ( i=0; i<st; i++) if (L.data[i]==x) return (i+1); return(0); }
void insert (sqlist *L, datatype x, int i ) { if (i<1 || i>L->last+1) error (“插入位置错误”); else if (L->last==maxsize) error (“溢出”); else { for (j=L->last-1; j>=i-1; j--) //往后移动元素 //往后移动元素 L->data[j+1]=L->data[j]; L->data[i-1]=x; //插入x L->last++; //修改表长 } }
常见的线性表的基本运算有以下几个: 常见的线性表的基本运算有以下几个:

第2章 线性表

第2章  线性表

本算法的时间复杂度为O(1)。
(5) 输出线性表DispList(L) 该运算当线性表L不为空时,顺序显示L中各元素的 值。
void DispList(SqList *L)
{
int i; if (ListEmpty(L)) return;
for (i=0;i<L->length;i++)
printf("%c",L->data[i]); printf("\n");
⑤ 将表的长度加1。
(7) 定位查找LocateElem(L,e):返回L中第1个值域 与e相等的位序。若这样的元素不存在,则返回值为0。 (8) 插 入 数 据 元 素 ListInsert(&L,i,e): 在 L 的 第 i(1≤i≤ListLength(L)+1)个元素之前插入新的元素e,L 的长度增1。 (9) 删除数据元素ListDelete(&L,i,&e):删除L的第 i(1≤i≤ListLength(L))个元素,并用e返回其值,L的长度 减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)) 个元素的值。
线性表的存储示意图
1. 建立顺序表 其方法是将给定的含有n个元素的数组的 每个元素依次放入到顺序表中,并将n赋给顺 序表的长度成员。算法如下:

第二章_线性表(参考答案)

第二章_线性表(参考答案)

第二章线性表一、填空题1、数据逻辑结构包括线性结构、树型结构、图型结构这三种类型,树形结构和图形结构合称为非线性结构。

2、在线性结构中,第一个结点没有前驱结点,其余每个结点有且只有个前驱结点,最后一个结点没有后续结点,其余每个结点有且只有一个后续结点。

3、在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动的元素个数与插入或删除的位置有关。

4、在顺序表中,逻辑上相邻的元素,其物理位置一定相邻。

在单链表中,逻辑上相邻的元素,其物理位置不一定相邻。

5、在带头结点的非空单链表中,头结点的存储位置由头指针指示,首元素结点的存储位置由头结点的next域指示,除首元素结点外,其它任一元素结点的存储位置由其直接前趋结点的next域指示。

6、阅读下列算法,并补充所缺内容。

void purge_linkst( ListNode *& la ){// 从头指针为 la 的有序链表中删除所有值相同的多余元素,并释放被删结点空间ListNode *p,*q;if(la==NULL) return;q=la; p = la->link;while (p){if (p && ___(1)p->data!=q->data___) {q=p; p = p->link;}else{q->link= ___(2)p->link___;delete(p);p=___(3)q->link___;}}//while}// purge_linkst二、选择题1、在数据结构中,从逻辑上可以把数据结构分成 C。

A、动态结构和静态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、内部结构和外部结构2、线性表的逻辑顺序与存储顺序总是一致的,这种说法 B。

A、正确B、不正确3、线性表若采用链式存储结构时,要求内存中可用存储单元的地址D。

A、必须是连续的B、部分地址必须是连续的C、一定是不连续的D、连续或不连续都可以4、在以下的述叙中,正确的是B。

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

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

数据结构与算法华东师范大学计算机系杨沛第二章线性表2.1 线性表的基本概念线性表是具有相同数据类型的数据元素的有限序列。

由n(n≥0)个数据元素k0,k1,…,kn-1组成的线性表记为(k0 ,k1 ,…,kn-1),线性表中包含的数据元素的个数n称为线性表的长度(length),称长度为零的线性表为空的线性表(简称为空表)。

相关概念:表头、表尾、前驱、后继有序线性表:数据元素的相对位置与它们的值有联系。

无序线性表:数据元素的相对位置与它们的值没有联系。

第二章线性表例小于20的质数组成的线性表(2,3,5,7,11,13, 17,19);英文字母表也是线性表,表中每个字母是一个数据元素:(A,B,C,……,Z);2.2 顺序表2.2.1 线性表顺序表(sequential list)就是顺序存贮的线性表,即用一组连续的存贮单元依次、连续地存贮线性表中的结点。

如果每个结点占用s个存贮单元,并假设存放结点ki(0≤i≤n-1)的开始地址为loc(k0),则结点ki的地址loc(ki)可表示成Loc(ki) =loc(k0) + i*s。

2.2 顺序表在C 语言中,可用数组表示线性表:#define MAXN 100int list[MAXN];int n;线性表的结点k 0,k 1,…,k n-1依次存放在数组单元list[0],list[1],…,list[n-1]。

2.2.1 线性表最大表长实际表长线性表2.2 顺序表2.2.1 线性表假设s=sizeof(int),则可得到计算ki的地址的公式,因loc(ki)=&list[i],而&list[i]=&list[0]+i·s,故loc(ki)=&list[0]+i·s。

2.2 顺序表2.2.2 顺序表的操作(1)初始化:初始长度置为0即可(n=0;),数组空间在编译时分配。

(2)顺序表的插入:插入算法的C函数SqListInsert():若插入位置i不在可以插入的位置上,即i<0或i>n,则返回0;若n=MAXN,即线性表已满,此时数组list[]没有多余的存贮单元可以存放新结点,则返回-1;若插入成功,则返回12.2 顺序表实际表长(2)顺序表的插入:int SqListInsert(int list[],int*p_n,int i,int x) {int j;if(i<0||i>*p_n)return(0);//i不是合法的插入位置if(*p_len==MAXN)return(-1);//线性表已满2.2 顺序表for(j=*p_n;j>i;j--)list[j]=list[j-1];//结点右移list[i]=x;(*p_n)++;//表长加1return(1);}2.2 顺序表(2)顺序表的插入:对于存放在数组list[]中的、具有n个结点的顺序表,为了把值为x的结点插在表的位置i(0≤i≤n)上,可调用如下的语句:k=SqListInsert(list, &n, i, x);注:结点移动是本算法的关键操作2.2 顺序表(3)顺序表的删除:删除算法的C函数SqListDelete():在具有n个结点的顺序表中,删除第i(0≤i≤n-1)个位置上的结点,使线性表长度减1,若删除位置不合法,即i<0或i≥n,则返回0;若删除位置合法,即0≤i≤n-1,则删除成功,返回1。

数据结构实验二 线性表

数据结构实验二 线性表

数据结构实验二线性表数据结构实验二线性表1. 实验目的1.1 理解线性表的概念和特性1.2 学习线性表的顺序存储结构和链式存储结构1.3 掌握线性表的基本操作:初始化、插入、删除、查找、修改、遍历等1.4 熟悉线性表的应用场景2. 实验内容2.1 线性表的顺序存储结构实现2.1.1 定义线性表结构体2.1.2 初始化线性表2.1.3 插入元素2.1.4 删除元素2.1.5 查找元素2.1.6 修改元素2.1.7 遍历线性表2.2 线性表的链式存储结构实现2.2.1 定义链表节点结构体2.2.2 初始化链表2.2.3 插入元素2.2.4 删除元素2.2.5 查找元素2.2.6 修改元素2.2.7 遍历链表3. 实验步骤3.1 实现顺序存储结构的线性表3.2 实现链式存储结构的线性表3.3 编写测试程序,验证线性表的各种操作是否正确3.4 进行性能测试,比较两种存储结构的效率差异4. 实验结果与分析4.1 执行测试程序,检查线性表的操作结果是否正确4.2 对比顺序存储结构和链式存储结构的性能差异4.3 分析线性表的应用场景,总结线性表的优缺点5. 实验总结5.1 总结线性表的定义和基本操作5.2 回顾实验中遇到的问题和解决方法5.3 提出对线性表实现的改进方向和思考附件:请参考附件中的源代码和实验报告模板。

法律名词及注释:1. 版权:指对某一作品享有的法律上的权利,包括复制权、发行权、改编权等。

2. 法律责任:指违反法律或合同规定所承担的责任。

3. 保密义务:指个人或组织根据法律、法规、合同等规定需要承担的保密责任。

4.知识产权:指人们在社会实践中所创造的智力劳动成果所享有的权利,包括专利权、著作权、商标权等。

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

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

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 线性表的顺序存储和实现
线性表的基本操作 求长度:求线性表的数据元素个数。 访问:对线性表中指定位置的数据元素进行存取、替 换等操作。 插入:在线性表指定位置上,插入一个新的数据元素, 插入后仍为一个线性表。 删除:删除线性表指定位置的数据元素,同时保证更 改后的线性表仍然具有线性表的连续性。 复制:重新复制一个线性表。 合并:将两个或两个以上的线性表合并起来,形成一 个新的线性表。 查找:在线性表中查找满足某种条件的数据元素。 排序:对线性表中的数据元素按关键字值,以递增或 递减的次序进行排列。 遍历:按次序访问线性表中的所有数据元素,并且每 个数据元素恰好访问一次。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 线形表 /ds 11
// 写进待插入的元素 写进待插入的元素e // 表长加1 表长加
q = &(elem[i-1]);
// q指向插入的位置 指向插入的位置
// p指向最后一个元素, 指向最后一个元素, 指向最后一个元素 // 从p到q的所有元素后移一个单元 到 的所有元素后移一个单元 for(p=&(elem[length-1]); p>=q; --p) *(p+1) = *p; *q = e; ++ length; return OK; } i=3,即插入在第三个元素之前 , q // 写进待插入的元素 写进待插入的元素e // 表长加 表长加1
2 线形表
/ds
9
int SqList::Insert(int i, Type e){ // 判断 是否合法 判断i是否合法 if(i < 1 || i > length + 1) return ERROR; // 若线性表空间不足,再分配一些空间 若线性表空间不足, if(length >= listsize){ newbase = new Type[listsize +LISTINCREMENT]; if(!newbase) return OVERFLOW; for(int j = 0;j<length;j++) newbase[j] = elem[j]; delete[] elem; elem = newbase; listsize += LISTINCREMENT; }
2 线形表 /ds 21
线性表的链式表示和实现
int GetElem(i,&e); //获取第 个元素 获取第i个元素 获取第 int SetElem(i,e); //修改第 个元素 修改第i个元素 修改第 int Find(e,compare()); //查找 查找 int Insert(i,e ); //插入 插入 int Delete(i); //删除 删除 int push_front(e); void pop_front(); };
p
a
0
b
1
e c
2
d
3
f
4
g
5
2 线形表
6
7
12
/ds
线性表的顺序表示和实现
• 插入操作的算法复杂度
– 很显然,插入操作的复杂度由需要移动 很显然, 的元素的个数决定 – 而需要移动元素的个数由插入位置决定
•i = n+1时,需要移动 个 时 需要移动0个 •i = n时:1个 时 个 •... •i = 1时:n个 时 个 •即:需要移动的元素个数 = n+1-i 即
– 特点
•每个元素的存储地址任意 每个元素的存储地址任意 • 使用指针相链接 •使用指针相链接 节点 数据域 指针域
2 线形表
/ds
19
线性表的链式表示和实现
• 存储结构
struct LNode{ Type data; struct LNode *next; };
• 头节点数据域为空
2 线形表
/ds
22
线性表的链式表示和实现
• 假如要访问每个元素,如何做? 假如要访问每个元素,如何做?
LinkList L; LNode *p = 0; //… for(p = L.First();p;p = L.Next()){ cout << p->data << “\n”; }
数据结构
2 线性表
1
2 线形表
/ds
主要内容
• 线性表的类型定义
– 即抽象数据类型
• 顺序实现
– 即用一连续的存储空间来表示
• 链式实现
– 即用链表实现
• 一元稀疏多项式
– 一元多项式的定义与实现
2 线形表 /ds 2
线性表的类型定义
• 线性表
a1 head a2 a3 a4
20
2 线形表
/ds
线性表的链式表示和实现
class LinkList{ LNode *head; //头结点指针 头结点指针 LNode *current; //*previous public: LinkList(); // 初始化 ~ LinkList(); // 销毁 void Clear() // 清空 bool IsEmpty(); // 空吗? 空吗? int Size(); // 元素个数 LNode* First(); LNode* Next(); LNode* Pre();
2 线形表 /ds 16
// 表ห้องสมุดไป่ตู้减 表长减1
线性表的顺序表示和实现
• 思考: 思考:
– 删除操作的时间复杂度是多少? 删除操作的时间复杂度是多少?
2 线形表
/ds
17
线性表的顺序表示和实现
• 线性表的顺序表示和实现
– 特点
•各单元的内存地址连续 各单元的内存地址连续
– 这个特殊性导致了链表操作的很多算法 都必须分第一个节点和非第一个节点两 种情况来讨论 – 所以增加一个“无用”的空节点,这样 所以增加一个“无用”的空节点, 消除了这种不一致, 消除了这种不一致,从而简化了算法
2 线形表 /ds 24
线性表的链式表示和实现
• 遍历操作
/ds
8
线性表的顺序表示和实现
• 插入
– SqList::Insert(int i, Type e) – 在线性表的第 个元素前面,插入元素 线性表的第i个元素前面 插入元素e 个元素前面,
L i = 3 25 1 2 3 4 5 6 12 13 28 30 42
必须向下移动n-i+1个元素 个元素 必须向下移动
2 线形表
/ds
4
线性表的顺序表示和实现
• 顺序表示
– 即用一连续的存储空间来表示
•比如数组:Type array[n]; 比如数组: 比如数组 • 或动态分配的一块空间 •或动态分配的一块空间: 或动态分配的一块空间: (Type *) malloc (n*sizeof(Type )); new Type[n];
2 线形表
/ds
23
线性表的链式表示和实现
• 为什么要有一个没有数据的头结点? 为什么要有一个没有数据的头结点?
– 因为原来的第一个节点有点儿特殊: 因为原来的第一个节点有点儿特殊:
•第一个节点的前面没有节点 前驱节点 第一个节点的前面没有节点(前驱节点 第一个节点的前面没有节点 前驱节点) • 而其它节点的前面都有前驱节点 •而其它节点的前面都有前驱节点
线性表的顺序表示和实现
• 初始化
SqList::SqList(){ elem = new Type[LIST_INIT_SIZE]; if(!elem) throw “没有足够内存”; 没有足够内存” 没有足够内存 length = 0; listsize = LIST_INIT_SIZE; }
2 线形表
2 线形表
/ds
5
线性表的顺序表示和实现
•动态分配顺序存储结构 动态分配顺序存储结构
const int LIST_INIT_SIZE = 定义为任何类 100 具体实现时可以把Type定义为任何类 具体实现时可以把 型:typedef int const int LISTINCREMENT =Type; 10 class SqList{ a1 Type *elem; elem int length; a2 length int listsize; a3
– n个元素的有限序列 个元素的有限序列
数据项 元素 (记录 记录) 记录 姓名 王小林 陈红 刘建平 ... 学号 790631 790632 790633 ... 性别 男 女 男 ... 年龄 18 20 21 ... 班级 计91 计91 计91 ... 健康状况 健康 一般 健康 ...
3
L i = 3 1 2 3 4 5 6 12 13 25 28 30 42
必须向上移动n-i+1个元素 个元素 必须向上移动
2 线形表 /ds 15
int SqList :: Delete(int i, Type &e) { if((i < 1) || (i > length)) return ERROR; p = &(elem[i-1]); //p指向被删除的节点 指向被删除的节点 e = *p; //e得到被删除的节点的值 得到被删除的节点的值 // q指向最后一个节点 指向最后一个节点 q = elem + length - 1; // 从p+1到q的所有节点前移一个单元 到 的所有节点前移一个单元 for(++ P; p <= q; ++ p) *(p-1) = *p; -- length; return OK; }
2 线形表 /ds 13
线性表的顺序表示和实现
• 最差情况
– T(n) = O(n)
变量代换j 变量代换 = n+1-i
• 平均情况呢? 平均情况呢?
– 一共有 一共有1,2,...,n+1,n+1个可能的插入位置, 个可能的插入位置, , 个可能的插入位置 在第i个位置上插入的概率是 个位置上插入的概率是1/(n+1) 在第 个位置上插入的概率是 – 所以平均需要移动元素的个数
– 优点
•可随机访问任一元素 可随机访问任一元素 •即访问任何一个元素所用时间都相同 即访问任何一个元素所用时间都相同
– 缺点
•插入、删除操作需移动大量元素 插入、 插入 •算法复杂度 = O(n) 算法复杂度
2 线形表 /ds 18
相关文档
最新文档