1. 程式人生 > >實現動態順序線性表

實現動態順序線性表

順序表

//CMy_vector.hpp

//CMy_vector.h
//
//template<class T>
class CMy_vector
{
public:
    CMy_vector();
    ~CMy_vector();

public:
    bool push_back(int nData);             //添加到尾部
    bool pop_back(int* pData = 0);         //刪除最後一個元素
    bool insert(int nIndex, int nData);    //從任意位置添加
    bool erase(int nIndex, int* pData=0);  //從任意位置刪除
    bool remove(int nData);                //刪除指定數據
    bool empty();                          //是否為空
    void clear();                          //清空所有
    int findIndex(int nData);              //查找元素所在位置的下標 
    bool findData(int nIndex,int* pData);  //查找索引所對應的數據
    int size();                            //獲取當前元素個數
    bool setData(int nIndex, int nData);   //修改下標為nIndex的元素的值為nData

    void Print();
protected:
    bool extend();   //擴展空間

private:

    int* m_pHeader;       //頭指針
    int m_nMaxCount;      //當前最多存儲元素個數
    int m_nCurrentCount;  //當前存儲元素個數
};

//CMy_vector.cpp

#include <stdio.h>
#include "My_vector.h"
CMy_vector::CMy_vector() 
{
    m_nMaxCount = 2;
    m_nCurrentCount = 0;
    m_pHeader = new int[m_nMaxCount]{};
}

CMy_vector::~CMy_vector()
{
}

//************************************
// Method:    push_back
// FullName:  CMy_vector::push_back
// Access:    public 
// Returns:   bool
// Parameter: int nData 新添加的元素
//************************************
bool CMy_vector::push_back(int nData)
{
    //判斷是否達到上限,達到了就擴容
    if (m_nMaxCount == m_nCurrentCount)
    {
        if (!extend())
            return false;
    }
    //添加數據
    m_pHeader[m_nCurrentCount++] = nData;
    return true;
}

//************************************
// Method:    pop_back 刪除最後一個元素
// FullName:  CMy_vector::pop_back
// Access:    public 
// Returns:   bool
//************************************
bool CMy_vector::pop_back(int* pData/* = 0*/)
{
    //是否為空白表
    if (empty()) return false;
    //保存被刪除數據
    if (pData)
    {
        *pData = m_pHeader[m_nCurrentCount - 1];
    }
    //當前元素個數減一
    m_nCurrentCount--;
    return true;
}

//************************************
// Method:    insert
// FullName:  CMy_vector::insert
// Access:    public 
// Returns:   bool
// Parameter: int nIndex   位置索引(下標)
// Parameter: int nData    新添加的數據
//************************************
bool CMy_vector::insert(int nIndex, int nData)
{
    //nIndex是否有效
    if (nIndex < 0 || nIndex > m_nCurrentCount)
    {
        return false;
    }
    //是否達到上限
    if (m_nCurrentCount == m_nMaxCount)
    {
        extend();
    }
    //如果是尾部
    if (nIndex == m_nCurrentCount)
    {
        return push_back(nData);
    }
    //如果是其他位置,就需要移動元素
    for (int i = m_nCurrentCount; i > nIndex;i--)
    {
        m_pHeader[i] = m_pHeader[i - 1];
    }
    m_pHeader[nIndex] = nData;
    m_nCurrentCount++;
    return true;
}

//************************************
// Method:    erase
// FullName:  CMy_vector::erase
// Access:    public 
// Returns:   bool
// Parameter: int nIndex   位置索引
// Parameter: int * pData  被刪除的數據(需要,就傳一個有效地址)
//************************************
bool CMy_vector::erase(int nIndex, int* pData/* = 0*/)
{
    //nIndex是否有效
    if (nIndex < 0 || nIndex > m_nCurrentCount)
    {
        return false;
    }
    //是否為空表
    if (empty())
    {
        return false;
    }
    //如果是尾部
    if (nIndex == m_nCurrentCount)
    {
        return pop_back(pData);
    }
    //如果是其他位置
    //保存被刪除數據
    if (pData)
    {
        *pData = m_pHeader[nIndex];
    }
    //移動元素
    for (int i = nIndex; i < m_nCurrentCount;i++)
    {
        m_pHeader[i] = m_pHeader[i + 1];
    }
    m_nCurrentCount--;
    return true;
}

//************************************
// Method:    remove
// FullName:  CMy_vector::remove
// Access:    public 
// Returns:   bool
// Parameter: int nData  要被刪除的數據
//************************************
bool CMy_vector::remove(int nData)
{
    //循環遍歷查找數據
    for (int i = 0; i < m_nCurrentCount;i++)
    {
        if (m_pHeader[i] == nData)
        {
            //找到後根據下標刪除數據
            return erase(i);
        }
    }
    return false;
}

//************************************
// Method:    empty 是否是空表
// FullName:  CMy_vector::empty
// Access:    public 
// Returns:   bool   
//************************************
bool CMy_vector::empty()
{
    return m_nCurrentCount == 0;
}

//************************************
// Method:    clear  刪除所有數據
// FullName:  CMy_vector::clear
// Access:    public 
// Returns:   void
//************************************
void CMy_vector::clear()
{
    if (m_pHeader)
    {
        delete[] m_pHeader;
        m_pHeader = nullptr;
        m_nCurrentCount = 0;
    }
}

//************************************
// Method:    findIndex
// FullName:  CMy_vector::findIndex
// Access:    public 
// Returns:   int
// Parameter: int nData  要查找的索引數據
//************************************
int CMy_vector::findIndex(int nData)
{
    //循環遍歷查找數據
    for (int i = 0; i < m_nCurrentCount; i++)
    {
        if (m_pHeader[i] == nData)
        {
            //找到後返回其下標
            return i;
        }
    }
    return -1;
}

//************************************
// Method:    findData
// FullName:  CMy_vector::findData
// Access:    public 
// Returns:   int
// Parameter: int nIndex  要查找的數據索引
//************************************
bool CMy_vector::findData(int nIndex,int* pData)
{
    //nIndex是否有效
    if (nIndex < 0 || nIndex >= m_nCurrentCount)
    {
        return false;
    }
    if (pData)
    {
        *pData = m_pHeader[nIndex];
        return true;
    }
    return false;
}

//************************************
// Method:    size  獲取當前元素個數
// FullName:  CMy_vector::size
// Access:    public 
// Returns:   int    
//************************************
int CMy_vector::size()
{
    return m_nCurrentCount;
}

//************************************
// Method:    setData
// FullName:  CMy_vector::setData
// Access:    public 
// Returns:   bool
// Parameter: int nIndex  位置索引
// Parameter: int nData   修改之後的數據
//************************************
bool CMy_vector::setData(int nIndex, int nData)
{
    //nIndex是否有效
    if (nIndex < 0 || nIndex >= m_nCurrentCount)
    {
        return false;
    }
    m_pHeader[nIndex] = nData;
    return true;
}

//************************************
// Method:    extend   擴展空間
// FullName:  CMy_vector::extend
// Access:    protected 
// Returns:   void
//************************************
bool CMy_vector::extend()
{
    //申請一塊更大的空間存放數據
    //把原來的數據拷貝過來後,刪除原有空間
    int nSize = m_nMaxCount + 10;
    int* pNew = new int[nSize]{};
    if (!pNew) return false;
    //拷貝原有數據
    //memcpy(pNew, m_pHeader, m_nMaxCount*sizeof(int));
    //如果是存儲的是對象的話使用如下方式
    for (int i = 0; i < m_nMaxCount;i++)
    {
        pNew[i] = m_pHeader[i]; 
    }
    //是否原有空間
    delete[] m_pHeader;
    m_pHeader = pNew;
    return true;
}

void CMy_vector::Print()
{
    for (int i = 0; i < m_nCurrentCount;i++)
    {
        printf("%d", m_pHeader[i]);
    }
    printf("\n");
}

main.cpp

#include <stdio.h>
#include "My_vector.h"

int main()
{
    CMy_vector myVec;
    myVec.push_back(1);
    myVec.push_back(3);
    myVec.push_back(4);
    myVec.push_back(5);
    myVec.insert(1,2);
    myVec.push_back(6);
    myVec.Print();
    int nData;
    myVec.erase(0, &nData);
    myVec.erase(3, &nData);
    myVec.Print();

    return 0;
}

實現動態順序線性表