using namespace std;
//
typedef struct {
int * elem; //定义数组
int length; // 当前长度 ,线性表的元素个数,并不是数组长度
int listsize; //数组的长度
} SqList; // 俗称 顺序表
Status InitList(SqList *L);
Status ListEmpty(SqList *L);
int ListLength(SqList *L);
int getElem(SqList *L,int i);//返回i的元素
int locateElem(SqList *L,int e);//返元素的位置
Status ListInsert(SqList *L,int i,int e);
int ListDelete(SqList *L,int i);//删除第i个元素返回这个元素
void Traverse(SqList *L);//遍历列表
Status InitList(SqList * L){
L->elem=(int *)malloc(sizeof(int)*INITIALSIZE);
if (!L->elem){cout<<"分配失败"<<endl;exit(-1);}
L->length=0;
L->listsize=INITIALSIZE;
return OK;
}
Status ListEmpty(SqList * L){
if (L->length==0)return OK;
}
int ListLength(SqList * L){return L->length;}
Status ListInsert(SqList * L,int i,int e){
if (i<1||i>L->length+1){cout<<"赋值失败"<<endl;return error;}//如果输入的下表不足1,或者大于数组的长度,就返回错误
if (L->length>=L->listsize){
int * newbase=(int *)realloc(L->elem,sizeof(int)*((L->listsize<<2)+L->listsize));
if (!newbase)return error;
L->elem=newbase;
L->listsize+=(L->listsize<<2);
}
int * q=&(L->elem[i-1]);//插入位置
for(int * p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L->length;
return OK;
}
void Traverse(SqList * L){
for (int i=0;i<L->length;++i){
cout<<L->elem[i]<<" ";
}
}
int getElem(SqList *L,int i){
if (i<1||i>L->length)return error;
return L->elem[i];
}
int locateElem(SqList *L,int e){
// int *p = L;
// for (int * q=L->elem[L->length-1];q>p;++q){
// if (*q==e)return
// }
for (int i=0;i<L->length;i++){
if (L->elem[i]==e)return i;
}
return -1;
}
int ListDelete(SqList *L,int i){
if (i<1||i>L->length+1){cout<<"树枝不对"<<endl;return error;}
//删除的位置 删除之后依次前移
for (int * q=&(L->elem[i+1]);q<&(L->elem[L->length-1]);q++){
*(q-1)=*q;
}
--L->length;
return OK;
}
int main(){
SqList mm;
if (InitList(&mm)){
for (int i=1;i<=30;i++){
ListInsert(&mm,i,i);
}
Traverse(&mm);
ListDelete(&mm,2);
cout<<endl<<"删除之后"<<mm.length<<endl;
Traverse(&mm);
cout<<endl<<mm.elem[2]<<endl;
cout<<locateElem(&mm,12);
};
return 0;
}