数据结构之线性结构--数组

一、什么是线性表

 线性表是种由零个或者多个元素组成的有限序列,线性表强调元素是有限的,就像一个班的人数也是有限的,一个线性表中只有一个头和一个尾,中间的元素有一个前驱和一个后记。

二、线性表的顺序储存方式

1、 顺序储存结构中使用一片连续的内存来储存线性表中的所有元素。在C++中使用数组来实现储存。

2、顺序储存结构中的元素的插入方式 :

3、顺序储存结构中的元素的删除方式 ;

4、顺序储存结构的访问
在顺序储存结构中通常使用数组来储存数据,我们在访问数据的时候只需要指定数据在数组中的位置的下标则可以了。

5、顺序储存结构的优缺点

6、顺序储存结构的代码实现

//H文件
#ifndef _AL_LISTSEQ_INCLUDE
#define _AL_LISTSEQ_INCLUDE

#include <windows.h>

template<typename T> 
class AL_ListSeq
{
public:
    //定义了一些基本的常量

    //默认的储存区域大小
    static const DWORD LISTSEQ_DEFAULTSIZE          = 100;
    //表示最大储存内存
    static const DWORD LISTSEQ_MAXSIZE              = 0xffffffff;
    //表示没有当前内存没有这个元素
    static const DWORD LISTSEQ_POSITION_INVALID     = 0xffffffff;

    //初始化构造函数,为线性表分配内存
    AL_ListSeq(DWORD dwSize = LISTSEQ_DEFAULTSIZE);

    //析构函数,释放数组内存
    ~AL_ListSeq();

   //获取当前已经储存的数据的长度
    DWORD Length() const;

    //根据内容查找元素在表中的位置
    DWORD Find(const T& tData) const;

    //判读查找的元素是否在表中存在
    BOOL IsElement(const T& tData) const;

    //随机插入元素
    BOOL Insert(DWORD dwIndex,const T& tData);

    //在表的开始位置插入元素
    BOOL InsertBegin(const T& tData);

    //在表的元素长度的尾部插入元素
    BOOL InsertEnd(const T& tData);

    //移除并获取表中的任意元素
    BOOL Remove(const T& tData);

    //移除表中的任意元素但不返回移除元素的值
    BOOL RemoveAt(DWORD dwIndex);

    //判读当前表中是否有元素存在
    BOOL IsEmpty() const;

    //获取表中的任意一个元素的值
    BOOL Get(DWORD dwIndex, T& tTypeOut) const;

    //修改表中的任意一个元素的值
    BOOL Set(DWORD dwIndex, const T& tData, T& tTypeOut);

    //将记录表中存储元素的值归零
    VOID Clear();

    //两个表相互赋值
    AL_ListSeq<T>& operator = (const AL_ListSeq<T>& cAL_ListSeq);

private:
    //为线性表分配内存或者扩展内存大小
    VOID GetBuffer();

   //判断当前表中存储元素长度是否大于最大长度
    BOOL IsFull() const;


    AL_ListSeq(const AL_ListSeq<T>& cAL_ListSeq);

private: 

    T*          m_pElements;//用于储存元素的数组
    DWORD       m_dwMaxSize;//数组的最大长度
    DWORD       m_dwSize;//记录当前数组中储存元素的个数
};



//CPP文件
template<typename T> 
AL_ListSeq<T>::AL_ListSeq(DWORD dwSize):
m_pElements(NULL),
m_dwMaxSize(dwSize),
m_dwSize(0x00)
{
    if (0x00 == m_dwMaxSize) {
        //for memory deal
        m_dwMaxSize = 1;
    }
    GetBuffer();
}

template<typename T> 
AL_ListSeq<T>::~AL_ListSeq()
{
    if (NULL != m_pElements) {
        delete[] m_pElements;
        m_pElements = NULL;
    }
}

template<typename T> DWORD 
AL_ListSeq<T>::Length() const
{
    if (TRUE == IsEmpty()) {
        return 0;
    }

    return m_dwSize;
}


template<typename T> DWORD 
AL_ListSeq<T>::Find(const T& tData) const
{
    if (TRUE == IsEmpty()) {
        return LISTSEQ_POSITION_INVALID;
    }

    for(DWORD dwCnt=0x00; dwCnt<Length();dwCnt++) {
        if (m_pElements[dwCnt] == tData ) {
            return dwCnt;
        }
    }
    return LISTSEQ_POSITION_INVALID;
}

template<typename T> BOOL 
AL_ListSeq<T>::IsElement(const T& tData) const
{
    if (TRUE == IsEmpty()) {
        return FALSE;
    }

    if (LISTSEQ_POSITION_INVALID == Find(tData )) {
        return FALSE;
    }

    return TRUE;
}


template<typename T> BOOL 
AL_ListSeq<T>::Insert(DWORD dwIndex, const T& tData)
{
   //判插入的位置是否超出内存长度位置
    if (dwIndex > Length()) {
        return FALSE;
    }
    //判读当前储存元素个数是否与最大内存长度相同
    if (TRUE == IsFull()) {
        //重新分配内存
        GetBuffer();
    }
    //将元素向后移动
    for(DWORD dwCnt=(Length()-1+1); dwCnt>dwIndex; dwCnt--) {
        m_pElements[dwCnt] = m_pElements[dwCnt-1];
    }
    m_pElements[dwIndex] = tData ;

    m_dwSize++;
    return TRUE;
}

template<typename T> BOOL 
AL_ListSeq<T>::InsertBegin(const T& tData)
{
    return Insert(0, tData);
}


template<typename T> BOOL 
AL_ListSeq<T>::InsertEnd(const T& tData)
{
    return Insert(Length(), tData);
}


template<typename T> BOOL 
AL_ListSeq<T>::Remove(const T& tData)
{
    if (TRUE == IsEmpty()) {
        return FALSE;
    }

    BOOL bRemove = FALSE;
    for(DWORD dwCnt=0x00; dwCnt<Length();dwCnt++) {
        if (m_pElements[dwCnt] == tData ) {
            bRemove = RemoveAt(dwCnt);
            if (FALSE == bRemove) {
                return bRemove;
            }
        }
    }
    return bRemove;
}

template<typename T> BOOL 
AL_ListSeq<T>::RemoveAt(DWORD dwIndex)
{
    if (dwIndex > Length()) {
        //can not insert to this position
        return FALSE;
    }

    for(DWORD dwCnt=dwIndex; dwCnt<Length()-1; dwCnt++) {
        m_pElements[dwCnt] = m_pElements[dwCnt+1];
    }
    m_dwSize--;
    return TRUE;
}

template<typename T> BOOL 
AL_ListSeq<T>::IsEmpty() const
{
    return (0x00 == m_dwSize) ? TRUE:FALSE;
}


template<typename T> BOOL
AL_ListSeq<T>::Get(DWORD dwIndex, T& tTypeOut) const
{
    if (TRUE == IsEmpty()) {

        return FALSE;
    }

    if (Length()-1 < dwIndex) {

        return FALSE;
    }

    tTypeOut = m_pElements[dwIndex];
    return TRUE;
}

template<typename T> BOOL 
AL_ListSeq<T>::Set(DWORD dwIndex, const T& tData, T& tTypeOut)
{
    if (Length()-1 < dwIndex) {
        return FALSE;
    }

    tTypeOut = m_pElements[dwIndex];
    m_pElements[dwIndex] = tData ;
    return TRUE;
}

template<typename T> VOID 
AL_ListSeq<T>::Clear()
{
    m_dwSize = 0x00;
}


template<typename T> VOID 
AL_ListSeq<T>::GetBuffer()
{
   //当数组中储存的元素为最大长度并且数组非空时则结束函数调用
    if ( (FALSE == IsFull()) && (NULL != m_pElements) ) {
        return;
    }

    //当还没有为数组分配内存时,则为数组分配一个最大内存
    if (NULL == m_pElements) {
        if(0 < m_dwMaxSize){
            m_pElements = new T[m_dwMaxSize];
        }
        return;
    }


    T* pLastTpye = NULL;

    //设置线性表最大内存的一个长度,是否超过我们设置的常量值。
    pLastTpye = m_pElements;
    if (LISTSEQ_MAXSIZE == m_dwMaxSize) {

        return;
    }
    else if (LISTSEQ_MAXSIZE/2 < m_dwMaxSize) {
        m_dwMaxSize = LISTSEQ_MAXSIZE;
    }
    else {
        m_dwMaxSize *= 2;
    }
    //从新为线性表分配内存长度,并将数据拷贝到新的内存空间中
    if(0 < m_dwMaxSize){

        m_pElements = new T[m_dwMaxSize];
    }
    for (DWORD dwCpy=0x00; dwCpy<Length(); dwCpy++) {
        m_pElements[dwCpy] = pLastTpye[dwCpy];
    }
    delete[] pLastTpye;
    pLastTpye = NULL;
}


template<typename T> BOOL 
AL_ListSeq<T>::IsFull() const
{
    return (m_dwMaxSize <= Length()) ? TRUE:FALSE;
}


template<typename T> AL_ListSeq<T>& 
AL_ListSeq<T>::operator = (const AL_ListSeq<T>& cAL_ListSeq)
{
    Clear();
    T tData;
    for (DWORD dwAssign=0x00; dwAssign<cAL_ListSeq.Length(); dwAssign++) {
        if (TRUE == cAL_ListSeq.Get(dwAssign, tData)) {
            InsertEnd(tData);
        }
    }
    return *this;
}
#endif

测试代码


void ListSeqTest()
{
 //为数组分配一个单位的内存
    AL_ListSeq<DWORD> cListSeq(1);
    BOOL bEmpty = cListSeq.IsEmpty();
    std::cout<<bEmpty<<std::endl;

    //插入元素
    int array[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    for(int i=0;i<15;i++)
           cListSeq.Insert(cListSeq.Length(), array[i]);
       bEmpty = cListSeq.IsEmpty();
       std::cout<<bEmpty<<std::endl;

     //获取当前元素储存长度
       DWORD dwListSeq=cListSeq.Length();
       std::cout<<dwListSeq<<std::endl;
       //查找元素位置
       DWORD dwListSeqlen=cListSeq.Find(5);
       std::cout<<dwListSeqlen<<std::endl;

       //判断当前元素是否在表中存在
       bool bElement=cListSeq.IsElement(6);
       std::cout<<bElement<<std::endl;

       //移除元素
       bool mRemove=cListSeq.Remove(933);
       bool mRemoves=cListSeq.Remove(2);
      std::cout<<mRemove<<"  "<<mRemoves<<std::endl;

      //获取元素
      DWORD S;
      cListSeq.Get(3,S);
      std::cout<<S<<std::endl;

      //修改元素
      DWORD dw;
      cListSeq.Set(2,999,dw);
      cListSeq.Get(2,S);
      std::cout<<S<<std::endl;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ListSeqTest();
    return a.exec();
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值