简单顺序表的实现

原创 2006年05月22日 08:39:00
看了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;
}
 

c语言实现顺序表简单易懂

  • 2010年06月20日 22:32
  • 1KB
  • 下载

C语言顺序表简单实现

  • 2011年10月25日 21:38
  • 6KB
  • 下载

顺序表实现简单学生信息管理

#include #include #include #define maxsize 3000 //定义顺序表的最大长度 typedef long long ...

顺序表的简单实现

虽然java库已经有成熟的顺序表实现,但是自己写一个能加深对顺序表的认识。 何为顺序表呢? 在《数据结构(C语言版)》一书中,顺序表的描述如下: 线性表的顺序表示(下文称为顺序表)指的是用一组地...

【自己动手写数据结构】 -- 简单顺序表的实现

#include #include #define MAX_SIZE 100 //定义datatype的数据类型为整型 typedef int datatype; typedef struct ...

简单数据结构之顺序表(C实现)

/* ============================================================================ Name : sequ...

用C++实现简单的顺序表

这周课后练习是实现老师上课的时候讲的顺序表的一些基本操作。我们用的是C语言的教材,但之前学计算机语言的时候学的是C++,虽然大家都说差不多,但对C语言的一些用法不太熟悉,还是尝试着用C++的语言来编写...

C++模板实现简单的链表和顺序表

从最初学习C语言到C++,就有一个认识就是作为一个优秀的程序猿一定要学会 ”偷懒“ ,用程序员的话来说就是复用,在C的基础上开发的C++就深刻阐明了这一道理,因为这样有太多的好处,增加了代码的可移植性...

静态顺序表实现简单的通讯录

一、通讯录实现要求: 实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信...
  • XHfight
  • XHfight
  • 2016年06月02日 14:01
  • 843

如何自己实现模板类(简单案例——顺序表)

可以将模板类SeqList的定义及成员函数的实现代码全部写到SeqList.h头文件中,则在实例化该类后可进行基本的线性表操作 具体的代码怎么写,其实核心就是 template 其中 T 就是一个未...
  • x_y_q_
  • x_y_q_
  • 2016年08月18日 10:07
  • 673
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单顺序表的实现
举报原因:
原因补充:

(最多只允许输入30个字)