在顺序表中,每一个元素的内存空间是连续的,可以通过下标与首地址直接计算出对应元素的地址。类似于数组,因此在线性表中,顺序表的效率是极高的。
定义
typedef struct{
ContentType *content;
int length;
}SList;
顺序表由数组和其长度组成
初始化
SList list;
list.content =(ContentType*)malloc(sizeof(ContentType)*MAX_SIZE);
list.length = 0;
初始化时需要给数组分配内存空间,并且将长度置为0
增
Status insert(SList *list, int index,ContentType content){ // 插入
if(list->length<index || index < 0 || index >= MAX_SIZE){ // 如果下标有问题
return ERROR;
}
int i = 0;
for(i=list->length;i>index;i--){
list->content[i] = list->content[i-1]; // 在插入位置前的各个元素往后挪一位
}
list->content[index] = content;
list->length = list->length + 1; // 长度加一
return SUCCESS;
}
将插入位置后面的元素依次往后挪一位
再将对应位置改成待插入的元素
删
Status removeOne(SList *list,int index){ // 删除
if(list->length <= index || index < 0){
return ERROR;
}
int i = 0;
for (i=index;i<=list->length-2;i++){
list->content[i] = list->content[i+1]; //用下一位覆盖此位
}
list->length = list->length - 1; // 长度减一
return SUCCESS;
}
将后面的元素向前移动,覆盖待删除元素
改
Status set(SList *list,int index,ContentType content){ // 修改某一位
if(list->length <= index || index < 0){
return ERROR;
}
list->content[index] = content;
return SUCCESS;
}
直接修改对应下标位置的数据
查
Status getItem(SList *list,int index,ContentType *content){ // 通过下标查找元素
if(list->length <= index || index < 0){
return ERROR;
}
*content = list->content[index];
return SUCCESS;
}
Status getIndex(SList *list, ContentType content, int *index){ // 通过元素查找下标 找到第一个
int i = 0;
for(i=0;i<list->length;i++){
if(list->content[i]==content){
*index = i;
return SUCCESS;
}
}
return ERROR;
}
通过下标找元素就直接按照数组的操作方法来即可
通过元素找下标则需要遍历数组,这里是找出第一个,那找到后直接return即可