// FileName: TCLinearList.cpp // Author: ErrorCpp@gmail.com Version: 0-1-0 Date: 2010-01-06 // Description: // 风格约定:st表示结构、C表示类、T表示模版参数、TC表示带模版参数的类 // ADT TCLinerList // { // DataObject: // 0或者多个元素的有序集合 // // Operator: // Create(); // 创建一个空线性表 // Destory(); // 删除表 // IsEmpty(); // 表为空返回true,否则返回false // Length(); // 返回表的大小 // Find(k, x); // 寻找表中的第K个元素,并把它保存到x中 // Search(x); // 返回元素x在表中的位置;如果x不在表中返回0 // Delete(k, x); // 删除表中第k个元素,并把它保持到x中;函数返回有修改后的表 // Insert(k, x); // 把第k个元素之后插入x;函数返回修改后的线性表 // Output(out); // 把线性表放入输入流out中 // }; #include <iostream> using namespace std; template<typename T> class TCLinearList { public: TCLinearList(); virtual ~TCLinearList(); // 需要特殊对待的拷贝构造函数和"="操作符 // 禁止使用 private: TCLinearList(const TCLinearList& oldList); virtual void operator = (const TCLinearList& oldList); // public operators public: bool IsEmpty() const; int Length() const; bool Find(const int iIndex, T& TBufReturn) const; int Search(const T& element) const; TCLinearList<T>& Delete(const int iIndex, T& bufReturn); TCLinearList<T>& Insert(const int iIndex, const T& bufReturn); void Output(ostream& out) const; private: void InitDataMembers(); void InitDataMembers(const TCLinearList& oldList); void ReleaseDataMembers(); private: int m_iLength; int m_iMaxSize; T * m_ppElements; }; template<typename T> TCLinearList<T>::TCLinearList() { InitDataMembers(); } template<typename T> TCLinearList<T>::TCLinearList(const TCLinearList& oldList) { InitDataMembers(oldList); } template<typename T> TCLinearList<T>::~TCLinearList() { } template<typename T> void TCLinearList<T>::InitDataMembers() { m_iMaxSize = 10; m_iLength = 0; m_ppElements = NULL; } template<typename T> void TCLinearList<T>::InitDataMembers(const TCLinearList& oldList) { m_iMaxSize = oldList.m_iMaxSize; m_iLength = oldList.m_iLength; if(NULL != oldList.m_ppElements) { m_ppElements = new T[m_iMaxSize]; *m_ppElements = *oldList.m_ppElements; } else { m_ppElements = oldList.m_ppElements; } } template<typename T> void TCLinearList<T>::ReleaseDataMembers() { if(NULL != m_ppElements) { delete []m_ppElements; m_ppElements = NULL; } InitDataMembers(); } template<typename T> void TCLinearList<T>::operator = (const TCLinearList& oldList) { ReleaseDataMembers(); InitDataMembers(oldList); } template<typename T> bool TCLinearList<T>::Find(int iIndex, T& bufReturn) const { bool bReturn = true; if((iIndex < 0) || (iIndex > m_iLength)) { bReturn = false; } else { bufReturn = m_ppElements[iIndex - 1]; } return bReturn; } template<typename T> int TCLinearList<T>::Search(const T& element) const { int iReturn = 0; for(int i = 0; i < m_iLength; i++) { if(m_ppElements[i] == element) { iReturn = i + 1; } } return iReturn; } template<typename T> TCLinearList<T>& TCLinearList<T>::Delete(int iIndex, T& bufReturn) { if(Find(iIndex, bufReturn)) { for(int i = iIndex; i < m_iLength; i++) { m_ppElements[i-1] = m_ppElements[i]; } m_iLength = m_iLength - 1; return *this; } } template <typename T> TCLinearList<T>& TCLinearList<T>::Insert(int iIndex, const T& element) { if((iIndex < 0) || (iIndex > m_iLength) || (++m_iLength == m_iMaxSize)) { ; } else { // 把第i号位置腾出来,对应数组的下标i-1 for(int i = iIndex; i <= m_iLength; i++) { m_ppElements[i] = m_ppElements[i-1]; } m_ppElements[i-1] = element; return *this; } } template<class T> void TCLinearList<T>::Output(ostream& out) const { for(int i = 0; i < m_iLength; i++) { out << m_iElements[i] << " "; } } int main() { return 0; }