//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;
}