//构造函数和复制构造函数
template <class T>
Seqlist<T>::SeqList(int sz){
//构造函数,通过指定参数sz定义数组的长度
if(sz > 0){
maxSize = sz; last = -1;//置表的实际长度为空
data = new T[maxSize];
if(data == NULL)
{
cerr << "存储分配错误!"<< endl;
exit(1);
}
}
}
template <class T>
SeqList<T>::SeqList(SeqList<T>& L){
//复制构造函数,
maxSize = L.Size();last = L.Length()-1;
data = new T[maxSize];//创建顺序表存储数组
if(data == NULL)
{
cerr << "存储分配错误!"<< endl;exit(1);
}
for(int i =1; i <= last +1;i++)
data[i-1] = L.getData(i);
}
template <class T>
void SeqList<T>::reSize(int newSize){
//私有函数:扩充顺序表的存储数组空间大小
if(newSize <= 0)
{
cerr << "无效的数组大小" << endl;return;
}
if(newSize != maxSize){
T *newarray = new T[newSize]; //建立新数组
if(newarray == NULL)
{
cerr << "存储分配错误" << endl;exit(1);
}
int n = last+1;
T *srcptr = data; //源数组的首地址
T *destptr = newarray; //目的数组的首地址
while(n--) *destptr++ = *srcptr++;//复制
delete[]data; //删除老数组
data = newarray;maxSize = newSize; //复制新数组
}
}
template <class T>
int SeqList<T>::search(T& x)const{
//在表中顺序搜索与给定值x的匹配表项,找到则函数返回表项第几个元素
//不然返回0,搜索失败
for( int i=0; i <= last; i++)
if(data[i] == x)return i+1;
return 0;
}
template <class T>
int SeqList<T>::Locate(int i)const{
//定位函数: 函数返回第i个表项的位置
if(i >=1 && i <= last+1)return i;
else return 0;
}
- 插入和删除
-
//插入
template <class T>
bool SeqList<T>::Insert(int i, T& x){ //思考 T& x的意思
//将新元素插入表中i的位置
//成功返回true,否则返回false
if(last == maxSize-1) return false;//表满不可插入
if(i<0 || i>last+1)return false;
for (int j = last; j >= i; j--)
data[j+1] = data[j];
data[i] = x;
last++;
return true;
}
//删除
template <class T>
bool SeqList<T>::Remove(int i,T& x){
//从 表中删除第i个表项,通过引用型参数x返回删除的元素值
if(last == -1)return false;
if(i<1 || i>=last+1)return false;
x = data[i-1]; //存被删元素的值
for(int j=i; j<=last; j++)
data[j-1] = data[j];
last--;
return true;
}
- 顺序表的性能分析
- int search(T &x)是顺序搜索算法,从表的开始位置起,将各个表项值与x进行比较
- 最好情况:正好是表的第一项,比较次数为1;
- 最坏情况:正好是表的最后一项,比较次数为n;
- 平均情况:搜索各个项的概率相同,设为1/n,而比较的平均次数应当为ACN=1/n(1+2+3+4+5...+n)= (1+n)/2。
顺序表的插入时间代价:
- 最好在第n个表项插入,移动表项数为0;
- 最差在第一个表项插入,移动次数为n;
- 平均为AMN=1/(1+n)(n+...+1+0)=n/2;
- 顺序表的删除时间代价:
- 最好:删去最后一项,移动个数为0
- 最差:删去第一项,移动个数为n-1;
- 平均:AMN=1/n((n-1)+...+1+0)=(n-1)/2;
- 顺序表的应用