动态分配顺序表总体和静态的没多大区别,就是随时可以进行扩容。
扩容流程为:1、分配一段连续的新空间,空间大小为扩容后的大小。
2、将原空间的数据粘贴到新空间。
3、释放原空间,将原空间指针指向新空间。
需要注意的是扩容并不是在原空间的基础上再加一点空间,而是在其他位置分配一段连续的,大小足够的新空间,将数据都放在新空间,原空间释放掉。
#include<bits/stdc++.h>
using namespace std;
#define InitSize 10//表长度初始化定义;
typedef struct{
int *data;//指示动态分配数组的指针 ;
int MaxSize,Length;//最大容量和当前个数;
}SqList;
//初始化
void InitList(SqList &L){
L.data=new int[InitSize];//分配大小为IntSize的int数据类型的空间;
L.Length=0;
L.MaxSize=InitSize;//初始化存储容量;
}
//扩容,表的大小不够时进行扩容,前提是要有足够内存大小
void ExpendList(SqList &L,int NewSize){
SqList Newdata;
Newdata.data=new int[NewSize];
Newdata.Length=0;
for(int i=0;i<L.Length;i++){
Newdata.data[i]=L.data[i];
Newdata.Length++;
}
delete[] L.data;
L.data=Newdata.data;
L.MaxSize=NewSize;
}
//插入,在第i个位置插入e
bool ListInsert(SqList &L,int i, int e){
if(i<1||i>L.Length+1){
return false;
}
if(L.Length>=L.MaxSize){
return false;
}
for(int j=L.Length;j>i-1;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.Length++;
return true;
}
//按值查找,查找value,返回它在表中位置(假设表中只有唯一一个value,或者返回第一个);
int LocateElem(SqList &List,int value){
for(int i=0;i<List.Length;i++){
if(List.data[i]==value){
return i+1;//注意返回的位置是从1开始,不是下标;
}
}
return -1;//没找到返回-1;
}
//按位查找,查找第i个元素,对应下标为i-1;
int GetElem(SqList &List,int i){
if(i>List.Length || i<1){
return false;
}
return List.data[i-1];
}
/*删除操作,删除第i个元素;
也可以进行按值删除,过程类似*/
bool SqListDelet(SqList &List,int i){
if(i<1 || i>List.Length){
return false;
}
for(int j=i-1;j<List.Length;j++){
List.data[j]=List.data[j+1];
}
List.Length--;
return true;
}
int main(){
SqList List;
InitList(List);//初始化长为10的静态顺序表;
for(int i=0;i<10;i++){
List.data[i]=i+1;//把值赋了[1,2,3,4,5,6,7,8,9,10];
List.Length++;
cout<<List.data[i];
}
cout<<endl<< "数字8在表中位置为"<<LocateElem(List,8)<<endl;
cout<<"第3个数字为:"<<GetElem(List,3)<<endl;
//因为再插入元素,表的长度会大于最大长度,而我们又没有重新分配空间
//所以下面这个插入操作没执行
if(ListInsert(List,3,9)){
//在第三个位置插上9999;
for(int i=0;i<List.Length;i++){
cout<<List.data[i];
}
}
cout<<endl;
if(SqListDelet(List,3)){
//删除第3个元素
for(int i=0;i<List.Length;i++){
cout<<List.data[i];
}
}
cout<<endl;
if(ListInsert(List,3,3)){
//在第3个位置插上3;
for(int i=0;i<List.Length;i++){
cout<<List.data[i];
}
}
cout<<endl<<"扩容前长度为:"<<List.Length<<endl<<"最大长度为:"<<List.MaxSize<<endl;
//扩容,扩容后大小为15
ExpendList(List,15);
cout<<"扩容后长度为:"<<List.Length<<endl<<"最大长度为:"<<List.MaxSize<<endl;
//扩容后添加数据;
for(int i=List.Length;i<List.MaxSize;i++){
List.data[i]=i+1;
List.Length++;
}
cout<<"扩容后数据:" ;
for(int i=0;i<List.Length;i++){
cout<<List.data[i]<<endl;
}
cout<<endl<<"长度为:"<<List.Length;
return 0;
}