C++学习之模板线性表

//List.h
#ifndef LIST_H
#define LIST_H
/***
*描述:线性表基类
*作者:CaoZhongPing 
*日期: 2012-4-7
*/
template <typename T>
class List
{
  public:
         List();
         ~List();
         virtual int size()const=0;//表的大小
         virtual int length()const=0;//表的实际元素个数
         virtual int search(T& x)const=0;//获取元素x在表中的索引
         virtual T* getData(int i)const=0;//获取第I个元素
         virtual void setData(int i,T& x)=0;//修改第i个元素的值为x
         virtual bool add(int i,T& x)=0;//在第I个位置插入x
         virtual bool remove(int i,T& x)=0;//移除x
         virtual bool isEmpty()const=0;
         virtual bool isFull()const=0;
         virtual void sort()const=0;
         virtual void input()=0;
         virtual void output()=0;
         virtual List<T> operator=(List<T>& L)=0;//复制 
         
};
#endif

">//ArrayList.h
#ifndef ARRAYLIST_H
#define ARRAYLIST_H
#include <iostream>
#include <cstdlib>
#include "List.h"

/***
*描述:基于数组的线性表声明 
*作者:CaoZhongPing 
*日期: 2012-4-7
*/
const int defaultSize = 20;
using namespace std;
template<typename T>
class ArrayList:public List<T>
{
      protected:
                T* data;
                int maxSize;
                int last;//当前插入的最后位置
                void reSize(int newSize);//调整大小
     public:
            ArrayList(int size=defaultSize);
            ArrayList(ArrayList<T>& x);//复制构造函数
            ~ArrayList();
            int size()const;
            int length()const;
            int search(T& x)const;
            bool add(int i,T& x);
            bool remove(int i,T& x);
            T* getData(int i)const;
            void setData(int i,T& t);
            bool isEmpty()const;
            bool isFull()const;
            void input();
            void output();
            void errorMsg();
            ArrayList<T> operator=(ArrayList<T>& L);
};
#endif

//ArrayList.cpp
 
/***
*描述:基于数组的线性表实现 
*作者:CaoZhongPing 
*日期: 2012-4-7
*/
#include "ArrayList.h"

//实现构造函数 
template<typename T>
ArrayList<T>::ArrayList(int size)
{
      if(size>0)
      {
          maxSize = size;
          last = -1;//实际长度置为空
          data = new T[maxSize];      
          if(data == NULL)
          {
            errorMsg();     
          }
      }                      
}
//实现复制构造函数
template<typename T>
ArrayList<T>::ArrayList(ArrayList<T>& L)
{
    maxSize = L.size();
    last = L.length()-1;
    data = new T[maxSize];
    if(data != NULL)
    {
       for(int i=1;i<=last+1;i++)
       {
            data[i-1] = L.getData();   
       }       
    }else{
         errorMsg() ; 
    }
                                       
}  
template<typename T>
ArrayList<T>::~ArrayList()
{
   delete[]data;
}
//实现调整表的大小
template<typename T>
void ArrayList<T>::reSize(int newSize)
{
     if(newSize>0&&newSize!=maxSize)
     {
        T* newArr = new T[newSize];
        if(newArr!=NULL)
        {
           int n =last+1;
           T* srcPtr = data;
           T* destPtr = newArr;
           while(n--)
             *destPtr++ = *srcPtr++;//复制元素
           delete[] data;//删除旧数据
           data = newArr;
           maxSize = newSize;              
        }else{
             errorMsg(); 
        }          
     }                    
} 
//获取t索引 
template<typename T>
int ArrayList<T>::search(T& t)const
{
    for(int i=0;i<=last;i++)
       if(data[i] == t)
           return i;
    return -1;  //找不到            
} 
template<typename T>
bool ArrayList<T>::add(int i,T& t)
{
     if(last == maxSize-1)
             return false;
     if(i<0||i>last+1)
             return false;
     for(int j=last;j>=i;j--)
        data[j+i]=data[j];//依次后移空出i位置
     data[i]=t;
     last++;
     return true;                             
}
template<typename T>
bool ArrayList<T>::remove(int i,T& t)
{
     if(last==-1)
           return false;
     if(i<1||i>last+1)
           return false;
     t = data[i-1];
     for(int j=i;j<=last;j++)
        data[j-1]=data[j];
     last--;
     return true;                                
}
template<typename T>
void ArrayList<T>::input()
{
     cout<<"nothing";
}
template<typename T>
void ArrayList<T>::output()
{
     cout<<"nothing";
}

template<typename T>
int ArrayList<T>::length()const{
    return last+1;
}
template<typename T>
int ArrayList<T>::size()const{
    return maxSize;
}
template<typename T>
T* ArrayList<T>::getData(int i)const
{
    return (i>0&&i<=last+1)?&data[i-1]:NULL;           
}
template<typename T>
void ArrayList<T>::setData(int i,T& t)
{
     if(i>0&&i<=last+1)
          data[i-1]=t;
}
template<typename T>
 bool ArrayList<T>::isFull()const
{
     return last == maxSize-1;
}   
template<typename T>
bool ArrayList<T>::isEmpty()const
{
     return last==-1;
}          
template<typename T>
void ArrayList<T>::errorMsg()
{
    cerr<<"初始化失败"<<endl; 
}
template<typename T>
ArrayList<T> ArrayList<T>::operator=(ArrayList<T>& L)
{
    cout<<"nothing";         
    return L;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值