目录
这一节来说一下线性表的顺序存储结构,其实上一节的动态数组就是线性表的顺序存储结构的实现;
1. 基本概念;
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素;
2. 顺序存储的设计与实现;
算法要点:
(1)插入元素算法;
1. 判断线性表是否合法;
2. 判断插入位置是否合法;
3. 把待插入元素的位置与最后一个元素的位置之间的所有元素都后移一个位置;
4. 将新元素插入;
5. 线性表长度加1;
插入元素代码实现:
//插入
void PushBack_Array(Dynamic_Array* arr, int value){
if (arr == NULL){
//这里的return;相当于break;直接中断返回值为void类型的函数的执行;
return;
}
//判断原空间内存是否足够,若是刚好满了,则需要另辟空间
if (arr->size == arr->capacity){
//第一步 申请一块更大的内存空间 新空间是旧空间的2倍
int* newSpace = (int*)malloc(sizeof(int )* arr->capacity * 2);
/*第二步 拷贝数据到新的空间
/memcpy函数有3个参数,分别是目标空间,原空间和拷贝的大小*/
memcpy(newSpace,arr->pAddr,arr->capacity * sizeof(int));
//第三步 释放旧空间的内存
free(arr->pAddr);
//第四步 更新新空间的容量以及指针指向(从pAddr改为newSpace)
arr->capacity = arr->capacity * 2;
arr->pAddr = newSpace;
}
//插入新元素
//在元素数组的最后一个位置(即arr->size)加进去,数组从0开始,所以不需要加1
arr->pAddr[arr->size] = value;
//注意数组的元素个数要加1
arr->size++;
}
(2)删除元素算法;
1. 判断线性表是否合法;
2. 判断删除位置是否合法;
3. 将元素取出;
4. 将删除位置后的元素分别向前移动一个位置;
5. 线性表的长度减1
删除元素代码实现:
//根据位置删除
void RemoveByPos_Array(Dynamic_Array* arr, int pos){
if (arr == NULL){
return;
}
//判断元素位置pos是否有效,pos从0开始
if (pos < 0 || pos >= arr->size){
return;
}
//删除元素
for (int i = pos; i < arr->size - 1; i++){
/*这里为了防止当最后一个元素需要删除时,也就不存在i+1了,
因此上述的for循环条件中的i是小于arr->size - 1的*/
arr->pAddr[i] = arr->pAddr[i + 1];
}
//注意数组的元素个数要减1
arr->size--;
}
3. 优缺点;
优点:
无需为线性表中的逻辑关系增加额外的空间;
可以快速的获取表中的合法位置的元素;
缺点:
插入和删除操作需要移动大量元素;
当线性表长度变化较大的时候,难以确定存储空间的容量是否足够;