- 顺序表的构造函数和复制函数
//构造函数和复制构造函数 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;
- int search(T &x)是顺序搜索算法,从表的开始位置起,将各个表项值与x进行比较
- 顺序表的应用