目录
顺序表
一、初始化
/*初始化*/
void InitList(SqList *L,int MAX){
L->elem=new ElemType[MAX];
L->length=0;
L->MAX=MAX;
}
二、销毁
/*销毁*/
void DestroyList(SqList *L){
delete [] L->elem;
}
三、获取表长
/*获取顺序表的长度*/
int ListLength(SqList *L){
return L->length;
}
四、判空
/*判断顺序表是否为空*/
bool ListEmpty(SqList *L){
return L->length==0;
}
五、插入
/*插入*/
void ListInsert(SqList *L,int idx,ElemType e){
if(idx<0||idx>L->length){//判断插入的idx是否和法
throw std::invalid_argument("Invalid idx");//不合法输出异常
}
if(L->length==L->MAX){//当长度大于MAX进行库容
int newMAX=L->MAX*2;
ElemType *newelem=new ElemType[newMAX];
for(int i=0;i<L->length;i++){
newelem[i]=L->elem[i];
}
delete [] L->elem;
L->elem=newelem;
L->MAX=newMAX;
}
for(int i=L->length;i>idx;i--){
L->elem[i]=L->elem[i-1];//将idx下标后的元素后移,为插入的e空出位置
}
L->elem[idx]=e;//将插入e所对应的下标位置
L->length++;//插入后长度加一
}
六、删除
/*删除*/
void ListDelete(SqList *L,int idx){
if(idx<0||idx>=L->length){//判断删除的idx是否和法
throw std::invalid_argument("Invalid idx");//不合法输出异常
}
for(int i=idx;i<L->length-1;i++){
L->elem[i]=L->elem[i+1];//将idx下标后的元素往前移,填补删除idx下标的空位置
}
L->length--;//删除后长度减一
}
七、查找
/*查找*/
int LocateElem(SqList *L,ElemType e){
for(int i=0;i<L->length;i++){
if(L->elem[i]==e){//查到返回该元素的下标
return i;
}
}
return -1;
}
八、索引
/*索引*/
ElemType GetElem(SqList *L,int idx){
if(idx<0||idx>=L->length){//判断索引的idx是否和法
throw std::invalid_argument("Invalid idx");//不合法输出异常
}
return L->elem[idx];
}
九、修改
/*修改*/
void update_elem(SqList *L,int idx,ElemType value){
if(idx<0||idx>=L->length){//判断修改的idx是否和法
throw std::invalid_argument("Invalid idx");//不合法输出异常
}
L->elem[idx]=value;
}
源码:
#include<bits/stdc++.h>
using namespace std;
//插入、删除 、查找,索引(下标)、修改
#define ElemType int
struct SqList{
ElemType *elem;//存储的地址
int length;//当前长度
int MAX;//顺序表可达到的最大长度
}; //顺序表的类型为SqList
/*初始化*/
void InitList(SqList *L,int MAX){
L->elem=new ElemType[MAX];
L->length=0;
L->MAX=MAX;
}
/*销毁*/
void DestroyList(SqList *L){
delete [] L->elem;
}
/*获取顺序表的长度*/
int ListLength(SqList *L){
return L->length;
}
/*判断顺序表是否为空*/
bool ListEmpty(SqList *L){
return L->length==0;
}
/*插入*/
void ListInsert(SqList *L,int idx,ElemType e){
if(idx<0||idx>L->length){//判断插入的idx是否和法
throw std::invalid_argument("Invalid idx");//不合法输出异常
}
if(L->length==L->MAX){//当长度大于MAX进行库容
int newMAX=L->MAX*2;
ElemType *newelem=new ElemType[newMAX];
for(int i=0;i<L->length;i++){
newelem[i]=L->elem[i];
}
delete [] L->elem;
L->elem=newelem;
L->MAX=newMAX;
}
for(int i=L->length;i>idx;i--){
L->elem[i]=L->elem[i-1];//将idx下标后的元素后移,为插入的e空出位置
}
L->elem[idx]=e;//将插入e所对应的下标位置
L->length++;//插入后长度加一
}
/*删除*/
void ListDelete(SqList *L,int idx){
if(idx<0||idx>=L->length){//判断删除的idx是否和法
throw std::invalid_argument("Invalid idx");//不合法输出异常
}
for(int i=idx;i<L->length-1;i++){
L->elem[i]=L->elem[i+1];//将idx下标后的元素往前移,填补删除idx下标的空位置
}
L->length--;//删除后长度减一
}
/*查找*/
int LocateElem(SqList *L,ElemType e){
for(int i=0;i<L->length;i++){
if(L->elem[i]==e){//查到返回该元素的下标
return i;
}
}
return -1;
}
/*索引*/
ElemType GetElem(SqList *L,int idx){
if(idx<0||idx>=L->length){//判断索引的idx是否和法
throw std::invalid_argument("Invalid idx");//不合法输出异常
}
return L->elem[idx];
}
/*修改*/
void update_elem(SqList *L,int idx,ElemType value){
if(idx<0||idx>=L->length){//判断修改的idx是否和法
throw std::invalid_argument("Invalid idx");//不合法输出异常
}
L->elem[idx]=value;
}
void _slove(){
SqList _L;
InitList(&_L,10);//初始化长度为10
cout<<"Is empty: "<<ListEmpty(&_L)<<endl;//判断是否为空(输出0为非空,1为空)
for(int i=0;i<10;i++){
ListInsert(&_L,i,i*10);//插入元素
}
cout<<"Length: "<<ListLength(&_L)<<endl; //输出当前顺序表的长度
cout<<"Is empty: "<<ListEmpty(&_L)<<endl;//判断是否为空(输出0为非空,1为空)
for(int i=0;i<ListLength(&_L);i++){
cout<<GetElem(&_L,i)<<' '; //查找当前下标的元素并输出
}
cout<<endl;
ListDelete(&_L,6);//删除下标为6的元素
update_elem(&_L,2,1314); //修改下标为2的元素
for(int i=0;i<ListLength(&_L);i++){//输出进行删除和修改后的顺序表中的元素
cout<<GetElem(&_L,i)<<' ';
}
cout<<endl;
int idx=LocateElem(&_L,10); //查找10这个元素的下标
update_elem(&_L,idx,520);//修改记录的idx下标的元素
for(int i=0;i<ListLength(&_L);i++){//输出进行索引和修改后的顺序表中的元素
cout<<GetElem(&_L,i)<<' ';
}
cout<<endl;
DestroyList(&_L);
}
int main(){
_slove();
return 0;
}