线性表的类型定义

合集下载

线性表的定义

线性表的定义
(1) 初始化:设定一个空的线性表L。
(2) 求长度:线性表L中数据元素的个数len。
(3) 取元素:取线性表L中序号为i的数据元素, 若1≤i≤len,则函数值为线性表L中第i个数据 元素,否则为NULL。
(4) 定位:给定值item,若线性表L中有数据元 素等于item,则返回该数据元素的序号,若 有多个数据元素等于item,则返回最小的序 号,若无数据元素等于item,则返回0。
两个例子都是线性表:
➢ 某班级学生的数据库课程的成绩: (72,65,83, 94,87,98,57)
➢ 某车间职工的编号:(“0108”, “0110”, “0122” ,
"0132", "0718")
在稍复杂的线性表中,一个数据元素可能是由若干 个数据项组成的。
例如在例1-1给出的“人事登记表”中,每一个职工 的信息就是一个数据元素,它是由“编号”、“姓名 ”、“性别”、“出生日期”、“婚否”和“基本工 资”六个数据项组成的。
(7) 是否是空表:线性表L为空,则返回值1,否则 返回值0。
(8) 表清空:将线性表L设置为空表,即len = 0。
对线性表的操作还有很多,像取前驱、取后继、 排序等等。
数据结构
数据结构
线性表的定义
线性表(linear-list)是最常用最简单的一种数据结构。一 个线性表是n (n≥0)个相同类型数据元素的有限序列。 记为:
L= (a1, a2 , … , an ) 其中,L是表名,a1是第一个数据元素(也简称为元 素),无前驱,有一个后继;an是最后一个数据元素 (即第n个数据元素),有一个前驱,无后继。其余的每 个数据元素ai (i=2,3, … ,n-1)都只有一个前驱,且只有一 个后继。i (i=1,2, … ,n)称为表的序号。n是数据元素的 个数,也称为表的长度,若n=0,L称作空表。

第2章 线性表1-顺序表

第2章 线性表1-顺序表

a1 a2 … ai ai+
1
n-1 n
… an
length nn+1
e 插入完成
2.2 顺序存储结构的C语言定义
Status ListInsert(struct SqList *L,int i,ElemType e)
{ int j;
if (i<1 || i>L->length+1)
return ERROR ;
Status ListLength(struct SqList *L) {
return (L->length); }
2.2 顺序存储结构的C语言定义
(5)输出线性表DispList(L) 该运算当线性表L不为空时,顺序显示L中各元素的值。
void DispList(struct SqList *L) { int i;
2.1 线性表的抽象数据类型定义
ADT的形式化定义是三元组:ADT=(D,S,P) ADT List{
数据元素: D={ai| ai∈ElemSet, i=1,2,…,n,n≥0 }
数据关系: S={<ai,ai+1>|ai,ai+1∈ElemSet, i=1,2, …,n-1}
2.1 线性表的抽象数据类型定义
//参数错误时返回false
i--;
//将顺序表逻辑序号转化为物理序号
for (j=L->length;j>i;j--) //将data[i..n]元素后移一个位置
L->data[j]=L->data[j-1];
(6)LocateElem(L,e): 初始条件:L已存在 操作结果:返回L中第1个值域与e相等的逻辑位 序。若这样的元素不存在,则返回值为0。

chap2数据结构,顺序表,树,图,链表,排序

chap2数据结构,顺序表,树,图,链表,排序

2.4 一元多项式的表示
ADT List { 数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } { 称 n 为线性表的表长; 称 n=0 时的线性表为空表。} 数据关系:
R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n }
{ 设线性表为 (a1,a2, . . . ,ai,. . . ,an), 称 i 为 ai 在线性表中的位序。}
i = 1; found = TRUE; while ( i<= La_len && found ) {
GetElem(LA, i, e); // 取得LA中一个元素
if (LocateElem(LB, e, equal( ))
i++;
// 依次处理下一个
else found = FALSE;
// LB中没有和该元素相同的元素
{加工型操作} ClearList( &L ) ( 线性表置空 ) PutElem( &L, i, &e ) ( 改变数据元素的值 ) ListInsert( &L, i, e ) ( 插入数据元素 ) ListDelete( &L, i, &e ) ( 删除数据元素 )
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, e ) 初始条件: 线性表 L 已存在, 且 1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值和 e 相同。
线性结构的基本特征: 线性结构 是 一个数据元素的有序(次序)集 1.集合中必存在唯一的一个“第一元素” 2.集合中必存在唯一的一个 “最后元素”

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

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

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、其它操作 复制、分解、合并、分类等

数据链表

数据链表

数据元素插入到线性表 LA 中去。
操作步骤:
1.从线性表 LB 中依次察看每个数据元素;
GetElem(LB, i)→e
2.依值在线性表 LA 中进行查访;
LocateElem(LA, e, equal( )) 3.若不存在,则插入之。 ListInsert(LA, n+1, e) ( n 表示线性表 LA 当前长度)
void union(List &La, List Lb) { La_len = ListLength(La); // 求线性表的长度 Lb_len = ListLength(Lb); for (i = 1; i <= Lb_len; i++) { GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e if (!LocateElem(La, e, equal( )) ) ListInsert(La, ++La_len, e);
线性表是一种最简单的线性结构
线性结构的基本特征:
线性结构 是 一个数据元素的有序(次序)集
1.集合中必存在唯一的一个“第一元素”; 2.集合中必存在唯一的一个 “最后元素”
3.除最后元素在外,均有 唯一的后继;
4.除第一元素之外,均有 唯一的前驱。
2.1 线性表的类型定义和操作
2.2 线性表类型的实现 顺序映象 2.3 线性表类型的实现 链式映象
内存单元 ... a1 a2 a3 ai an ...
图2-1 线性表顺序存储结构示意图
以“存储位置相邻”表示有序对<ai-1,ai
即:LOC(ai) = LOC(ai-1) + L
一个数据元素所占存储量↑
所有数据元素的存储位置均取决于

2.1 线性表的顺序存储

2.1 线性表的顺序存储

P21算法 2.2
时间复杂度取决于List定义中基本操作的执行时间 假如: GetElem ,ListInsert操作执行时间与表长无关O(1) LocateElem操作执行时间与表长成正比O(n) 算法 2.1 时间复杂度: O(ListLength(La)* ListLength(Lb)) 算法 2.2 时间复杂度: O (ListLength(La)+ ListLength(Lb))
void MergeList(List La,List Lb,List &Lc) { InitList(Lc); //建立一个空表 i=j=l; k=0; La_len=ListLength(La); Lb_len=ListLength(Lb); while((i<La_len)&&(j<=Lb_len)) //La,Lb非空 { GetElem(La, i, ai); GetElem(Lb, j, bj); if (ai<=bj) {ListInsert(Lc,++k,ai);++i;} else {ListInsert(Lc,++k,bj);++j;} } while(i<=La_len){GetElem(La,i++,ai); ListInsert(Lc,++k,ai);} while(j<=Lb_len){GetElem(Lb,j++,bj); ListInsert(Lc,++k,bj);} } //MergeList
线性表的逻辑特征:在非空的线性表中, 有且仅有一个开始结点a1,它没有直接前趋,而仅 有一个直接后继a2; 有且仅有一个终端结点an,它没有直接后继,而仅 有一个直接前趋an-1; 其余的内部结点ai(2≤i≤ n-1)都有且仅有一个直接 前趋ai-1和一个直接后继ai+1。 线性表是一种典型的线性结构。 线性表中的数据元素可以是数字、符号、或者更 复杂的信息,但同一线性表中的元素必定具有相同 的性质。相邻数据元素之间存在着序偶关系。

第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.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中表格作为一个数据的 组织形式,这种组织形式就是数据元素(记录)“一个接 一个地排列”。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例2-2 已知一个非纯集合B,试构造一个纯 集合A,使A中只包含B中所有值各不相同 的数据元素。
void purge(List &La, List Lb) {
// 已知线性表Lb中的数据元素依值非递减 有序排列(Lb是有序表),
// 构造线性表La,使其只包含Lb中所有值 不相同的数据元素
InitList(LA); La_len = ListLength(La); Lb_len =ListLength(Lb); // 求线性表的长度 for (i = 1; i <= Lb_len; i++) { GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e if(!equal (en, e)) { //en初始化为LB中没有的值 ListInsert(La, ++La_len, e); en = e; } // La中不存在和 e 相同的数据元素,则插入之 } } // purge
{引用型操作}
ListEmpty( L ) 初始条件:线性表L已存在。 操作结果:若L为空表,则返回TRUE,否
则FALSE。 ListLength( L ) 初始条件:线性表L已存在。 操作结果:返回L中元素个数。
PriorElem( L, cur_e, &pre_e ) 初始条件:线性表L已存在。 操作结果:若cur_e是L的元素,但不是第
上述问题可演绎为,要求对线性表作如下 操作:扩大线性表LA,将存在于线性表 LB中而不存在于线性表LA中的数据元素 插入到线性表LA中去。
思路:
1.从线性表LB中依次取得每个数据元素; GetElem(LB, i)→e
2.依次在线性表LA中进行查访; LocateElem(LA, e, equal( ))
ai的直接后继是ai+1,an无直接 后继
元素同构,且不能出现缺项
线性表是一种典型的线性结构。
抽象数据类型线性表的定义如 下:
ADT List { 数据对象:D={ ai | ai ∈ElemSet,
i=1,2,...,n, n≥0 } {称n为线性表的表长; 称n=0时的线性表为空
表。} 数据关系:R1={ <ai-1 ,ai >|ai-1 ,ai∈D,
线性表的类型定义
Байду номын сангаас
线性结构是一个数据元素的有序(次序) 集
在数据元素的非空有限集中
线性 存在唯一的一个被称作“第一个”的数据元 结构 素
存在唯一的一个被称作“最后一个”的数据
特点: 元素
除第一个外,集合中的每个数据元素均只有 一个前驱
除最后一个外,集合中的每个数据元素均只 有一个后继
2.1 线性表的类型定义:
ListTraverse(L, visit( )) 初始条件:线性表L已存在。 操作结果:依次对L的每个元素调用函数
visit( )。一旦visit( )失败,则操 作失败。
{加工型操作}
ClearList( &L ) 初始条件:线性表L已存在。 操作结果:将L重置为空表。 PutElem( L, i, &e ) 初始条件:线性表L已存在,
3.若不存在,则插入之。 ListInsert(LA, n+1, e)
void union(List &La, List Lb) { // 将所有在线性表Lb中但不在La中的数据元素插
入到La中 La_len = ListLength(La); Lb_len =ListLength(Lb); // 求线性表的长度 for (i = 1; i <= Lb_len; i++) { GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e if(!LocateElem(La, e, equal( )) ListInsert(La, ++La_len1, e); // La中不存在和 e 相同的数据元素,则插入之 } } // union
1≤i≤LengthList(L) 操作结果:L中第i个元素赋值同e的值。
ListInsert( &L, i, e ) 初始条件:线性表L已存在,
1≤i≤LengthList(L)+1 操作结果:在L的第i个元素之前插入新的
元素e,L的长度增1。
ListDelete(&L, i, &e) 初始条件:线性表L已存在且非空,
1≤i≤LengthList(L) 操作结果:用e返回L中第i个元素的值。
LocateElem( L, e, compare( ) ) 初始条件:线性表L已存在,compare( )是
元素判定函数。
操作结果:返回L中第1个与e满足关系 compare( )的元素的位序。
若这样的元素不存在,则返回值为0。
定义: 一个线性表是n个数据元素的有限序列
如 a1 , a2, , ai , an
例 英文字母表(A,B,C,…..Z)是一个线性表
例 学号
姓名
001
张三
002
李四
……
……
年龄
数据元素
18
19
……
特征:
元素个数n—表长度,n=0空表 1<i<n时
ai的直接前驱是ai-1,a1无直接前 驱
1≤i≤LengthList(L) 操作结果:删除L的第i个元素,并用e返回
其值,L的长度减1。
} ADT List
利用上述定义的线性表可以完成其它 更复杂的操作
例2-1 假设有两个集合A和B分别用两个 线性表LA和LB表示(即:线性表中的数 据元素即为集合中的成员),现要求一 个新的集合A=A∪B。
i=2,...,n } {设线性表为 (a1,a2,...,ai,...,an), 称i为
ai在线性表中的位序。}
基本操作:
{结构初始化} InitList( &L ) 操作结果:构造一个空的线性表L。 {销毁结构} DestroyList( &L ) 初始条件:线性表L已存在。 操作结果:销毁线性表L。
一个,则用pre_e 返回它的 前驱,否则操作失败,pre_e无定义。
NextElem( L, cur_e, &next_e ) 初始条件:线性表L已存在。 操作结果:若cur_e是L的元素,但不是最
后一个,则用next_e返回它 的后继,否则操作失败,next_e无定义。
GetElem( L, cur_e, &next_e ) 初始条件:线性表L已存在,
相关文档
最新文档