数据结构与算法--线性表(C++)演示课件
合集下载
《数据结构与算法C》PPT课件_OK

• 空表:表内无元素(长度为0)的表称为空表。 • 表头:称Ls的第1个元素为Ls的表头。 • 表尾:称Ls中除去表头后其余元素构成的表为表尾。
显然,表尾一定是表,但表头不一定。
• 递归表: 若表Ls中某成员含有自己(即Ls),则称Ls为递归 表。
5
• 深度:Ls的深度Depth(Ls)递归地定义为:
• 元素共享性:在同一广义表中,任一元素(单元素或 表)均可以出现多次,同一元素的多次出现都代表的是 同一个目标,可以认为它们是共享同一目标。对多次出 现的元素,显然可以从不同的位置(路径)访问它们, 因此,具有该特性的表也称再入表(Reentrant List)。
13
§8.1.5 基本操作
广义表兼有线性表和树的 特性,因此,它的基本操 作也兼有线性表和树的一 些操作,此外,还有一些 特有操作,如求表头和表 尾。 求表头和表尾是广义表的 重要操作,通过它们,可 以按递归方法处理广义表, 也可实现一般访问。著名 的人工智能语言LISP和 Prolog其实就是以广义表为 数据结构,通过求表头和 表尾实现对象的操作。
8
错误!未找到引用源。给出了广义表图的一个例子。
显然,广义表图中画出了广义表的所有结点。图中结点
之间的边表示“包含/属于”关系,即若结点A到B有边, 则表示B是A的子表之一(A包含B)。
广义表图与树相似,只是
L
由于存在共享元素,使得
广义表图中某些结点
A
C
DE
的“父亲”不唯一。
B
c de
ab
图 8-0 广义表L(见下式) 的逻辑图L(A(B(a,b)), C(B(a,b), c), D(c,d,e), E(e) )
12
• 元素分层性:如果将广义表中不同出现的元素看作不 同的元素,则广义表是层次结构,即对任一元素,它只 直属层号比它大1的元素。不过,广义表的层次性与树 不同,在树中,任一元素只直属一个元素。
显然,表尾一定是表,但表头不一定。
• 递归表: 若表Ls中某成员含有自己(即Ls),则称Ls为递归 表。
5
• 深度:Ls的深度Depth(Ls)递归地定义为:
• 元素共享性:在同一广义表中,任一元素(单元素或 表)均可以出现多次,同一元素的多次出现都代表的是 同一个目标,可以认为它们是共享同一目标。对多次出 现的元素,显然可以从不同的位置(路径)访问它们, 因此,具有该特性的表也称再入表(Reentrant List)。
13
§8.1.5 基本操作
广义表兼有线性表和树的 特性,因此,它的基本操 作也兼有线性表和树的一 些操作,此外,还有一些 特有操作,如求表头和表 尾。 求表头和表尾是广义表的 重要操作,通过它们,可 以按递归方法处理广义表, 也可实现一般访问。著名 的人工智能语言LISP和 Prolog其实就是以广义表为 数据结构,通过求表头和 表尾实现对象的操作。
8
错误!未找到引用源。给出了广义表图的一个例子。
显然,广义表图中画出了广义表的所有结点。图中结点
之间的边表示“包含/属于”关系,即若结点A到B有边, 则表示B是A的子表之一(A包含B)。
广义表图与树相似,只是
L
由于存在共享元素,使得
广义表图中某些结点
A
C
DE
的“父亲”不唯一。
B
c de
ab
图 8-0 广义表L(见下式) 的逻辑图L(A(B(a,b)), C(B(a,b), c), D(c,d,e), E(e) )
12
• 元素分层性:如果将广义表中不同出现的元素看作不 同的元素,则广义表是层次结构,即对任一元素,它只 直属层号比它大1的元素。不过,广义表的层次性与树 不同,在树中,任一元素只直属一个元素。
数据结构与算法--线性表(C++)PPT课件

精选ppt
4
几点说明:
a1 a2 a3 a4 a5 a6
▪(4) 线性表中元素的个数n 称为线性表的长度,
n=0 时称为空表;
▪(5) ai是线性表的第i 个元素,称i 为数据元素ai 的
序号,每一个元素在线性表中的位置,仅取决于它的序 号。
精选ppt
5
线性表的基本操作
1.int Length() const 初始条件:线性表已存在。 操作结果:返回线性表元素个数。
Essential of Lecture Two :
一、线性表的定义 二、线性表---顺序表 三、顺序表的基本操作 四、顺序表的优缺点 五、顺序表的应用
难点
精选ppt
重点
1
一、线性表的定义 ( Linear List )
▪ 【定义】:由n(n≧0)个数据元素(结点)a1,a2, …an组 成的有限序列。其中数据元素的个数n定义为表的长度。
线性表(a1,a2,a3, ... an) 的顺序存储结构
Loc(ai ) = Loc( a1 )+ ( i-1 ) * L
精选ppt
L个单元
a1 a2
…
ai-1
ai ai+1
…
an
Loc( a1) Loc( ai )
14
顺序表(SqList)类的定义
// 顺序表类
template <class elemType>
当n=0时称为空表,常常将非空的线性表(n>0)记作:
▪
(a1,a2, ... ... , an)
▪ 例1、26个英文字母组成的字母表
(A,B,C ,... ... , Z)
▪ 例2、某校从1978年到1983年各种型号的计算机拥有 量的变化情况。
数据结构之线性表课件

实现插入算法主要完成三个基本操作:
1) 在单链表上找到插入位置,即找到第i个结点。 可以用遍历的方法,即从表头起顺次访问单链
表的结点,直至找到第i个结点。 2) 生成一个以x为值的新结点。 可通过C的库函数malloc(size)来产生。 3) 将新结点链入单链表中。 需要改变相关结点的指针 ,如下面的图所示。
H
a1
an ^
空表
……
为了编程方便,一般在单链表的第一个 结点之前加一个“头结点”,如:
head
a1
an ^
当为空表时,即head->next=null, 如下图。
head
^
指针的概念
假设p是一个pointer类型,应正确区分指针型 变量、指针、指针所指的结点和结点的内容 这四个密切相关的不同概念:
2.1线性表的逻辑结构
线性表的定义 线性表是由n个结点a1,a2,…..,an 组成的有 限序列,当n=0时,线性表为空,即为空表。 若n>0, 则a1是第1个结点,an是最后一个结点。
其形式化的定义为: S=(D,R) 其中:D是由n个元素组成的集合, R是定义在集合D上的一种关系。
2.1线性表的逻辑结构
2. 元素的删除(Delete)
在顺序表L=(a1,a2,… ,ai,…,an)中删除第i个结 点,使成为
L=(a1,a2,…,ai-1, ai+1,…, an)
基本思想:要求删除第i个数据元素,由于线性 表元素在数组中必须连续排列,中间不能有空 单元,故将此元素删除后,它后面的所有元素 都需要向前移动一个单元,且数据元素总数由 原来的n减少到n-1.
数据结构之线性表课件
第二章 线性表
知 识 点
1) 在单链表上找到插入位置,即找到第i个结点。 可以用遍历的方法,即从表头起顺次访问单链
表的结点,直至找到第i个结点。 2) 生成一个以x为值的新结点。 可通过C的库函数malloc(size)来产生。 3) 将新结点链入单链表中。 需要改变相关结点的指针 ,如下面的图所示。
H
a1
an ^
空表
……
为了编程方便,一般在单链表的第一个 结点之前加一个“头结点”,如:
head
a1
an ^
当为空表时,即head->next=null, 如下图。
head
^
指针的概念
假设p是一个pointer类型,应正确区分指针型 变量、指针、指针所指的结点和结点的内容 这四个密切相关的不同概念:
2.1线性表的逻辑结构
线性表的定义 线性表是由n个结点a1,a2,…..,an 组成的有 限序列,当n=0时,线性表为空,即为空表。 若n>0, 则a1是第1个结点,an是最后一个结点。
其形式化的定义为: S=(D,R) 其中:D是由n个元素组成的集合, R是定义在集合D上的一种关系。
2.1线性表的逻辑结构
2. 元素的删除(Delete)
在顺序表L=(a1,a2,… ,ai,…,an)中删除第i个结 点,使成为
L=(a1,a2,…,ai-1, ai+1,…, an)
基本思想:要求删除第i个数据元素,由于线性 表元素在数组中必须连续排列,中间不能有空 单元,故将此元素删除后,它后面的所有元素 都需要向前移动一个单元,且数据元素总数由 原来的n减少到n-1.
数据结构之线性表课件
第二章 线性表
知 识 点
数据结构线性表ppt课件

01
02
03
04
插入操作
在链表的指定位置插入一个新 节点,需要修改相邻节点的指
针。
删除操作
删除链表的指定节点,需要修 改相邻节点的指针。
查找操作
从链表的头节点开始,顺序遍 历链表,直到找到目标元素或
遍历到链表末尾。
遍历操作
从链表的头节点开始,顺序访 问每个节点,直到遍历到链表
末尾。
04 线性表应用举例 与问题分析
多项式表示与计算问题
01
02
03
多项式表示方法
数组表示法和链表表示法 。
数组表示法
将多项式的系数按次序存 放在一个数组中,通过下 标表示对应的幂次。
链表表示法
每个节点包含系数和指数 两个数据域,以及一个指 向下一个节点的指针域。
一元多项式相加算法设计
• 算法思想:将两个多项式中的同类项系数相加,得到新的 多项式。
删除操作
删除指定位置i的元素,需要将i之后的元素都向前移动 一个位置。
03 链式存储结构及 其实现
链式存储结构原理及特点
链式存储结构原理
使用一组任意的存储单元存储线 性表的数据元素(这组存储单元 可以是连续的,也可以是不连续 的)。
链式存储结构特点
逻辑上相邻的元素在物理位置上 不一定相邻,元素之间的逻辑关 系是通过指针链接来表示的。
...,an组成的有序序列。
性质
集合中必存在唯一的一个“第一元素 ”。
集合中必存在唯一的一个“最后元素 ”。
除最后元素之外,均有唯一的后继。
除第一元素之外,均有唯一的前驱。
线性表与数组关系
数组是线性表的一种表现和实现形式。
线性表更侧重于逻辑概念,而数组则是这种逻辑概念在计算机中的一种存储方式。
第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--; /*修改长度*/ }
精品课件-数据结构实用教程(C语言版)-第二章 线性表

线性表是一种最简单的线性结构 线性结构是一个数据元素的有序(次序)集
线性结构的基本特征:
1.集合中必存在唯一的一个“第一元素”; 2.集合中必存在唯一的一个 “最后元素” 3.除最后元素之外,均有 唯一的后继; 4.除第一元素之外,均有 唯一的前驱。
例如:alphabet=(a,b,c,…,z) 和 prime=(2,3,5,7,11,…,97)alphabet是字母表,其结点是一个英 文字母,prime是100以内的素数表,结点是整型数。且只有一个 域的线性表,
void * malloc(unsigned int size); 在内存的动态存储区中分配一个长度size的连续空间.此函数
的返回值是一个指向分配域起始地址的指针(类型为void). 2. calloc函数
void * calloc(unsigned n,unsigned size); 其作用是在内存的动态分配区中分配n个长度为size的连续空
(n
n 1 i1
i
1)
n 2
在线性表中任何一个位置上删除一个元素所移动元素的平均次
数为:
Edl
1
n
(n
n i1
i)
n 1 2
利用上述定义的线性表类型 可以实现其它更复杂的操作
例 2-1 例 2-2
例 2-1
假设:有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即:线性表中的数据元素即为集合中的成员。
(a1, …, ai-1, ai, …, an) 改变为 (a1, …, ai-1, e, ai, …, an)
<ai-1, ai>
<ai-1, e>, <e, ai>
a1 a2
线性结构的基本特征:
1.集合中必存在唯一的一个“第一元素”; 2.集合中必存在唯一的一个 “最后元素” 3.除最后元素之外,均有 唯一的后继; 4.除第一元素之外,均有 唯一的前驱。
例如:alphabet=(a,b,c,…,z) 和 prime=(2,3,5,7,11,…,97)alphabet是字母表,其结点是一个英 文字母,prime是100以内的素数表,结点是整型数。且只有一个 域的线性表,
void * malloc(unsigned int size); 在内存的动态存储区中分配一个长度size的连续空间.此函数
的返回值是一个指向分配域起始地址的指针(类型为void). 2. calloc函数
void * calloc(unsigned n,unsigned size); 其作用是在内存的动态分配区中分配n个长度为size的连续空
(n
n 1 i1
i
1)
n 2
在线性表中任何一个位置上删除一个元素所移动元素的平均次
数为:
Edl
1
n
(n
n i1
i)
n 1 2
利用上述定义的线性表类型 可以实现其它更复杂的操作
例 2-1 例 2-2
例 2-1
假设:有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即:线性表中的数据元素即为集合中的成员。
(a1, …, ai-1, ai, …, an) 改变为 (a1, …, ai-1, e, ai, …, an)
<ai-1, ai>
<ai-1, e>, <e, ai>
a1 a2
数据结构与算法线性表.ppt

线性结构分类
按操作划分
线性表
• 所有表目都是同一类型结点的线性表 • 不限制操作形式 • 根据存储的不同分为:顺序表,链表
栈(LIFO, Last In First Out)
• 插入和删除操作都限制在表的同一端进行
队列(FIFO, First In First Out)
• 插入操作在表的一端, 删除操作在另一端
bool append(const T value); // 在表尾添加一个元素value,表的长度增1
bool insert(const int p, const T value);
// 在位置p上插入一个元素value,表的长度增1
bool delete(const int p);
// 删除位置p上的元素,表的长度减 1
bool getPos(int & p, const T value)
// 查找值为value的元素并返回其位置
bool getValue(const int p, T& value);
// 把位置p的元素值返回到变量value中
bool setValue(const int p, const T value);// 用value修改位置p的元素值
有序性:各数据元素在线性表中都有自己的位置,且 数据元素之间的相对位置是线性的
线性结构
包括:
简单的
• 线性表 •栈 • 队列 • 散列表
高级的
• 广义表 • 多维数组 • 文件
……
线性结构分类
按访问方式划分
直接访问型(direct access) 顺序访问型( sequential access) 目录索引型(directory access)
(C语言详细版)第二章 线性表ppt课件

这种方法可以解决方案一中的“上溢”问题和“空间利用 率不高”问题。但是这一方案是有时间和空间代价的:当 因插入元素而空间不足时,需要重新分配比原先的顺序表 多存储LISTINCREMENT个数据元素的连续空间,并且需 要将原空间的数据元素复制到新分配的空间中。
2018/11/13
卓月明
12
2.2线性表的顺序表示和实现 --类型定义与基本操作实现
卓月明 4
2018/11/13
2.1 线性表的类型定义
在稍复杂的线性表中,一个数据元素可以由若干个数据项 (Item)组成。 在这种情况下,常把数据元素称为记录(Record),含有大量记录的线性 表又称文件(File)。 例如,一个学校的学生健康情况登记表如图所示,表中每个学生的情况 为一个记录,它由姓名、学号、性别、年龄、班级和健康状况等六个数 据项组成。
(C语言详细版)第二章 线性表
第二章 线性表
从第2章至第4章将讨论线性结构。 线性结构的特点是:
在数据元素的非空有限集中,
(1)存在唯一的一个被称做“第一个”的数据元素; (2)存在唯一的一个被称做“最后一个”的数据元素; (3)除第一个之外,集合中的每个数据元素均只有一 个前驱; (4)除最后一个之外,集合中每个数据元素均只有一 个后继。
2.2 线性表的顺序表示和实现
若要在实际的程序设计中真正引用线性表的基本操作, 首先必须实现线性表类型。即在计算机中确定它的存 储结构并在此存储结构上实现类型中定义的所有基本 操作。本节将讨论它的顺序存储结构以及在顺序存储 结构中基本操作的实现。
何谓顺序存储表示?
顺序存储表示指的是,以数据元素在存储器中的"相对位置"来 表示数据元素之间的逻辑关系。你还记得吗?
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
初始条件:线性表已存在,1≤position≤Length()。 操作结果:将线性表的第position个位置的元素赋 值为e。
9
线性表的基本操作
7.StatusCode Delete(int position, ElemType &e) 初始条件:线性表已存在,1≤position≤Length()。 操作结果:删除线性表的第position个位置的元素, 并 用e返回其值,长度减1。
姓名 王小林
学号 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) 线性表的数据元素可以是各种各样的,但同一线
public:
// 抽象数据类型方法声明及重载编译系统默认
// 方法声明:
SqList(int size = DEFAULT_SIZE);// 构造函数
virtual ~SqList();st; // 求线性表长度
bool Empty() const; // 判断线性表是否为空
8
线性表的基本操作
5.StatusCode GetElem(int position, ElemType &e) const
初始条件:线性表已存在,1≤position≤Length()。 操作结果:用e返回第position个元素的值。
6.StatusCode SetElem(int position, const ElemType &e)
6
线性表的基本操作
3.void Clear() 初始条件:线性表已存在。 操作结果:清空线性表。
4.void Traverse(void (*visit)(const ElemType &)) const
初始条件:线性表已存在。 操作结果:依次对线性表的每个元素调用函数 (*visit)。
7
为表示各种状态信息,定义枚举类型 StatusCode供使用,具体声明如下:
return RANGE_ERROR; }
24
插入算法
else
{ // 成功
count++;
// 插入后元素个数将自增1
for (int curPosition = len;
curPosition >= position; curPosition--)
{ // 插入位置之后的元素右移
GetElem(curPosition, tmp);
// 自定义类型 enum StatusCode {
SUCCESS, FAIL, UNDER_FLOW, OVER_FLOW,RANGE_ERROR, DUPLICATE_ERROR, NOT_PRESENT, ENTRY_INSERTED, ENTRY_FOUND, VISITED, UNVISITED };
void Clear();
// 将线性表清空
16
void Traverse(void (*Visit)(const elemType &))
const;
// 遍历线性表
StatusCode GetElem(int position, elemType &e) const;
// 求指定位置的元素
StatusCode SetElem(int position, const elemType &e);
当n=0时称为空表,常常将非空的线性表(n>0)记作:
▪
(a1,a2, ... ... , an)
▪ 例1、26个英文字母组成的字母表 (A,B,C ,... ... , Z)
▪ 例2、某校从1978年到1983年各种型号的计算机拥有 量的变化情况。
(6,17,28,50,92,188)
2
例3、学生健康情况登记表
为了存储线性表,至少要保存两类信息: 1)线性表中的数据元素; 2)线性表中数据元素的顺序关系;
11
线性表按存储分类: 1)顺序表 SqList 2)链表 线性链表 SimpleLinkList
循环链表 SimpleCircLinkList 双向链表 SimpleDblLinkList 静态链表 StLinkList
const ElemType &e) // 操作结果:在线性表的第position个位置前插入元素e, //position的的取值范围为1≤position≤Length()+1 //如线性表已满,则返回OVER_FLOW, //如position合法, 则返回SUCCESS, 否则函数返回 //RANGE_ERROR {
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范围错
性表中的元素必须是同一类型的;
▪(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,
Essential of Lecture Two :
一、线性表的定义
二、线性表---顺序表 三、顺序表的基本操作 四、顺序表的优缺点 五、顺序表的应用
难点
重点
1
一、线性表的定义 ( Linear List )
▪ 【定义】:由n(n≧0)个数据元素(结点)a1,a2, …an组 成的有限序列。其中数据元素的个数n定义为表的长度。
// 复制构造函数
SqList<elemType> &operator =(const
SqList<elemType> ©); // 赋值语句重载
};
17
顺序表辅助函数的实现
template <class ElemType> bool SqList<ElemType>::Full() const // 操作结果:如线性表已满,则返回true,否则返回
// 设置指定位置的元素值
StatusCode Delete(int position, elemType &e);
// 删除元素
StatusCode Insert(int position, const elemType &e);
// 插入元素
SqList(const SqList<elemType> ©);
8.StatusCode Insert(int position, const ElemType &e) 初始条件:线性表已存在,1≤position≤Length()+1。 操作结果:在线性表的第position个位置前插入元素e, 长度加1。
10
如何在计算机中存储线性表? 如何在计算机中实现线性表的 基本操作?
false {
return count == maxSize; }
18
template <class ElemType>
void SqList<ElemType>::Init(int size)
// 操作结果:初始化线性表为最大元素个数为size的空线
// 性表
{
maxSize = size;
// 最大元素个数
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
// 释放存储空间
}
20
三、顺序表的基本操作
1、插入
指在表的第i(1≦i≦n+1)个位置上,插入 一个新结点x,使长度为n的线性表变为长 度为n+1的线性表:
9
线性表的基本操作
7.StatusCode Delete(int position, ElemType &e) 初始条件:线性表已存在,1≤position≤Length()。 操作结果:删除线性表的第position个位置的元素, 并 用e返回其值,长度减1。
姓名 王小林
学号 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) 线性表的数据元素可以是各种各样的,但同一线
public:
// 抽象数据类型方法声明及重载编译系统默认
// 方法声明:
SqList(int size = DEFAULT_SIZE);// 构造函数
virtual ~SqList();st; // 求线性表长度
bool Empty() const; // 判断线性表是否为空
8
线性表的基本操作
5.StatusCode GetElem(int position, ElemType &e) const
初始条件:线性表已存在,1≤position≤Length()。 操作结果:用e返回第position个元素的值。
6.StatusCode SetElem(int position, const ElemType &e)
6
线性表的基本操作
3.void Clear() 初始条件:线性表已存在。 操作结果:清空线性表。
4.void Traverse(void (*visit)(const ElemType &)) const
初始条件:线性表已存在。 操作结果:依次对线性表的每个元素调用函数 (*visit)。
7
为表示各种状态信息,定义枚举类型 StatusCode供使用,具体声明如下:
return RANGE_ERROR; }
24
插入算法
else
{ // 成功
count++;
// 插入后元素个数将自增1
for (int curPosition = len;
curPosition >= position; curPosition--)
{ // 插入位置之后的元素右移
GetElem(curPosition, tmp);
// 自定义类型 enum StatusCode {
SUCCESS, FAIL, UNDER_FLOW, OVER_FLOW,RANGE_ERROR, DUPLICATE_ERROR, NOT_PRESENT, ENTRY_INSERTED, ENTRY_FOUND, VISITED, UNVISITED };
void Clear();
// 将线性表清空
16
void Traverse(void (*Visit)(const elemType &))
const;
// 遍历线性表
StatusCode GetElem(int position, elemType &e) const;
// 求指定位置的元素
StatusCode SetElem(int position, const elemType &e);
当n=0时称为空表,常常将非空的线性表(n>0)记作:
▪
(a1,a2, ... ... , an)
▪ 例1、26个英文字母组成的字母表 (A,B,C ,... ... , Z)
▪ 例2、某校从1978年到1983年各种型号的计算机拥有 量的变化情况。
(6,17,28,50,92,188)
2
例3、学生健康情况登记表
为了存储线性表,至少要保存两类信息: 1)线性表中的数据元素; 2)线性表中数据元素的顺序关系;
11
线性表按存储分类: 1)顺序表 SqList 2)链表 线性链表 SimpleLinkList
循环链表 SimpleCircLinkList 双向链表 SimpleDblLinkList 静态链表 StLinkList
const ElemType &e) // 操作结果:在线性表的第position个位置前插入元素e, //position的的取值范围为1≤position≤Length()+1 //如线性表已满,则返回OVER_FLOW, //如position合法, 则返回SUCCESS, 否则函数返回 //RANGE_ERROR {
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范围错
性表中的元素必须是同一类型的;
▪(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,
Essential of Lecture Two :
一、线性表的定义
二、线性表---顺序表 三、顺序表的基本操作 四、顺序表的优缺点 五、顺序表的应用
难点
重点
1
一、线性表的定义 ( Linear List )
▪ 【定义】:由n(n≧0)个数据元素(结点)a1,a2, …an组 成的有限序列。其中数据元素的个数n定义为表的长度。
// 复制构造函数
SqList<elemType> &operator =(const
SqList<elemType> ©); // 赋值语句重载
};
17
顺序表辅助函数的实现
template <class ElemType> bool SqList<ElemType>::Full() const // 操作结果:如线性表已满,则返回true,否则返回
// 设置指定位置的元素值
StatusCode Delete(int position, elemType &e);
// 删除元素
StatusCode Insert(int position, const elemType &e);
// 插入元素
SqList(const SqList<elemType> ©);
8.StatusCode Insert(int position, const ElemType &e) 初始条件:线性表已存在,1≤position≤Length()+1。 操作结果:在线性表的第position个位置前插入元素e, 长度加1。
10
如何在计算机中存储线性表? 如何在计算机中实现线性表的 基本操作?
false {
return count == maxSize; }
18
template <class ElemType>
void SqList<ElemType>::Init(int size)
// 操作结果:初始化线性表为最大元素个数为size的空线
// 性表
{
maxSize = size;
// 最大元素个数
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
// 释放存储空间
}
20
三、顺序表的基本操作
1、插入
指在表的第i(1≦i≦n+1)个位置上,插入 一个新结点x,使长度为n的线性表变为长 度为n+1的线性表: