半吊子水准·几次修改,哎~GetIdx只能用在insert Set,不能用在remove函数内,具体是getidx的实现考虑到插入的时候可自动追加数组末尾等原因
SeqList.h代码如下
/* * File: SeqList.h * Author: bluce * * Created on 2013年1月6日, 下午5:36 */ #ifndef SEQLIST_H #define SEQLIST_H #include <iostream> template<class T> class SeqList { public: SeqList(int Size=64);//构造函数 SeqList(T value[],int value_len);//构造函数 virtual ~SeqList(); bool isEmpty();//方法判断顺序表是否为空 int length();//返回顺序表的长度 T get(int i);//返回顺序表相应位置的数据 bool set(int i,T x); void insert(int i,T x);//在相应位置插入数据 void insert(T x);//在顺序表末尾插入数据 bool remove(int i);//移除相应位置的数据 void clear();//清空顺序表 void SeqList<T>::Debug(); private: T *element;//顺序表 int size;//顺序表的容量 int len;//数组的大小 int getIdx(int i);//得到当前的索引 }; template <class T> int SeqList<T>::getIdx(int i) { i=i<0?this->len:i;//索引不存在则追加末尾 i=i<=this->len?i:this->len-1; return i; } template <class T> SeqList<T>::SeqList(int size) { this->size=size<64?64:size; this->element=new T[this->size];//申请一个双倍的空间 this->len=0; } template <class T> SeqList<T>::SeqList(T value[],int value_len) { if(value_len>0) { this->size=2*value_len; this->element=new T[this->size];//申请一个双倍的空间 this->len=value_len;//更改长度 for(int i=0;i<value_len;i++) { this->element[i]=value[i];//复制数据 } } } template <class T> SeqList<T>::~SeqList() { delete[] this->element; this->element=NULL; this->len=0; this->size=0; } template<class T> bool SeqList<T>::isEmpty()//判断链表是否为空 { return this->len==0;// } template<class T> int SeqList<T>::length() { return this->len; } template<class T> T SeqList<T>::get(int i) { i=getIdx(i); if(i>0) return this->element[i]; else return this->element[0]; } template<class T> bool SeqList<T>::set(int i,T x) { //i=i>=this->len?this->len-1:i; i=getIdx(i); if(i>=0) { this->element[i-1]=x; return true; } else { return false; } } template <class T> void SeqList<T>::insert(int i,T x) { i=getIdx(i); if(this->len==this->size)//如果数组已满,重新分配存储区 { T *temp=this->element;//定义数组指针并赋值 this->element=new T[len*2]; this->size*=2; for(int idx=0;idx<this->len;idx++) { this->element[idx]=temp[idx]; } delete[] temp; //删除指针 temp=NULL; } if(i<this->len)//i已经-1 { for(int j=this->len-1;j>=i;j--)//后移 this->element[j+1]=this->element[j]; } this->element[i]=x; this->len+=1; } template <class T> void SeqList<T>::insert(T x) { insert(this->len,x); } template <class T> bool SeqList<T>::remove(int i) { i=(i!=0)?i-1:0;//索引自减1 if(i>=0&&i<this->len) {//移除其实就是对移除的之后项进行左移操作,对于空间大小不必处理 for(i;i<this->len;i++) { this->element[i]=this->element[i+1]; } this->len-=1; return true; } else { return false; } } template <class T> void SeqList<T>::clear() { this->len=0; delete[] this->element; this->element=new T[this->size]; } template<class T> void SeqList<T>::Debug(void) { std::cout<<"---------- debug ----------"<<std::endl; std::cout<<"SeqList Size:"<<this->size<<std::endl; if(this->len>0) { std::cout << this->element[0]; for(int i=1;i<this->len;i++) { std::cout <<","<<this->element[i]; } std::cout <<std::endl; } } #endif /* SEQLIST_H */
welcome.cc 测试代码
#include <iostream> #include <string> #include "SeqList.h" #define MAXSIZE 20 //顺序表的最大长度 int main() {
using namespace std;
char t[5]={'a','b','c','f','g'};
SeqList<char> S(t,5);
S.Debug();
S.insert(4,'d');
S.insert(5,'e');
S.insert('h');
S.insert('i');
S.insert('j');
S.insert('k');
S.insert('l');
S.Debug();
S.set(1,'x');
S.set(2,'y');
S.Debug();
S.remove(0);
S.Debug();
S.remove(S.length());
S.Debug();
S.~SeqList();
S.Debug();
return 0;
}
执行结果~
---------- debug ----------
SeqList Size:10
a,b,c,f,g
---------- debug ----------
SeqList Size:20
a,b,c,f,d,e,g,h,i,j,k,l
---------- debug ----------
SeqList Size:20
x,y,c,f,d,e,g,h,i,j,k,l
---------- debug ----------
SeqList Size:20
y,c,f,d,e,g,h,i,j,k,l
---------- debug ----------
SeqList Size:20
y,c,f,d,e,g,h,i,j,k
---------- debug ----------
SeqList Size:0
运行 SUCCESSFUL (总时间: 78ms)
浙公网安备 33010602011771号