- 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。
- 顺序表一般可以分为:
1.静态顺序表:使用定长数组存储。
2.动态顺序表:使用动态开辟的数组存储。 - 以下是顺序表实现的代码:
typedef int SLDataType;
typedef struct SeqList{
SLDataType * array;
size_t size;
size_t capacity;
}SeqList;
/初始化顺序表(要给数组开辟空间)
void SeqListInit(SeqList* sl, size_t capacity){
sl->array = malloc(capacity*sizeof(SLDataType));
assert(sl->array);
sl->size = 0;
sl->capacity = capacity;
}
/销毁顺序表
void SeqListDestory(SeqList* sl){
assert(sl);
free(sl->array);
sl->array = NULL;
sl->size = 0;
sl->capacity = 0;
}
/顺序表增容(利用一个新的数组)
void CheckCapacity(SeqList* sl){
assert(sl);
if (sl->size >= sl->capacity){
size_t newcapacity = sl->capacity * 2;
SLDataType* newarray = malloc(sizeof(SLDataType)* newcapacity);
assert(newarray);
for (int i = 0; i < sl->size; i++){
newarray[i] = sl->array[i];
}
free(sl->array);
sl->array = newarray;
sl->capacity = newcapacity;
}
else{
return;
}
}
/尾插
void SeqListPushBack(SeqList* sl, SLDataType x){
assert(sl);
CheckCapacity(sl);
sl->array[sl->size] = x;
sl->size++;
}
/尾删
void SeqListPopBack(SeqList* sl){
assert(sl->size);
sl->size--;
}
/头插
void SeqListPushFront(SeqList* sl, SLDataType x){
assert(sl);
CheckCapacity(sl);
for (int i = sl->size - 1; i >= 0; i--){
sl->array[i + 1] = sl->array[i];
}
sl->array[0] = x;
sl->size++;
}
/头删
void SeqListPopFront(SeqList* sl){
assert(sl->size);
for (int i = 0; i < sl->size - 1; i++){
sl->array[i] = sl->array[i + 1];
}
sl->size--;
}
/插入(pos表示的是要插入元素位置的下标)
void SeqListInsert(SeqList* sl, size_t pos, SLDataType x){
assert(sl->array);
assert(pos >= 0 && pos <= sl->size);
for (int i = sl->size - 1; i >= pos; i--){
sl->array[i + 1] = sl->array[i];
}
sl->array[pos] = x;
sl->size++;
}
/删除
void SeqListErase(SeqList* sl, size_t pos){
assert(sl->array);
assert(pos >= 0 && pos < sl->size);
for (int i = pos; i < sl->size - 1; i++){
sl->array[i] = sl->array[i + 1];
}
sl->size--;
}
/查找某一元素
size_t SeqListFind(SeqList* sl, SLDataType x){
assert(sl);
for (int i = 0; i < sl->size; i++){
if (sl->array[i] == x){
return i;
}
}
return -1;
}
/删除第一个值为x的元素
void SeqListRemove(SeqList* sl, SLDataType x){
assert(sl->array);
int pos = SeqListFind(sl, x);
if (pos == -1){
return;
}
else{
SeqListErase(sl, pos);
}
}
/删除所有值为X的元素(不满足要求,保留数据)
void SeqListRemoveAll(SeqList* sl, SLDataType x){
int i, j;
for (i = 0, j = 0; i < sl->size; i++){
if (sl->array[i] != x){
sl->array[j] = sl->array[i];
j++;
}
}
sl->size = j;
}
/替换表中的某一元素
void SeqListModify(SeqList* sl, size_t pos, SLDataType x){
assert(sl->array);
assert(pos >= 0 && pos < sl->size);
sl->array[pos] = x;
}