《数据结构》线性表的定义顺序表示和实现(精)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PutElem( &L, i, &e )
ListInsert( &L, i, e ) ListDelete(&L, i, &e)
//改写
//插入 //删除
例1:假设:有两个集合 A 和 B 分别用两个线性表 LA 和
LB 表示,即:线性表中的数据元素即为集合中的成员。
现要求一个新的集合A=A∪B。 即扩大线性表 LA,将存在于线性表LB 中而不存在于 线性表 LA 中的数据元素插入到线性表 LA 中去。 操作步骤: 1.从线性表LB中依次察看每个数据元素; GetElem(LB, i)→e 2.依值在线性表LA中进行查访; LocateElem(LA, e, equal( )) 3.若不存在,则插入之。 ListInsert(LA, n+1, e)
目Leabharlann Baidu
第1章 第 2章 第 3章 第 4章 第6 章 第7章 第 9章 第10章
录
绪论 线性表 栈和队列 串 树和二叉树 图 查找 排序
数据结构课程的起点:
什么是 线性结构?
线性结构的基本特征:
线性结构 是一个数据元素的有序(次序)集 1.集合中必存在唯一的一个“第一元素”; 2.集合中必存在唯一的一个 “最后元素” 3.除最后元素在外,均有 唯一的后继; 4.除第一元素之外,均有 唯一的前驱。
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); }
特点:一对一
第2章
2.1 2.2 2.3
线性表
线性表的逻辑结构 线性表的顺序表示和实现 线性表的链式表示和实现
2.4
应用举例
2.1
线性表的逻辑结构
线性表的定义:用数据元素的有限序列表示
(a1, a2, … ai-1,ai, ai+1 ,…, an)
数据元素
线性起点
ai的直接前趋 ai的直接后继
线性终点
下标,是元素的 序号,表示元素 在表中的位置
n=0时称为
空表
n为元素总
个数,即表 长。n≥0
例1
分析26 个英文字母组成的英文表是什么结构。 ( A, B, C, D, …… , Z)
分析:数据元素都是同类型(字母), 元素间关系 是线性的。
例2 分析学生情况登记表是什么结构。
学号 012003010622 012003010704 012003010813 012003010906 012003011018 姓名 陈建武 赵玉凤 王 薛 王 泽 荃 春 性别 男 女 男 男 男 年龄 19 18 19 19 19 班级 2003级电信0301班 2003级电信0302班 2003级电信0303班 2003级电信0304班 2003级电信0305班
//和 e 相同的数据元素,则插入之
}
} // union
试改变结构,以有序表表示集合。
若线性表中的数据元素相互之间可以比较,并且数据
元素在线性表中依值非递减或非递增有序排列,即
ai≥ai-1 或 ai≤ai-1(i = 2,3,…, n),则称该线性表
为有序表(Ordered List)。 例如:(2,3,3,5,6,6,6,8,12)
:
:
:
:
:
分析:数据元素都是同类型(记录),元素间关系 是线性的。 注意:同一线性表中的元素必定具有相同特性 ! 试判断下列叙述的正误: “同一数据逻辑结构中的所有数据元素都具有相同的 特性”是指数据元素所包含的数据项的个数都相等。
×
是指各元素具有相同的数据类型
抽象数据类型线性表的定义如下: ADT List {
PriorElem( L, cur_e, &pre_e ) //前驱 NextElem(L,cur_e,&next_e) //后继
GetElem( L, i, &e ) //读取 LocateElem(L,e,compare()) //查找
ListTraverse(L, visit( )) 加工型操作 ClearList( &L ) //清空 //遍历
// La中不存在和 e 相同的数据元素,则插入之
} // union
例2:已知一个非纯集合 B,试构造一个纯集合 A, 使 A中只包含 B 中所有值各不相同的数据元素。
集合 B 从集合 B 取出物件放入集合 A 要求集合A中不能有同样物件
集合 A
因此,算法的策略应该和例1相同
void union(List &La, List Lb) { InitList(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_len, e); // La中不存在
对集合 B 而言, 值相同的数据元素必定相邻
对集合 A 而言, 数据元素依值从小至大的顺序插入
因此,数据结构改变了, 解决问题的 策略也相应要改变。
例3:归并两个“其数据元素按值非递减有序排列” 的有序表 LA 和 LB,求得有序表 LC 也具有同样特 性。
数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } 数据关系: R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n } 基本操作: 结构初始化操作 结构销毁操作 引用型操作 加工型操作 } ADT List
结构初始化操作 InitList( &L ) 操作结果:构造一个空的线性表L 结构销毁操作 DestroyList( &L ) 初始条件:线性表L已存在 操作结果:销毁线性表L 引用型操作: ListEmpty( L ) ListLength(L) //判空 //表长