C++数据结构第16课、线性表存储结构的抽象实现

  • 课程目标
    — 完成顺序存储结构线性表的抽象实现

  • SeqList 设计要点
    — 抽象类模板,存储空间的位置和大小由子类完成
    — 实现顺序存储结构线性表的关键操作(增、删、查、等)
    提供数组操作符,方便快速获取元素

SeqList.h

#ifndef SEQLIST_H
#define SEQLIST_H

#include "List.h"
#include "Exception.h"

namespace DTLib
{

template <typename T>
class SeqList : public List<T>
{
protected:
    T* m_array;
    int m_length;

public:
    bool insert(int i, const T& e)
    {
        bool ret = (0 <= i)&&(i <= m_length);
        ret = (ret)&&(m_length < capacity());
        if(ret)
        {
            for(int p = m_length-1; p >= i; p--)
            {
                m_array[p+1] = m_array[p];
            }
            m_array[i] = e;
            m_length++;
        }
        return ret;
    }

    bool remove(int i)
    {
        bool ret = (0 <= i)&&(i < m_length);
        if(ret)
        {
            for(int p = i; i < m_length-1; p++)					//这里的  < m_length-1 指的是赋值的次数
            {
                m_array[p] = m_array[p+1];
            }
            m_length--;
        }
        return ret;
    }

    bool set(int i, const T& e)
    {
        bool ret = (0 <= i)&&(i < m_length);
        if(ret)
        {
            m_array[i] = e;
        }
        return ret;
    }

    bool get(int i, T& e)const
    {
        bool ret = (0 <= i)&&(i < m_length);
        if(ret)
        {
            e = m_array[i];
        }
        return ret;
    }

    int length()const
    {
        return m_length;
    }

    void clear()
    {
        m_length = 0;
    }

    T& operator[](int i)
    {
        bool ret = (0 <= i)&&(i < m_length);
        if(ret)
        {
            return m_array[i];
        }
        else
        {
            THROW_EXCEPTION(IndexOutOfBoundsException, "Parameter i is invalid");
        }
    }

    T operator[](int i)const
    {
        return (const_cast<SeqList<T>>(*this))[i];                  //清除当前对象的 const 属性,它就会调用上一个函数
    }

    virtual int capacity()const = 0;
};
}
#endif // SEQLIST_H

思考:
在这里插入图片描述

热门文章

暂无图片
编程学习 ·

Android运行Linux程序

安卓直接运行arm-linux-gnueabi-gcc编译的标准嵌入式Linux程序,我们有时不想把原Linux程序重新开发一遍。第一步,给adb root权限运行,否则拷贝会提示无权限failed to copy E:\share\a8Agent1.0.1\a8Agent to /data/a8Agent: Permission deniedadb root 第二不,发送程序到安…
暂无图片
编程学习 ·

Redis和Memcache缓存核心及原理对比最全解析

1. 缓存基础知识1.1 缓存类型 缓存是高并发场景下提高热点数据访问性能的一个有效手段,在开发项目时会经常使用到。缓存的类型分为:本地缓存、分布式缓存和多级缓存。 本地缓存就是在进程的内存中进行缓存,比如我们的 JVM 堆中,可以用 LRUMap 来实现,也可以使用 Ehcache 这…
暂无图片
编程学习 ·

聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】06_交易性能优化技术之缓存库存

文章目录本章目标7-1 交易性能瓶颈7-2 交易验证优化7-3 活动缓存库存方案一(重点)库存行锁优化扣减库存缓存化(方案一)异步同步数据库(方案二)异步消息队列rocketmq库存数据库最终一致性保证7-5 活动缓存库存方案二分布式事务7-7 rocketmq安装7-8 缓存库存接入异步化 本章…
暂无图片
编程学习 ·

easyui datagrid deleteRow(删除行)的BUG

有时候想临时保存一些数据,等确定好后在批量一次提交,但EasyUI datagrid 用的时候添加可以正常,如果从中间删除那行号就全乱了。导致删除的时候有可能删除上一行数据。function addFileRow(){$(#FileTable).datagrid(appendRow,{ File_Name:"aaaa",File_Path:&qu…
暂无图片
编程学习 ·

90后绝对不是用来管的!

作者:混沌大学来源:混沌大学(ID:hundun-university) 在知乎上,“如何管理90后员工”是一个长盛不衰的话题。一个备受关注的问题是这样的:最近公司录用了一批90后的新员工,基本上全都离职了,最短的半天,最长的也就工作了一周,迫切地想知道90后员工的求职观,什么样的…
暂无图片
编程学习 ·

TCP协议中的粘包分包问题

使用TCP协议进行网络游戏开发的时候,有粘包和分包两个问题。 粘包和分包是利用Socket在TCP协议下内部的优化机制,在使用TCP协议进行数据的传输进行通讯的时候,会出现粘包分包问题的话,是由于优化导致,即内部的数据传输机制所导致的。 在客户端调用Send()方法传送数据,每传…
暂无图片
编程学习 ·

网上书城项目分析及前端页面

网上书城项目分析及前端页面项目分析背景/价值需求/功能需求功能划分前端页面实现登录and注册效果代码主页面效果代码搜索页面效果代码购物车页面效果代码思维导图总结 项目分析 背景/价值 背景 个人书店的业务管理使用 价值 方便个人书店的推广 角色 老板 消费者 思维导图需求…
暂无图片
编程学习 ·

Java继承多态面试题

1.多态的实现原理2.面向对象的特征之一——多态2.1多态的定义多态是同一个行为具有不同的表现形式或形态的能力。允许不同类的对象对同一消息做出响应,同一消息可以根据发送的对象不同采用不同的行为方式。对于面向对象,多态分为编译时多态和运行时多态,编译时多态是静态的,…
暂无图片
编程学习 ·

Zabbix简介

一、Zabbix介绍 Zabbix是一个企业级的、开源的、分布式的监控套件 Zabbix可以监控网络和服务的监控状况. Zabbix利用灵活的告警机制,允许用户对事件发送基于Email的告警. 这样可以保证快速的对问题作出响应. Zabbix可以利用存储数据提供杰出的报告及图形化方式. 这一特性将帮助…
暂无图片
编程学习 ·

本地项目提交到Github上

1.在个人github主页创建一个空仓库2.填写完相关资料后再项目文件中打开本地git客户端3.进入到刚刚的新建仓库中,如图操作3.依次在git客户端内输入以下命令,这部会用到上面复制到的地址 git initgit add .origin后面的地址是你刚刚自己复制的地址 git remote add origin https:/…
暂无图片
编程学习 ·

【游记】2020联合省选

说在前面 今年的省选是在本校考的,非常幸运。但俗话说得好,祸福相依。 day  0\tt day\;0day0 最后一个突击冲刺的夜晚,天上一颗星星也没有。机房里是几个年轻人,其中的一位正在复习 NTT\tt NTTNTT ,他还没有意识到将要到来的考试是个灭顶之灾。 我们的教练显然并不相信临…
暂无图片
编程学习 ·

中国恒大:模范生的“提质增效”

撞线万亿绝不会是恒大的终极目标,在提升自身发展质量的同时,恒大必然会选择更宽广的赛道御风而行,到达万亿规模也只是恒大的又一个新起点。一点财经 严 睿|作者刘 煜|编辑泥沙俱下或者傲立潮头?愈是在行业出现重大波折的阶段,愈能检验企业的发展质量。2020年上半场结束,…
暂无图片
编程学习 ·

Filecoin主网预产 催生「无币有市」泡沫

作者|凯尔编辑|文刀Filecoin测试网的第二阶段已进行12天,屡次跳票的Filecoin主网进入 “预产期”,官方给出的最新时间为8月份。测试期间,Filecoin发布了矿工激励计划,参与测试的矿工可比拼真实数据、打包交易量等,来瓜分共计400万枚Filecoin代币FIL。官方期待以此方式充分…
暂无图片
编程学习 ·

Java正确URL解码方式:URLDecoder.decode

Java调用 URLDecoder.decode(data, “UTF-8”); 抛出的异常,其主要原因是% 在URL中是特殊字符,需要特殊转义一下:url = url.replaceAll("%(?![0-9a-fA-F]{2})", “%25”); String urlStr = URLDecoder.decode(url, “UTF-8”);其他特殊字符以及对应的替代:
暂无图片
编程学习 ·

STM32串口空闲中断idle说明

1.空闲中断的触发机制:空闲中断是在监测到数据接收后(即串口的RXNE位被置位)开始检测,当总线上在一个字节对应的周期内未再有新的数据接收时,触发空闲中断IDLE位被硬件置1.2.IDEL位清零实现:查看stm32参考手册,要注意IDEL位的清零是通过先读取USART_SR,再读取USART_DR实…