当前位置:
文档之家› 数据结构经典课件 第2章 线性表
数据结构经典课件 第2章 线性表
特点: 逻辑结构与存储结构一致; 属于随机存取方式,即查找每个元素所花时间基本一样。
缺点: 空间难以扩充。
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) {