简单顺序表的实现

看了effective c++(第三版)的几个items,想试试.于是找回以前的数据结构课本,重新写了上课时候的第二个实验.居然花了两个小时......................惨了,速度已经降到这种地步了,需要不断strive.
代码如下(注释简单写了点,注释最多的地方是抄别人的........):
/*
* 程序命名规则参考林锐博士高质量c++/c编程指南
*
* -------------------------------------------
* 简单的Windows应用程序命名规则
* -------------------------------------------
*
* -------------------------------------------
* 1)类名和函数名用大写字母开头的单词组合而成。
*
* 例如:
*
* class Node;                 // 类名
*
* void Draw(void);           // 函数名
* -------------------------------------------
*
* -------------------------------------------
* 2)变量和参数用小写字母开头的单词组合而成。
*
* 例如:
*
* BOOL flag;
* int drawMode;
* -------------------------------------------
*
* -------------------------------------------
* 3)常量全用大写的字母,用下划线分割单词。
*
* 例如:
*
* const int MAX = 100;
* const int MAX_LENGTH = 100;
* -------------------------------------------
*
* -------------------------------------------
* 4)静态变量加前缀s_(表示static)
*
* 例如:
*
* static int s_initValue; // 静态变量
* -------------------------------------------
*
* -------------------------------------------
* 5)如果不得已需要全局变量,则使全局变量加前缀g_(表示global)
*
* 例如:
*
* int g_howManyPeople; // 全局变量
* -------------------------------------------
*
* -------------------------------------------
* 6)类的数据成员加前缀m_(表示member)
* 这样可以避免数据成员与成员函数的参数同名。
*
* 例如:
*
* void Object::SetValue(int width, int height)
* {
*            m_width = width;
*            m_height = height;
* }
* -------------------------------------------
*
* 更多命名规范参考:c++编码规范
*/
#include <assert.h>
#include <iostream>
using namespace std;
//顺序表默认大小
const int c_defaultSize = 128;
 
 
//简单的顺序表
template < class T >
class SeqList
{
       public:
              //使用explicit,避免隐私类型转换
              explicit SeqList(const int maxSize=c_defaultSize);     
              SeqList(const SeqList<T>& rhs);
              ~SeqList();
 
              SeqList<T>& operator=(const SeqList<T>& rhs);
              T& operator[](const int index);
 
 
              inline int Length(void) const;                      //计算表的长度    
 
              int           Find(const T& x) const;                            //查找x在表中的位置
              bool IsIn(const T& x) const;                      //判断x是否在表中
                                                                                           //成功返回true,失败返回false
              bool Insert(T x, const int index);          //插入x到第index个位置,0开始
              bool Remove(const T& x);                                //删除x
                                                                                           //成功返回true,失败返回false
 
              int           Next(const T& x) const;                            //寻找x的后继
              int           Prior(const T& x) const;                    //寻找x的前驱
 
              bool IsEmpty(void) const;                          //判断表是否为空
              bool IsFull(void) const;                              //判断表是否满
                                                                                           //!!!可能用不到
 
              void print()
              {
                     for (int i=0; i<m_size; i++)
                            cout << m_data[i] <<"/t";
                     cout << endl;
              }
 
       private:
              T *m_data;            //存放数据的数组
 
              int m_maxSize;      //最大可容纳数,可自动增加
              int m_size;             //当前已经存放的数据个数
                                          //没有存放元素时为0
};
 
//构造函数
template< class T >
SeqList<T>::SeqList(const int maxSize=c_defaultSize)
: m_maxSize(maxSize), m_size(0)
{
       //检查参数合理性
       assert(m_maxSize>=0);
 
       m_data = new T[m_maxSize];
       //memcpy(m_data, T(), sizeof(T)*m_maxSize);
 
       assert(m_data);
}
 
//拷贝构造函数
template< class T >
SeqList<T>::SeqList(const SeqList<T>& rhs)
{
       this->m_maxSize = rhs.m_maxSize;
       this->m_size = rhs.m_size;
 
       m_data = new T[m_maxSize];
 
       //检查
       assert(m_data);
       assert(m_size>=0 && m_maxSize>=m_size);
 
 
       for (int i=0; i<m_size; i++)
       {
              m_data[i] = rhs.m_data[i];
       }
 
}
 
//析构函数
template< class T>
SeqList<T>::~SeqList()
{
       delete []m_data;
       m_data = NULL;
}
 
//等号赋值
template< class T >
SeqList<T>& SeqList<T>::operator =(const SeqList<T>& rhs)
{
       this->m_maxSize = rhs.m_maxSize;
       this->m_size = rhs.m_size;
 
       delete []m_data;
       m_data = new T[m_maxSize];
 
       //检查
       assert(m_data);
       assert(m_size>=0 && m_maxSize>=m_size);
 
 
       for (int i=0; i<m_size; i++)
       {
              m_data[i] = rhs.m_data[i];
       }
 
       return *this;
}
 
template< class T >
T& SeqList<T>::operator [](const int index)
{
       assert(index>=0 && index<m_size);
 
       return m_data[index];
}
//返回表的长度
template< class T >
inline int SeqList<T>::Length(void) const
{
       return m_size;
}
 
//查找x在表中的位置
//找到x返回所在位置的下标(范围是0m_size-1)
//找不到返回-1
template< class T >
int SeqList<T>::Find(const T& x) const
{
       int i = 0;
       while(i<m_size && m_data[i]!= x)
       {
              i++;
       }
      
       if (i == m_size)
       {
              return -1;
       }
       else
       {
              return i;
       }
}
 
//判断x是否在表中
//成功返回true,失败返回false
template< class T >
bool SeqList<T>::IsIn(const T& x) const
{
       if (Find(x))
       {
              return true;
       }
       else
       {
              return false;
       }
}
 
//index位置插入x,index0开始
template< class T >
bool SeqList<T>::Insert(T x, const int index)
{
       if (index<0 && index>=m_maxSize)
       {
              return false;
       }
 
       if (m_size == 0)
       {
              m_data[m_size++] = x;
              return true;
       }
 
       for (int i=m_size; i>index; i--)
       {
              m_data[i] = m_data[i-1];
       }
       m_data[index] = x;
       m_size++;
 
       return true;
}
 
template< class T >
bool SeqList<T>::Remove(const T& x)
{
       int index = Find(x);
 
       if (index == -1)
       {
              return false;
       }
 
       else
       {
              for (int i=index; i<m_size; i++)
              {
                     m_data[i] = m_data[i+1];
              }
              m_size--;
              return true;
       }
}
 
template< class T >
int SeqList<T>::Next(const T& x) const
{
       int index = Find(x);
 
       if (index>=0 && index<m_size-1)
       {
              return index+1;
       }
       else
       {
              return -1;
       }
}
 
template< class T >
int SeqList<T>::Prior(const T& x) const
{
       int index = Find(x);
 
       if (index>0 && index<m_size)
       {
              return index-1;
       }
       else
       {
              return -1;
       }
}
 
int main()
{
      
       SeqList< int > temp(10);
       SeqList< int > obj(temp);
 
       for (int i=0; i<10; i++)
       {
              temp.Insert(i, 0);
       }
       temp.print();
 
       temp.Remove(2);
       temp.print();
       temp.Remove(10);
      
 
       obj = temp;
       obj.print();
       obj.~SeqList();
       cout <<temp[ temp.Next(1) ] << endl << temp[ temp.Prior(1) ] << endl;
 
       return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值