为什么线性表链式存储的链式存储所需要的存储空间一般要多于顺序存储结构?

线性表链式存储的存储结构定义忣其基本操作(实验报告).doc

线性表链式存储的存储结构定义及基本操作(实验报告)
. 掌握线性表链式存储的逻辑特征
. 掌握线性表链式存储顺序存储結构的特点,熟练掌握顺序表的基本运算
. 熟练掌握线性表链式存储的链式存储结构定义及基本操作
. 理解循环链表和双链表的特点和基本运算
. 加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题的编程能力
(一) 基本实验内容(顺序表):
建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁,置空表、求表长、查找元素、判线性表链式存储是否为空;

一、基于顺序存储结构的线性表鏈式存储实现

 线性表链式存储的顺序存储结构是用一段地址连续的存储单元依次存储线性表链式存储中的数据元素

2、顺序存储结构的操莋

 使用一维数组实现顺序存储结构。
 一维顺序存储结构可以是原生数组或是动态分配的空间因此,根据空间分配的不同分为静态线性表链式存储和动态线性表链式存储。

顺序存储结构的元素获取操作:
A、判断目标位置是否合法
B、将目标位置作为数组下标获取元素

//判断目標位置是否合法 //将目标位置作为下标获取元素

顺序存储结构的元素插入操作:
A、判断目标位置是否合法
B、将目标位置后的所有元素向后移┅位
C、将新元素插入目标位置

//判断目标位置是否合法 //将目标位置后的所有元素后移一个位置 //将新元素插入到目标位置

顺序存储结构的元素刪除操作:
A、判断目标位置是否合法
B、将目标位置后的所有元素前移一个位置

//判断目标位置是否合法 //将目标位置后的所有元素前移一位

顺序存储结构中元素值的修改:
A、判断目标位置是否合法
B、修改目标位置元素的值

//判断目标位置是否合法 //修改目标位置元素的值

(5)线性表鏈式存储长度的获取
顺序存储结构线性表链式存储的长度获取

//判断目标位置是否合法 //返回下标相应的元素 //转换为非const对象后使用[]操作

3、顺序存储结构的抽象实现

//判断目标位置是否合法 //将目标位置后的所有元素后移一个位置 //将新元素插入到目标位置 //判断目标位置是否合法 //将目标位置后的所有元素前移一位 //判断目标位置是否合法 //修改目标位置元素的值 //判断目标位置是否合法 //将目标位置作为下标获取元素 //如果找到元素退出循环 //判断目标位置是否合法 //返回下标相应的元素 //转换为非const对象后使用[]操作

4、顺序存储结构中数据元素移动的技巧

将后面的数据元素向前移动,需要先将前面的数据元素前移依次移动,直到最后一个数据元素前移一般用于删除一个数据元素后将后面的数据元素前迻。 //将目标位置后的所有元素前移一位 将前面的数据元素向后移动需要先将最后的数据元素后移,依次移动直到第i个数据元素被后移,一般用于插入一个新的数据元素需要先将插入位置后的所有数据元素后移,在位置处放入新的数据元素 //将目标位置后的所有元素后迻一个位置

5、原生数组实现的线性表链式存储

 使用原生数组作为顺序存储空间,使用模板参数确定数组大小
 需要父类的实现纯虚函数capacity()。

6、动态分配空间实现的线性表链式存储

 使用动态申请的堆空间作为顺序存储空间动态设置顺序存储空间的大小并确保重置顺序存储空间夶小时的异常安全。

函数异常安全要求不泄漏任何资源不允许破坏数据。为了确保异常安全在异常抛出时,必须确保:
A、对象内的任哬成员仍然能保持有效状态
B、没有数据的破坏及资源泄漏

//如果抛出异常,原数组状态没有改变 //如果抛出异常重置后的数组状态已经改變

二、顺序存储结构线性表链式存储的效率分析

1、顺序存储结构线性表链式存储的时间复杂度分析

2、顺序存储结构线性表链式存储的效率汾析

顺序存储结构线性表链式存储的插入和删除操作的时间复杂度都是O(n),但是由于插入和删除操作都会涉及到线性表链式存储中数据え素的移动因此会频繁涉及拷贝构造函数和赋值操作符的调用,如果数据元素对象内部的资源较多对象间的复制、赋值将是非常耗时嘚,同时由于线性表链式存储是泛型模板无法确定实际实例化的对象类型是否是占有资源的类类型,因此需要禁用拷贝构造函数和赋值操作符禁用的方式只需要将拷贝构造函数和赋值操作符声明为protected即可。

3、顺序存储结构线性表链式存储的缺陷

顺序存储结构线性表链式存儲重载了[]操作符因此可以使用[]操作符访问顺序存储结构线性表链式存储中的元素。但是线性表链式存储中必须存在要访问的元素即先插入元素才能使用[]操作符访问元素。

 要创建一个数组类取代原生数组数组类需要避免原生数组的缺陷:

A、数组类包含长度信息
B、数组类能够主动发现越界访问
A、抽象类模板,存储空间的位置和大小由子类完成
B、重载数组操作符判断访问下标是否越界
C、提供数组长度的抽潒访问函数
D、拷贝构造函数和赋值操作符需要在子类实现

指定原生数组作为数组类的存储空间实现静态数组类,使用模板参数指定数组大尛实现函数返回数组的长度,实现重载拷贝构造函数和赋值操作符

 使用动态分配的堆空间作为数组类的存储空间实现动态分配数组类。
 类模板设计需要动态确定分配存储空间的大小实现函数返回数组大小,实现拷贝构造函数和赋值操作符

 

线性表链式存储的顺序存储结构偠求逻辑关系上相邻的元素在物理位置上也相邻这样方便了随机存取,但是在插入和删除元素时需要移动大量元素,而线性表链式存儲的链式存储则不要求逻辑上相邻的元素在物理位置上也相邻因此它没有顺序存储结构的可随机存取的优点,不过在插入和删除元素时仳较方便

另外顺序存储每个元素只要存元素的内容,链式存储还需要多一块区域来存储相邻节点的地址所以线性表链式存储链式存储結构的存储空间一般要多于顺序存储结构

我要回帖

更多关于 线性表链式存储 的文章

 

随机推荐