数据结构——线性表的实现

以下内容仅作为课程学习的参考

具体要求

实现线性表,演示线性表的基本操作结果。

主要内容:

基于顺序表实现线性表ADT
基于链表实现线性表ADT

实验步骤及遇到问题分析与解决:
一、基于顺序表实现线性表ADT

线性表的物理实现有顺序表与链表两种,顺序表更简单易用,所以先进行线性表顺序表的实现。
思考过程:
在这里插入图片描述
数据对象:选择模板类函数template 实现数据对象的多用性。
数据关系:线性关系。
基本操作:实现较为常见的基本操作,如插入、删除、当前位置移动等基本操作。
实现模块:
① 输入模块:建立简单的交互界面,通过序号的输入实现操作(如下图)。
在这里插入图片描述
② 功能模块
在这里插入图片描述

③ 输出模块:根据对应的功能操作进行输出。

遇到问题分析与解决:

【1】采用虚类继承方法构造线性表,实现对应功能。
分析及解决:构造虚基类,通过虚类继承的方法构造顺序表,增加了程序的可拓展性。
【2】使用模板template 实现数据对象的多用性。出现报错报错(GCC): error: need ‘typename’ before ‘E::xxx’ because ‘E’ is a dependent scope
分析及解决:通过查询,得知了这样两个概念——
从属名称(dependent names): 模板(template)内出现的名称, 相依于某个模(template)参数, 如E t;
嵌套从属名称(nested dependent names):从属名称在class内呈嵌套装, 如E::const_iterator ci;
如果不特定指出typename, 嵌套从属名称, 有可能产生解析(parse)歧义.
所以,任何时候在模板(template)中指涉一个嵌套从属类型名称, 需要在前一个位置, 添加关键字typename;进行如下操作解决了问题:
在每一个函数前指出模板template
【3】什么是demo程序?如何实现?
分析及解决:demo程序是用来测试线性表ADT的实现是否成功,所以决定通过使用简单的交互对实现的功能进行全面的测试,依次来检查线性表的实现是否存在错误。
移除当前位置操作测试过程

二、基于链表实现线性表ADT

链表的实现需要用到指针进行操作,对于指针的掌握及使用提出要求,虽然实现过程比较数组来说比较复杂,但却灵活。
思考过程:
在这里插入图片描述
数据对象:选择模板类函数template 实现数据对象的多用性。
数据关系:线性关系。
基本操作:实现较为常见的基本操作,如插入、删除、当前位置移动等基本操作。
实现模块:
① 输入模块:建立简单的交互界面,通过序号的输入实现操作(如下图)。
在这里插入图片描述
② 功能模块
在这里插入图片描述
③ 输出模块:根据对应的功能操作进行输出。

遇到问题分析与解决:

【1】在使用链表实现时,怎么分配新的内存?
分析及解决:查阅资料,可以知道new是C++中的操作符,当我们使用关键字new在堆上动态创建一个对象时,它做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。所以,使用new来进行分配内存操作。
New操作符的使用
【2】指针指向?前驱结点的next指针域?后继结点的prev指针域?
分析及解决:每个结点都存有一个数据和两个指针,指针分别指向前驱结点和后继结点,如图:
在这里插入图片描述
需要了解这一点之后,才能对指针的指向进行分析。指针的最后一个指向代表着该结点的next(prev)指针的指向,例如:
解释为:temp的前驱结点的next指针指向tempnew解释为:tempnew的前驱结点=temp的前驱结点要根据具体的情况、指针的特性,进行分析。(以上为个人理解)

具体代码实现:https://download.csdn.net/download/forest_one/11775705
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值