實現動態順序線性表
阿新 • • 發佈:2018-02-28
順序表//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; }
實現動態順序線性表