顺序表是什么
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表,顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。线性表采用指针链接的方式存储就称之为链表。
顺序表图示
顺序表的基本操作
线性表的动态分配顺序结构:
typedef struct SeqList{
int *array; //存储空间基地址
int capacity; //顺序表的容量
int size; //当前长度
} SeqList;
线性表的增删改查操作:
//确保容量够用,不需要扩容,什么都不做
//需要扩容就扩容
//影响函数的链接属性,从外部链接属性->内部链接属性
static void CheckCapacity(SeqList *ps){
if (ps->size < ps->capacity){
return;
}
//需要扩容
int newCapacity = ps->capacity * 2;
int *newArray = (int *)malloc(sizeof(int)*newCapacity);
assert(newArray != NULL);
//搬家
for (int i = 0; i < ps->size; i++){
newArray[i] = ps->array[i];
}
//释放老空间,绑定新空间
free(ps->array);
ps->array = newArray;
ps->capacity = newCapacity;
}
//顺序表的初始化
void SeqListInit(SeqList *ps, int capacity){
assert(ps != NULL);
if (ps != NULL){
return;
}
ps->array = malloc(sizeof(int)*capacity);
assert(ps->array != NULL);
ps->size = 0;
ps->capacity = capacity;
}
//顺序表的销毁
void SeqListDestroy(SeqList *ps){
assert(ps != NULL);
assert(ps->array != NULL);
//释放空间
free(ps->array);
ps->array = NULL;
ps->capacity = 0;
ps->size = 0;
}
//顺序表的尾插
void SeqListPushBack(SeqList *ps, int v){
CheckCapacity(ps);
ps->array[ps->size] = v;
ps->size++;
}
//顺序表的头插
void SeqListPushFront(SeqList *ps, int v){
CheckCapacity(ps);
for (int i = ps->size; i >= 1; i--){
ps->array[i] = ps->array[i - 1];
}
ps->array[0] = v;
ps->size++;
}
//在顺序表的特定位置插入值
void SeqListInsert(SeqList *ps, int pos, int v){
CheckCapacity(ps);
assert(pos >= 0 && pos <= ps->size);
for (int i = ps->size; i >= pos; i--){
ps->array[i] = ps->array[i-1];
}
ps->array[pos] = v;
ps->size++;
}
//顺序表的尾删
void SeqListPopBack(SeqList *ps){
assert(ps->size > 0);
ps->size--;
}
//顺序表的头删
void SeqListPopFront(SeqList *ps){
assert(ps->size > 0);
for (int i = 0; i < ps->size - 2; i++){
ps->array[i] = ps->array[i+1];
}
ps->size--;
}
//删除特定位置的值
void SeqListErase(SeqList *ps, int pos){
assert(pos >= 0 && pos <= ps->size);
for (int i = pos + 1; i < ps->size; i++){
ps->array[i - 1] = ps->array[i];
}
ps->size--;
}
//顺序表的查找
void SeqListFind(SeqList *ps, int v){
for (int i = 0; i < ps->size; i++){
if (ps->array[i] == v){
return 1;
}
}
return -1;
}
//顺序表的修改
void SeqListModify(SeqList *ps, int pos, int v){
assert(pos >= 0 && pos <= ps->size);
ps->array[pos] = v;
}
//顺序表找到指定位置并进行删除
void SeqListRemove(SeqList *ps, int pos, int v){
SeqListFind(ps, v);
if (pos == -1){
return;
}
SeqListErase(ps, v);
}
//顺序表找到指定的值,并将找到的特定值的所有元素都删除掉
void SeqListRemoveAll(SeqList *ps, int v){
int i, j;
for (i = 0, j = 0; i < ps->size; i++){
if (ps->array[i] != v){
ps->array[j] = ps->array[i];
}
j++;
}
ps->size = j;
}
刚开始学习数据结构,如果有不正确的地方,欢迎指正。