数据结构经典课件 第2章 线性表
合集下载
数据结构第二章线性表.ppt
构造原理
用一组地址连续的存储单元依次存储线性表的数据元素,数 据元素之间的逻辑关系通过数据元素的存储位置直接反映。
k个单元 (a1,a2,a3,... ...,an)
a1 a2 a3
……
an
LOC(ai)
d1+k=d2 d3
………
dn
所谓一个元素的地址是指该元素占用的
若干(连续的)存储单元的第一个单元的地址。
LOC(a5)=100+(5-1)*4=116
线性表 11
顺序存储结构示意图
(a1,a2,a3,... ...,an)
当前已经占用的空间
尚未使用的空间
a1 a2 a3 … … an-1 an
01 2
n-2 n-1 n
……
n+1
M-1
事先分配给线性表的空间
线性表 12
一般来说,长度为n的线性表(a1,a2,…,an)在计算机中 的结构如下:
INSERT(L,x,i)。 6.删除线性表中第i个数据元素DELETE(L,i)。 7.对线性表中的数据元素进行升序或者降序排序。 8.将两个或两个以上的线性表合并成为一个线性表。 9.将一个线性表分解为两个或两个以上的线性表路】 依次输出线性表中的每个元素的值。
编写在线性表A中删除线性表B中出现的元素的算法。
1 3 57 9
12346
579
【算法思路】 依次检查线性表B中的每个元素,看它是否在线性表
A中。若在A中,则将其从A中删除。
线性表
5
void delete(Sqlist *A,Sqlist *B) {
int i,k;
datatype x;
for(i=1;i<=LENGTH(B);i++) {
用一组地址连续的存储单元依次存储线性表的数据元素,数 据元素之间的逻辑关系通过数据元素的存储位置直接反映。
k个单元 (a1,a2,a3,... ...,an)
a1 a2 a3
……
an
LOC(ai)
d1+k=d2 d3
………
dn
所谓一个元素的地址是指该元素占用的
若干(连续的)存储单元的第一个单元的地址。
LOC(a5)=100+(5-1)*4=116
线性表 11
顺序存储结构示意图
(a1,a2,a3,... ...,an)
当前已经占用的空间
尚未使用的空间
a1 a2 a3 … … an-1 an
01 2
n-2 n-1 n
……
n+1
M-1
事先分配给线性表的空间
线性表 12
一般来说,长度为n的线性表(a1,a2,…,an)在计算机中 的结构如下:
INSERT(L,x,i)。 6.删除线性表中第i个数据元素DELETE(L,i)。 7.对线性表中的数据元素进行升序或者降序排序。 8.将两个或两个以上的线性表合并成为一个线性表。 9.将一个线性表分解为两个或两个以上的线性表路】 依次输出线性表中的每个元素的值。
编写在线性表A中删除线性表B中出现的元素的算法。
1 3 57 9
12346
579
【算法思路】 依次检查线性表B中的每个元素,看它是否在线性表
A中。若在A中,则将其从A中删除。
线性表
5
void delete(Sqlist *A,Sqlist *B) {
int i,k;
datatype x;
for(i=1;i<=LENGTH(B);i++) {
《数据结构》课程课件第二章线性表
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章--线性表PPT课件
一个(尾)结点。
.
4
a1,a2,…ai-1都是ai(2≦i≦n)的前驱,其中ai-1是ai的直接 前驱; ai+1,ai+2,…an都是ai(1≦i ≦n-1)的后继,其中ai+1是ai的 直接后继。
2.1.2 线性表的逻辑结构
线性表中的数据元素ai所代表的具体含义随具体应 用的不同而不同,在线性表的定义中,只不过是一个抽 象的表示符号。
以下将对几种主要的操作进行讨论。
1 顺序线性表初始化
Status Init_SqList( SqList *L )
{ L->elem_array=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ;
if ( !L -> elem_array ) return ERROR ;
ListInsert ( L, i, &e )
初始条件:线性表L已存在,1≦i≦ListLength(L) ;
操作结果:在线性表L中的第i个位置插入元素e;
…
.
8
} ADT List
2.2 线性表的顺序存储
2.2.1 线性表的顺序存储结构
顺序存储 :把线性表的结点按逻辑顺序依次存放在 一组地址连续的存储单元里。用这种方法存储的线性表 简称顺序表。
在具体的机器环境下:设线性表的每个元素需占用L 个存储单元,以所占的第一个单元的存储地址作为数据元素 的存储位置。则线性表中第i+1个数据元素的存储位置 LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足 下列关系:
LOC(ai+1)=LOC(ai)+L
线性表的第i个数据元素ai的存储位置为:
大学数据结构课件2.线性表
线性表顺序存储结构的主要优缺点
主要优点: 主要优点 算法简单,空间单元利用率高; 算法简单,空间单元利用率高; 主要缺点: 主要缺点 1. 插入和删除时需要移动较多的数据元素,所以在频 插入和删除时需要移动较多的数据元素, 繁时行插入、删除操作时效率较低。 繁时行插入、删除操作时效率较低。 2.需要预先确定数据元素的最大个数。并预先占用一 需要预先确定数据元素的最大个数。 需要预先确定数据元素的最大个数 片地址连续的存储空间。 片地址连续的存储空间。 3. 如果插入数据元素量超过预先分配的存储空间时, 如果插入数据元素量超过预先分配的存储空间时, 要临时扩大有很大困难。 要临时扩大有很大困难。
elem [100] length=0
elem [0]=1 Elem[1]=2 … Elem[4]=5 … Elem[9]=10 length=10
Insert(&myList, i, i+1); Delete(&myList, 4); for(i = 0; i < Length(myList); i++) Get(myList, i, &x); }
程序设计如下: 程序设计如下: void main(void) {Sqlist myList; int i , x; Initiate(&myList); for(i = 0; i < 10; i++)
#include <stdio.h> #include "Sqlist.h" #define MAXSIZE 100 typedef int ElemType;
数据域 指针域
或
data next
2.3.1 结点结构与指针变量
第2章 线性表 (数据结构教程PPT课件)
3.在数组a中检索(查找)值为X的数据元素
int locate (int a[ ],int n, int x) { int i; i=0; while((i<=n-1)&&(a[i]!=x)) i++; if(i<=n-1) return (i); /*返回的是存储位置*/ else return (0);} }
(2)按值查找即定位 Locate_LinkList(L,x) Lnode * Locate_LinkList( LinkList L, datatype x) /*在单链表L中查找值为x的结点,找到后 返回其指针,否则返回空*/ { Lnode * p=L->next; while ( p!=NULL && p->data != x) p=p->next; return p; }
2.2.2 典型操作的算法实现
1. 初始化线性表L
SeqList *init_SeqList( )
{ SeqList *L; L=malloc(sizeof(SeqList)); L->last=-1; return L; }
2.在数组a第i个数据元素之(ai-1)前插入数据 元素X insert (int a[ ],int n,int i, int x) { int j; for(j=n-1;j>=i-1;j--) a[j+1]=a[j]; /* 结点移动 */ a[i-1]=x; /*新元素插入*/ n++; /*修改长度*/ }
4.删除数组a第i个数据元素(ai-1) delete (int a[ ],int n,int i) { int j; for(j=i;j<=n;j++) a[j-1]=a[j]; /* 结点移动 */ n--; /*修改长度*/ }
《第二章线性表》PPT课件
en = e; // en为最后一次La插入的值 } // La中不存在和 e 相同的数据元素,则插入
例 2-3
归并两个"其数据元素按值非递减有序 排列"的有序表 LA 和 LB,求得有序表 LC 也具有同样特性.
设 La = <a1, …, ai, …, an>, Lb = <b1, …, bj, …,
ListInsert<Lc, ++k, ai>; ++i; } else { // 将 bj 插入到 Lc 中
ListInsert<Lc, ++k, bj>; ++j; }
void MergeList<List La, List Lb, List &Lc> { // 本算法将非递减的有序表 La 和 Lb 归并为 LcInitList<Lc>; // 构造空的线性表 Lc
是最后一个元素,则用next_e 返回它的后继,否则操作失 败,next_e无定义。
GetElem< L, i, &e >
〔求线性表中某个数据元素〕
初始条件:线性表 L 已存在,
且 1≤i≤LengthList(L)
操作结果:用 e 返回L中第 i 个元素的值。
LocateElem< L, e, compare< > >
bj 插入到 LC 中; 4.重复 2 和 3 两步,直至 LA 或 LB 中元素
被取完为止; 5.将 LA 表或 LB 表中剩余元素复制插入到
LC 表中.
// La 和 Lb 均非空,i = j = 1, k = 0 GetElem<La, i, ai>; GetElem<Lb, j, bj>; if <ai <= bj> { // 将 ai 插入到 Lc 中
例 2-3
归并两个"其数据元素按值非递减有序 排列"的有序表 LA 和 LB,求得有序表 LC 也具有同样特性.
设 La = <a1, …, ai, …, an>, Lb = <b1, …, bj, …,
ListInsert<Lc, ++k, ai>; ++i; } else { // 将 bj 插入到 Lc 中
ListInsert<Lc, ++k, bj>; ++j; }
void MergeList<List La, List Lb, List &Lc> { // 本算法将非递减的有序表 La 和 Lb 归并为 LcInitList<Lc>; // 构造空的线性表 Lc
是最后一个元素,则用next_e 返回它的后继,否则操作失 败,next_e无定义。
GetElem< L, i, &e >
〔求线性表中某个数据元素〕
初始条件:线性表 L 已存在,
且 1≤i≤LengthList(L)
操作结果:用 e 返回L中第 i 个元素的值。
LocateElem< L, e, compare< > >
bj 插入到 LC 中; 4.重复 2 和 3 两步,直至 LA 或 LB 中元素
被取完为止; 5.将 LA 表或 LB 表中剩余元素复制插入到
LC 表中.
// La 和 Lb 均非空,i = j = 1, k = 0 GetElem<La, i, ai>; GetElem<Lb, j, bj>; if <ai <= bj> { // 将 ai 插入到 Lc 中
数据结构课件-第二章
1初始化单链表 Void InitList(LinkList *head) {/* 初始化单链表 */ head=(LinkList)malloc(Sizeof(ListNode)) /*申请头结点空间,并使头指针head指向头结点 */ head->next=NULL; /* 置链尾标记NULL */ }
2.4线性表的链式存储结构
链式存储结构用一组任意的存储单元依次存储 线性表里元素,这组存储单元可以是连续的, 也可以是不连续的,甚至是零散分布在内存的 任何位置上。
为反映出各元素在线性表中的逻辑关系,对每 个数据元素来说,除了存储其本身的信息之外 ,还需存储一个指示其直接后继的信息(即直 接后继的存储位置)。这两部分信息组成一个 数据元素的存储映象,称为结点(Node)。
例如,图2-4-2所示为线性表(dog,pig,cat,fox,hen,bat ,bee,bird)的单链表存储结构,整个链表的存取需从头指针开始 进行,依次顺着每个结点的指针域next找到线性表的各个元素,直 至next域为空为止。
通常我们用箭头表示链域中的指针:
typedef struct Node {ElemType data; /*数据域*/ struct Node *next; /*指针域*/ }ListNode,*LinkList;
2.3.1 线性表的顺序存储
线性表的顺序存储是指用一组地址连续的存储单元依 次存储线性表中的各个元素,使得线性表中在逻辑结 构上相邻的数据元素存储在相邻的存储单元中 。
假设线性表中有n个数据元素,每个数据元素占K个 存储单元,第一个元素a1的存储地址用LOC(a1)表示 ,第i个数据元素ai的地址用LOC(ai)表示,则: 第i个数据元素的地址为: LOC(ai)=LOC(a1)+(i-1)×K (1≤i≤n)
第二章 线性表PPT课件
(二)线性表的删除(1)
1﹑删除下标为i的 数据元素
例2.3 为在V[0]到V[99] 中删除一个元素 V[i],引用del1函数。 删除前后的线性表 的示意图如右
举例(续)
分析: ①初始条件: 数组V,
删除下标i ②删除条件:0≤i≤99 ③执行结果:1成功,0
不成功 ④N-S流程图如右:
举例(续)
(一)线性表插入操作(1)
1、在数组中下标为i的元 素前插入一个新元素。
例2.1 某C语言程序中, 整型数组V的99个元数 V[0]~V[98]组 成一个线性表。为了在V [i]位置前插入一个新元 素b,可用如下函数inst1 来实现,当插入成功时返 回1,否则返回0,所以该 函数的返回值类型是整型。 插入前后的线性表的示意 图如右:
第二章 线性表
2.1 线性表的逻辑结构 2.2 线性表的顺序存储结构 2.3线性表的链式存储结构 2.4 典型例题
线性表的特点是:在数据元素的非空有
限集中,(1)存在唯一的一个被称为 “第一个”的数据元素;(2)存在唯一
的一个被称为“最后一个”的数据元素; (3)除第一个以外,集合中的每一个数 据元素均有且只有一个前驱;(4)除最
V[99]=0; /*数组最后一个元素清0或某种结束标记*/ return 1; /*删除成功 */ }
线性表的删除操作(2)
2﹑在有序顺序表 中删除一个数据 元素
例2.4 在有序表中 删除一个值为x的 数据元素。当x的 值为78时删去前 后的线性表的
示意图如右:
举例(续)
分析: ①初始条件:数组
return 0; /*插入失败*/
} for (j=99;j>i;j--) v[j]=v[j-1];/*后移*/ v[i]=b; /*插入*/ return 1; /*插入成功 */ }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
特点: 逻辑结构与存储结构一致; 属于随机存取方式,即查找每个元素所花时间基本一样。
缺点: 空间难以扩充。
19
2.2.1 顺序表的类定义
template <class T> class arrList:public List<T> { private:
T* aList; int maxSzie; int curLen; int position; public: arrList(const int size) {
34
带头结点的单链表
head tail
带头结点的空表
head tail
\
\
35
带头结点的单链表构造函数和析构函数
template <class T> lnkList::lnkList(int defSize) {
head = tail = new Link<T>; }
template <class T> lnkList::~lnkList() {
//移动元素 //插入 //修改线性表长度
return true;
}
23
插入算法分析
假设在每个位置插入元素的概率相等,n为元素 个数,p=1/(n+1),平均移动元素的次数为:
∑ ∑ n
p×(n − i) =
1
n (n − i) = n
i=0
n +1 i=0
2
24
4
删除
aList k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 k10k11k12k13k14 aList k0 k1 k2 k3 k4 k5 k6 k8 k9 k10k11k12k13k14
maxSize = size; aList = new T[maxSize]; curLen = position =0; } ~arrList() { delete[ ] aList; }
void clear() { delete[ ] aList; curLen = position = 0; aList = new T[maxSize];
5
线性结构分类
直接访问型( direct access ) 顺序访问型(sequential access) 目录索引型(directory access)
6
1
2.1 线性表的概念
2.1.1 线性表的抽象数据类型 2.1.2 线性表的存储结构 2.1.3 线性表运算分类
7
8
2.1.1 线性表的抽象数据类型
template <class T>
bool arrList<T>::delete(const int p) {
if (curLen <= 0) { cout<<"No element to delete"<<endl; //判断空表
return false;
} if (p<0 ||p>curLen-1) {
造成这些局限性的主要原因: 事先定义存储线性表的存储空间容量 利用物理结构表示逻辑结构
29
LA = (k0,k1,k2,......kn-1)
......
链表是一种既存储线性
k2
......
表元素,又存储相互连
k1
接信息的结点集合。
......
k0
......
k3 .....
......
30
5
2.3.1 单链表
11
操作范例 List <T> MyList; bool b = MyList.setStart(); while (b) { DoSomething(MyList.getValue()); b = MyList.next(); }
12
2
2.1.2 线性表的存储结构
定长的顺序存储结构
简称顺序表,通常采用数组实现。特点:利用 一片连续的存储空间依次存放线性表元素,以 “物理位置相邻”表示逻辑位置。
Link<T> *tmp; while (head!=NULL) {
tmp=head; head=head->next; delete tmp; } }
36
6
1. 链表的检索
时间复杂度O(n)
template <class T>
Link<T> *lnkList<T>::setPos(int i) {
//判线性表是否为空
bool append(const T value);
//在表尾添加元素
bool insert(const int p, const T value); //在指定位置插入元素
bool delete(const int p);
//删除元素
bool getValue(const int p, T& value); //返回指定元素内容
直接前驱 直接后继
3
线性结构的基本特征:
1.集合中必存在唯一的一个“第一元素”; 2.集合中必存在唯一的一个 “最后元素”; 3.除最后元素之外,均有 唯一的后继; 4.除第一元素之外,均有 唯一的前驱。
4
线性结构的基本特点
均匀性:在同一个线性表中的各数据元 素具有相同的数据类型和长度。 有序性:各数据元素在线性表中都有自 己的位置,且数据元素之间的相对位置 是线性的。
结点结构:
data
线性表元素
next
指向后继结点
head
10
8
50
16 \
31
特点 逻辑顺序与物理顺序有可能不一致 属顺序存取的存储结构,即存取每个 数据元素所花费的时间不相等
32
单链表的结点定义
template <class T> class Link {
public: T data; Link<T> *next;
//判断p是否合法
cout<<"deletion is illegal"<<endl;
return false;
}
for (i=p;i<curLen-1;i++) aList[i]=aList[i+1]; //移动元素
curlen--;
//修改线性表长度
return true;
}
25
删除算法分析
假设删除每个元素的概率相等, n为元素 个数,p=1/n,平均移动元素的次数为
17
假设线性表中每个元素 需占用L 个存储单元
LOC(ki+1)=LOC(ki)+L
L: 一个数据元素所占存储量
b b+L b+2L b+3L
LOC(ki)
=LOC(k0)+i*L
↑基地址
b+(n-1)L
... k0 k1 k2 k3 k4 k5
...
kn-1
18
3
线性表中任意元素的存储位置:loc(ki) = loc(k
2.1 线性表概念 2.2 顺序表 2.3 链表 2.4 线性表实现方法的比较
1
线性表是一种最简单的线性结构
2
线性表的逻辑结构定义
线性表是一个含有n个数据元素的有限序列。
L= (a1, a2, a3, a4, a5, a6, .... , an) ai-1 , ai , ai+1 线性表长度
∑ ∑ n−1 p × (n − i −1) = 1 n−1 (n − i −1) = n −1
i=0
n i=0
2
26
顺序表基本运算时间复杂性 检索算法:O(1) 插入算法:O(n) 删除算法:O(n)
27
2.3 链表
2.3.1 单链表 2.3.2 双向链表 2.3.3 循环链表
28
顺序表的局限性
改变顺序表大小比较困难 插入、删除元素平均需要移动一半 的元素
} int length(); bool append(const T value); bool insert(const int p, const Tvalue); bool delete(const int p); bool setValue(const int p, const T value); bool getValue(const int p, T& value); bool getPos(int& p, const T value); };
变长的线性表存储结构
又称为链接式存储结构,简称链表。特点:利 用指针表示元素之间的关系。
13
2.1.3 线性表运算分类
创建线性表的一个实例(构造函数) 销毁线性表(析构函数) 获取当前线性表的相关信息 访问线性表并改变线性表的内容或结构 线性表的辅助性管理操作(求表长等)
14
2.2 顺序表
2.2.1 顺序表的类定义 2.2.2 顺序表的运算实现
15
顺序表概念
所谓顺序表就是采用定长的顺序存储结构表示 的线性表,又称为向量。 主要特性:
元素的类型相同。 元素顺序地存储在连续存储空间中,每一个 元素唯一的索引值。 使用常数作为向量长度。
16
用一组地址连续的存储单元 依次存放线性表中的数据元素
k0 k1 … ki-1 ki … kn-1
线性表的起始地址, 称作线性表的基地址
template <class T>
bool arrList<T>::insert(const int p, const T value) {
if (curLen>=maxSize) {
缺点: 空间难以扩充。
19
2.2.1 顺序表的类定义
template <class T> class arrList:public List<T> { private:
T* aList; int maxSzie; int curLen; int position; public: arrList(const int size) {
34
带头结点的单链表
head tail
带头结点的空表
head tail
\
\
35
带头结点的单链表构造函数和析构函数
template <class T> lnkList::lnkList(int defSize) {
head = tail = new Link<T>; }
template <class T> lnkList::~lnkList() {
//移动元素 //插入 //修改线性表长度
return true;
}
23
插入算法分析
假设在每个位置插入元素的概率相等,n为元素 个数,p=1/(n+1),平均移动元素的次数为:
∑ ∑ n
p×(n − i) =
1
n (n − i) = n
i=0
n +1 i=0
2
24
4
删除
aList k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 k10k11k12k13k14 aList k0 k1 k2 k3 k4 k5 k6 k8 k9 k10k11k12k13k14
maxSize = size; aList = new T[maxSize]; curLen = position =0; } ~arrList() { delete[ ] aList; }
void clear() { delete[ ] aList; curLen = position = 0; aList = new T[maxSize];
5
线性结构分类
直接访问型( direct access ) 顺序访问型(sequential access) 目录索引型(directory access)
6
1
2.1 线性表的概念
2.1.1 线性表的抽象数据类型 2.1.2 线性表的存储结构 2.1.3 线性表运算分类
7
8
2.1.1 线性表的抽象数据类型
template <class T>
bool arrList<T>::delete(const int p) {
if (curLen <= 0) { cout<<"No element to delete"<<endl; //判断空表
return false;
} if (p<0 ||p>curLen-1) {
造成这些局限性的主要原因: 事先定义存储线性表的存储空间容量 利用物理结构表示逻辑结构
29
LA = (k0,k1,k2,......kn-1)
......
链表是一种既存储线性
k2
......
表元素,又存储相互连
k1
接信息的结点集合。
......
k0
......
k3 .....
......
30
5
2.3.1 单链表
11
操作范例 List <T> MyList; bool b = MyList.setStart(); while (b) { DoSomething(MyList.getValue()); b = MyList.next(); }
12
2
2.1.2 线性表的存储结构
定长的顺序存储结构
简称顺序表,通常采用数组实现。特点:利用 一片连续的存储空间依次存放线性表元素,以 “物理位置相邻”表示逻辑位置。
Link<T> *tmp; while (head!=NULL) {
tmp=head; head=head->next; delete tmp; } }
36
6
1. 链表的检索
时间复杂度O(n)
template <class T>
Link<T> *lnkList<T>::setPos(int i) {
//判线性表是否为空
bool append(const T value);
//在表尾添加元素
bool insert(const int p, const T value); //在指定位置插入元素
bool delete(const int p);
//删除元素
bool getValue(const int p, T& value); //返回指定元素内容
直接前驱 直接后继
3
线性结构的基本特征:
1.集合中必存在唯一的一个“第一元素”; 2.集合中必存在唯一的一个 “最后元素”; 3.除最后元素之外,均有 唯一的后继; 4.除第一元素之外,均有 唯一的前驱。
4
线性结构的基本特点
均匀性:在同一个线性表中的各数据元 素具有相同的数据类型和长度。 有序性:各数据元素在线性表中都有自 己的位置,且数据元素之间的相对位置 是线性的。
结点结构:
data
线性表元素
next
指向后继结点
head
10
8
50
16 \
31
特点 逻辑顺序与物理顺序有可能不一致 属顺序存取的存储结构,即存取每个 数据元素所花费的时间不相等
32
单链表的结点定义
template <class T> class Link {
public: T data; Link<T> *next;
//判断p是否合法
cout<<"deletion is illegal"<<endl;
return false;
}
for (i=p;i<curLen-1;i++) aList[i]=aList[i+1]; //移动元素
curlen--;
//修改线性表长度
return true;
}
25
删除算法分析
假设删除每个元素的概率相等, n为元素 个数,p=1/n,平均移动元素的次数为
17
假设线性表中每个元素 需占用L 个存储单元
LOC(ki+1)=LOC(ki)+L
L: 一个数据元素所占存储量
b b+L b+2L b+3L
LOC(ki)
=LOC(k0)+i*L
↑基地址
b+(n-1)L
... k0 k1 k2 k3 k4 k5
...
kn-1
18
3
线性表中任意元素的存储位置:loc(ki) = loc(k
2.1 线性表概念 2.2 顺序表 2.3 链表 2.4 线性表实现方法的比较
1
线性表是一种最简单的线性结构
2
线性表的逻辑结构定义
线性表是一个含有n个数据元素的有限序列。
L= (a1, a2, a3, a4, a5, a6, .... , an) ai-1 , ai , ai+1 线性表长度
∑ ∑ n−1 p × (n − i −1) = 1 n−1 (n − i −1) = n −1
i=0
n i=0
2
26
顺序表基本运算时间复杂性 检索算法:O(1) 插入算法:O(n) 删除算法:O(n)
27
2.3 链表
2.3.1 单链表 2.3.2 双向链表 2.3.3 循环链表
28
顺序表的局限性
改变顺序表大小比较困难 插入、删除元素平均需要移动一半 的元素
} int length(); bool append(const T value); bool insert(const int p, const Tvalue); bool delete(const int p); bool setValue(const int p, const T value); bool getValue(const int p, T& value); bool getPos(int& p, const T value); };
变长的线性表存储结构
又称为链接式存储结构,简称链表。特点:利 用指针表示元素之间的关系。
13
2.1.3 线性表运算分类
创建线性表的一个实例(构造函数) 销毁线性表(析构函数) 获取当前线性表的相关信息 访问线性表并改变线性表的内容或结构 线性表的辅助性管理操作(求表长等)
14
2.2 顺序表
2.2.1 顺序表的类定义 2.2.2 顺序表的运算实现
15
顺序表概念
所谓顺序表就是采用定长的顺序存储结构表示 的线性表,又称为向量。 主要特性:
元素的类型相同。 元素顺序地存储在连续存储空间中,每一个 元素唯一的索引值。 使用常数作为向量长度。
16
用一组地址连续的存储单元 依次存放线性表中的数据元素
k0 k1 … ki-1 ki … kn-1
线性表的起始地址, 称作线性表的基地址
template <class T>
bool arrList<T>::insert(const int p, const T value) {
if (curLen>=maxSize) {