数据结构与算法--线性表(C++)演示课件

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
初始条件:线性表已存在,1≤position≤Length()。 操作结果:将线性表的第position个位置的元素赋 值为e。
9
线性表的基本操作
7.StatusCode Delete(int position, ElemType &e) 初始条件:线性表已存在,1≤position≤Length()。 操作结果:删除线性表的第position个位置的元素, 并 用e返回其值,长度减1。
4
几点说明:
a1 a2 a3 a4 a5 a6
▪(4) 线性表中元素的个数n 称为线性表的长度,
n=0 时称为空表;
▪(5) ai是线性表的第i 个元素,称i 为数据元素ai 的
序号,每一个元素在线性表中的位置,仅取决于它的序 号。
5
线性表的基本操作
1.int Length() const 初始条件:线性表已存在。 操作结果:返回线性表元素个数。 2.bool Empty() const 初始条件:线性表已存在。 操作结果:如线性表为空,则返回true,否则返 回false。
// 释放存储空间
}
20
三、顺序表的基本操作
1、插入
指在表的第i(1≦i≦n+1)个位置上,插入 一个新结点x,使长度为n的线性表变为长 度为n+1的线性表:
(a1,a2,…,ai-1,ai,…,an)
(a1,a2,…,ai-1, x, ai,…,an)
21
例如:在i=4的位置插入 x=50
1 23 4 5 6 7 8
false {
return count == maxSize; }
18
template <class ElemType>
void SqList<ElemType>::Init(int size)
// 操作结果:初始化线性表为最大元素个数为size的空线
// 性表
{
maxSize = size;
// 最大元素个数
return RANGE_ERROR; }
24
插入算法
else
{ // 成功
count++;
// 插入后元素个数将自增1
for (int curPosition = len;
curPosition >= position; curPosition--)
{ // 插入位置之后的元素右移
GetElem(curPosition, tmp);
性表中的元素必须是同一类型的;
▪(2) 在表中 ai-1 领先于ai ,ai 领先于ai+1 ,称ai-1 是ai
的直接前驱,ai+1 是ai 的直接后继;
▪(3) 在线性表中,除第一个元素和最后一个元素
之外,其他元素都有且仅有一个直接前驱,有且仅有 一个直接后继,具有这种结构特征的数据结构称为线 性结构;
data 25 34 57 16 48 09 63 i
1 23 4 5 6 7 8
data 25 34 57 1560 1468 4098 0693 63
22
插入算法
template <class ElemType> StatusCode SqList<ElemType>::Insert(int position,
// 自定义类型 enum StatusCode {
SUCCESS, FAIL, UNDER_FLOW, OVER_FLOW,RANGE_ERROR, DUPLICATE_ERROR, NOT_PRESENT, ENTRY_INSERTED, ENTRY_FOUND, VISITED, UNVISITED };
Essential of Lecture Two :
一、线性表的定义
二、线性表---顺序表 三、顺序表的基本操作 四、顺序表的优缺点 五、顺序表的应用
难点
重点
1
一、线性表的定义 ( Linear List )
Байду номын сангаас
▪ 【定义】:由n(n≧0)个数据元素(结点)a1,a2, …an组 成的有限序列。其中数据元素的个数n定义为表的长度。
12
二、顺序表 Sequential List
顺序表的定义和特点
定义: 将线性表中的元素相继存放在一个 连续的存储空间中。
可利用一维数组描述存储结构 特点: 线性表的顺序存储方式 遍历: 顺序访问
13
二、顺序表 Sequential List
线性表的顺序表示,就是 用一组地址连续的内存单元依 次存放线性表的数据元素。
SetElem(curPosition + 1, tmp);
}
SetElem(position, e);//将e赋值到position位置处
return SUCCESS; // 插入成功
}
} 25
插入算法分析
上述算法for循环语句的执行次数为n-i+1; 若i=1,需移动全部n个结点(最坏:O(n)) 若i=n+1(在表尾插入),无需移动结点,直接 插入即可。(最好: O(1)) 移动结点的平均次数:
6
线性表的基本操作
3.void Clear() 初始条件:线性表已存在。 操作结果:清空线性表。
4.void Traverse(void (*visit)(const ElemType &)) const
初始条件:线性表已存在。 操作结果:依次对线性表的每个元素调用函数 (*visit)。
7
为表示各种状态信息,定义枚举类型 StatusCode供使用,具体声明如下:
const ElemType &e) // 操作结果:在线性表的第position个位置前插入元素e, //position的的取值范围为1≤position≤Length()+1 //如线性表已满,则返回OVER_FLOW, //如position合法, 则返回SUCCESS, 否则函数返回 //RANGE_ERROR {
if (elems != NULL) delete []elems;// 释放存储空间
elems = new ElemType[maxSize];// 分配存储空间
count = 0;
// 空线性表元素个数为0
}
19
顺序表部分公共操作的实现
template <class ElemType>
SqList<ElemType>::SqList(int size)
8
线性表的基本操作
5.StatusCode GetElem(int position, ElemType &e) const
初始条件:线性表已存在,1≤position≤Length()。 操作结果:用e返回第position个元素的值。
6.StatusCode SetElem(int position, const ElemType &e)
姓名 王小林
学号 020631
性别 男
年龄 18
陈 红 020632

20
刘建平 020633

21
张立立 020634

17
……..
…….. ……. …….
健康情况 健康 一般 健康
神经衰弱 …….
3
几点说明:
a1 a2 a3 a4 a5 a6
▪ 设 A=(a1, a2, ... , ai -1, ai , ai+1, …, an )是一线性表 ▪(1) 线性表的数据元素可以是各种各样的,但同一线
class SqList
{
protected:
// 顺序表实现的数据成员:
int count;
// 元素个数
int maxSize; // 顺序表最大元素个数
elemType *elems; // 元素存储空间
15
// 辅助函数 bool Full() const; // 判断线性表是否已满 void Init(int size); // 初始化线性表
int len = Length(); ElemType tmp;
23
插入算法
if (Full()) { // 线性表已满返回OVER_FLOW
return OVER_FLOW; } else if (position < 1 || position > len + 1) { // position范围错
void Clear();
// 将线性表清空
16
void Traverse(void (*Visit)(const elemType &))
const;
// 遍历线性表
StatusCode GetElem(int position, elemType &e) const;
// 求指定位置的元素
StatusCode SetElem(int position, const elemType &e);
线性表(a1,a2,a3, ... an) 的顺序存储结构
Loc(ai ) = Loc( a1 )+ ( i-1 ) * L
L个单元
a1 a2

ai-1
ai ai+1

an
Loc( a1) Loc( ai )
14
顺序表(SqList)类的定义
// 顺序表类
template <class elemType>
为了存储线性表,至少要保存两类信息: 1)线性表中的数据元素; 2)线性表中数据元素的顺序关系;
11
线性表按存储分类: 1)顺序表 SqList 2)链表 线性链表 SimpleLinkList
循环链表 SimpleCircLinkList 双向链表 SimpleDblLinkList 静态链表 StLinkList
// 复制构造函数
SqList<elemType> &operator =(const
SqList<elemType> &copy); // 赋值语句重载
};
17
顺序表辅助函数的实现
template <class ElemType> bool SqList<ElemType>::Full() const // 操作结果:如线性表已满,则返回true,否则返回
1 23 4 5 6 7 8
// 设置指定位置的元素值
StatusCode Delete(int position, elemType &e);
// 删除元素
StatusCode Insert(int position, const elemType &e);
// 插入元素
SqList(const SqList<elemType> &copy);
27
2、删除
将线性表的第i(1≦i≦n)个结点删除,使长 度为n的线性表变为长度为n-1的线性表:
(a1,a2,…,ai-1,ai, ai+1 ,…,an)
(a1,a2,…,ai-1, ai+1,…,an)
28
例如:删除第 i个元素,i=5
1 23 4 5 6 7 8
data 25 34 57 50 16 48 09 63 i
// 操作结果:构造一个最大元素个数为size的空顺序表
{
elems = NULL; 前,elems为空
// 未分配存储空间
Init(size);
// 初始化线性表
}
template <class ElemType>
SqList<ElemType>::~SqList()
// 操作结果:销毁线性表
{
delete [ ]elems;
∑ n+1
Eis = Pi(n i +1)
i=1
26
插入算法分析
按等概率考虑:
可能的插入位置为i=1,2,……n,n+1共n+1个, 则pi= 1/(n+1)
∑ ∑ n+1
1 n+1
Eis= Pi(n
i=1
i+1)= (n n+1i=1
i+1)
1( n0)+(nn) n
=
(n+1)=
n+1 2
2
顺序表插入算法平均约需移动一半结点。
当n=0时称为空表,常常将非空的线性表(n>0)记作:

(a1,a2, ... ... , an)
▪ 例1、26个英文字母组成的字母表 (A,B,C ,... ... , Z)
▪ 例2、某校从1978年到1983年各种型号的计算机拥有 量的变化情况。
(6,17,28,50,92,188)
2
例3、学生健康情况登记表
8.StatusCode Insert(int position, const ElemType &e) 初始条件:线性表已存在,1≤position≤Length()+1。 操作结果:在线性表的第position个位置前插入元素e, 长度加1。
10
如何在计算机中存储线性表? 如何在计算机中实现线性表的 基本操作?
public:
// 抽象数据类型方法声明及重载编译系统默认
// 方法声明:
SqList(int size = DEFAULT_SIZE);// 构造函数
virtual ~SqList(); // 析构函数
int Length() const; // 求线性表长度
bool Empty() const; // 判断线性表是否为空
相关文档
最新文档