您好!欢迎来到源码码网!

线性表——数组描述

  • 行业资讯
  • 来源:源码码网
  • 编辑:admin
  • 时间:2020-05-14 17:55
  • 阅读:986

抽象数据类型(abstract date tpye, ADT)

1.抽象数据类型linearList

C++支持两种类——抽象类和具体类。一个抽象类包含没有实现的代码的成员函数。这样的成员函数成为“虚函数(pure virtual function)”.

具体类是没有虚函数的类。只有虚函数才可以实例化(只能对具体类建立实例或对象)。但是可以建立抽象类的对象指针。


一个线性表的抽象类:

template<class T>

class linearList

{

    public:

        virtual ~linearList() {

        };

        //线性表为空,返回true 

        virtual bool empty() const  = 0;

        //返回线性表的元素个数 

        virtual int size() const = 0;

        //返回索引为theIndex的元素 

        virtual T& get(int theIndex) const = 0;

        //返回元素theElement第一次出现的索引 

        virtual int indexof(const T& theElement) const = 0;

        //删除索引为theIndex的元素 

        virtual void erase(int theIndex) = 0;

        //将元素theElement插入索引为theIndex的位置 

        virtual void insert(int theIndex, const T& theElement) = 0;

        //线性表插入输出流out 

        virtual void output(ostream& out) const = 0;

};

一个抽象类的派生类,只有实现了基类的所有纯虚函数才是具体类,否则依然是抽象类不能实例化。

抽象类linearList的派生类arrayList(具体类) :

template<class T>

class arrayList : public linearList<T>

{

    protected:

        T* element; //存储线性元素的一维数组 

        int arrayLength;    //一维数组的容量 

        int listSize;   //线性表的元素个数 

        //索引theIndex无效,则抛出异常 

        void checkIndex(int theIndex) const;


    public:

        //构造函数,复制函数和析构函数

        arrayList(int initialCapacity = 10);

        arrayList(const arrayList<T>&);

        ~arrayList()

        {

            delete [] element;

        }


        //DAT方法

        bool empty() const

        {

            return listSize == 0;

        } 

        int size() const

        {

            return listSize;    

        }

        T& get(int theIndex) const;

        int indexof(const T& theElement) const;

        void erase(int theIndex);

        void insetr(int theIndex, const T& theElement);

        void output(ostream& out) const;


        //其他方法

        int capacity() const

        {

            return arrayLength;

        }

};

类的具体实现:

template<class T>

arrayList<T>::arrayList(int initialCapacity)

{

    if(initialCapacity < 1)

    {

        ostringstream s;

        s << "初始容量 = " << initialCapacity << "必须大于零";   

        //throw illegalParameterValue(s.str());

    }


        arrayLength = initialCapacity;

        element = new T[arrayLength];

        listSize = 0;   

}


template<class T>

arrayList<T>::arrayList(const arrayList<T>& theList)

{

    arrayLength = theList.arrayLength;

    listSize = theList.listSize;

    element = new T[arrayLength];

    copy(theList.elemet, theList.element + listSize, element);

}


template<class T>

T& arrayList<T>::get(int theIndex) const

{

    checkIndex(theIndex);

    return element(theIndex); 

} 


template<class T>

int arrayList<T>::indexof(const T& theElement) const

{

    int theIndex = (int) (find(element, element + listSize, theElement) - element);


    if(theIndex == listSize)

    {

        return -1;

    }

    else

    {

        return theIndex;

    }

}


template<class T>

void arrayList<T>::erase(int theIndex)

{

    //如果引索不存在,则抛出异常 

    checkIndex(theIndex);


    //引索存在,向前移动引索大于theIndex的元素

    copy(element + theIndex + 1, element + listSize, element + theIndex);

    element[--listSize].~T();  //调用析构函数 

}


template<class T>

void arrayList<T>::insetr(int theIndex, const T& theElement) 

{

    if(theIndex < 0 || theIndex > listSize)

    {

        ostringstream s;

        s << "索引 = " << theIndex << "索引大小 = " << listSize;

        throw illeaglIndex(s.str());    

    }


    //有效引索,确定数组是否已满

    if(listSize == arrayLength) //数组长度空间已满,数组长度倍增 

    {

        changeLength1D(element, arrayLength, 2 * arrayLength) ;

        arrayLength *= 2;

    } 


    //把元素向右移动一个位置

    copy_backward(element + theIndex, element + listSize,

                  element + theIndex + 1); 

    element[theIndex] = theElement;

    listSize++;

} 


template<class T>

void arrayList<T>::output(ostream& out) const

{

    copy(element, element + listSize, ostream_iterator<T>(cout, " "));

}


template<class T>

void arrayList<T>::checkIndex(int theIndex) const

{

    //确定索引theIndex在 0 到 listSize 之间

    if(theIndex < 0 || theIndex >= listSize)

    {

        ostringstream s;

        s << "索引 = " << theIndex << "索引大小 = " << listSize;

        throw illeaglIndex(s.str());    

    }

}


//改变一个一维数组长度

template<class T>

void changeLength1D(T*& a, int oldLength, int newLength)

{

    if(newLength < 0)

        cout<< "错误" <<endl; 


    T* temp = new T[newLength]; //新数组

    int number = min(oldLength, newLength);

    copy(a, a + number, temp);

    delete [] a;

    a = temp; 

}

库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。

————————————————


原文链接:https://blog.csdn.net/peng_shakalaka/java/article/details/60598806



特别声明:
1、如无特殊说明,内容均为本站原创发布,转载请注明出处;
2、部分转载文章已注明出处,转载目的为学习和交流,如有侵犯,请联系客服删除;
3、编辑非《源码码网》的文章均由用户编辑发布,不代表本站立场,如涉及侵犯,请联系删除;
全部评论(0)
推荐阅读
  • 陀螺匠OA办公系统源码 PHP + Vue 前后端分离 完整可商用
  • 陀螺匠OA办公系统源码 PHP + Vue 前后端分离 完整可商用
  • 项目介绍《陀螺匠》是一套采用Laravel9框架结合Swoole高性能框架与Vue.js前端技术栈构建的AI+低代码双引擎智能办公系统。陀螺匠深度融合了AI智能体以及低代码开发平台,系统简约,易于功能扩展,方便二次开发。旨在为企业提供一站式、数智化转型的全方位解决方案,助力企业高效运营与智能决策。源码说明源码说明:项目代码100%开源,基于AGPL-3.0,支持免费商用!技术栈:系统基于Laravel9+Swoole+Vue.
  • 软件教程
  • 来源:CRMEB
  • 编辑:CRMEB
  • 时间:2026-03-27 15:33
  • 阅读:654
  • open claw最近很火,如何理性看待?
  • open claw最近很火,如何理性看待?
  • openclaw是2026年初科技圈最火爆的现象级话题。它不仅仅是又一个AI产品,更被百川智能的王小川誉为与ChatGPT诞生同等重要的里程碑——标志着AI从”只会说”的对话者,进化到了”能够做”的行动者。对于这股全民”养虾”热潮,我的观察是:它代表了一次人机关系的革命性跃迁,但同时也是一场充满风险与泡沫的狂欢,其真正的价值需要在喧嚣褪去、安全与成本的挑战被克服后才能显现。下
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2026-03-17 11:06
  • 阅读:716
  • 原生小程序和封装的小程序有什么区别
  • 原生小程序和封装的小程序有什么区别
  • 原生小程序和封装的小程序是两种不同的开发模式,主要区别在于开发方式、性能表现、代码维护以及跨平台能力。为了让你更清晰地理解,我们可以把“原生”比作用钢筋水泥直接盖楼,而“封装”则是用预制板或套件来组装楼。以下是详细的对比分析:1.定义与本质原生小程序:定义: 直接使用微信官方提供的开发工具、语法和API进行开发。语言: 使用微信自己定义的一套技术栈(WXML(微信标记语言)做结构、WXSS(微信样式表)做样式、JS
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2026-03-06 11:54
  • 阅读:944
  • 基于NetCore(Razor Page)开发的Cms建站系统MIT协议
  • 基于NetCore(Razor Page)开发的Cms建站系统MIT协议
  • FytSoaCms一款基于NetCore2.2/3.1(RazorPage)功能强大的Cms建站系统,支持前后端分离。简介:模块化:全新的架构和模块化的开发机制,便于灵活扩展和二次开发。模型/栏目/分类信息体系:通过栏目和模型绑定,以及不同的模型类型,不同栏目可以实现差异化的功能,轻松实现诸如资讯、下载、讨论和图片等功能。通过分类信息和栏目绑定,可以自动建立索引表,轻松实现复杂的信息检索。FytSoa是一套基于NetCore+SqlS
  • 开发工具
  • 来源:gitee
  • 编辑:源码码网
  • 时间:2026-01-24 22:21
  • 阅读:799
  • 基于JAVA开发的企业级平台微信公众号管理系统SmartWx
  • 基于JAVA开发的企业级平台微信公众号管理系统SmartWx
  • SmartWx微信公众号管理系统是一个完整的微信公众号web操作版,直接编译即可运行。让用户不再用关心微信的底层接口,直接使用页面进行操作,简单方便。包括服务器绑定、文本管理、图文管理、菜单管理、粉丝管理、群发消息等。技术框架开发语言:JAVA数据库:MYSQLJAVA开发框架:SpringMVC+Spring+Mybatis缓存框架:j2cache前端开发框架:Layui+JQuery+html前台模板引擎:art-templat
  • 源码教程
  • 来源:gitee
  • 编辑:源码码网
  • 时间:2026-01-24 21:53
  • 阅读:833
联系客服
源码代售 源码咨询 技术开发 联系客服
029-84538663
手机版

扫一扫进手机版
返回顶部