定义一个结构体
typedef struct {
int *data; //指向了第一个数据元素
int maxSize;
int length;
} SeqList;
初始化开辟一段连续的内存空间
void InitList(SeqList *L){
// malloc 申请一连串的内存空间 返回起始位置地址的指针
// 然后强转成数据元素类型所对应的指针 (int*) 指向int的指针
// 内存空间按每份int 4B 等分
L->data = (int *) malloc(initSize*sizeof(int ) );
L->length = 0;
L->maxSize = initSize;
}
如果初始化开辟的空间不够用 则扩容
其中malloc() 与 free() 是较为不安全的
因为释放申请的空间后,其内数据也不会抹掉,如果再次malloc 申请到有残留数据的空间。可能会造成错误。(这里不太懂,欢迎大佬互动)
void IncreaseSize(SeqList *L, int len){
// 获取初始的那一片连续空间 暂存原本的值
int *p = L->data;
//原本的变量 重新开辟一段内存空间
L->data = (int *) malloc((L->maxSize + len) * sizeof(int ) );
// 原本值 赋予 新的内存空间中
// 时间开销较大
for (int i = 0; i < L->length; ++i) {
L->data[i] = p[i];
}
//顺序表最大长度更新 结构体属性
L->maxSize = L->maxSize + len;
//释放掉暂存数据的空间
free(p);
}
向尾部添加一个元素
下标与位序相差1, length正好是最大下标的后一位。
void push_list(SeqList *L, int el){
// 下标+1 等于长度 如果大于等于 则容器分配的内存空间不足
if(L->length+1 >= L->maxSize){
// 扩容 空间翻倍
IncreaseSize(L,L->maxSize*2);
}
// 向尾部添加元素
L->data[L->length] = el;
L->length += 1;
}
删掉尾元素
void drop_tail(SeqList *L){
// 删除尾巴 用开辟的内存空间下一位置地址 替换尾巴的数值
L->data[L->length-1] = L->data[L->maxSize];
--L->length;
// 实际元素小于内存占用一半
if(L->length < L->maxSize / 2){
IncreaseSize(L,L->length/4 * 3 );
}
}
插入 元素从尾元素开始 依次向后位移一位
// 自由插入
// 顺序表 插入后半部分 尾元素向后依次移动一位
bool add_list(SeqList *L, int index, int el){
if(index < L->length){
for (int i = L->length; i >= index+1; --i) {
L->data[i] = L->data[i-1];
}
L->data[index] = el;
} else if(index >= L->maxSize || index < 0 || index > L->length+1){
return 0;
}
++L->length;
return 1;
}
删除
// 自由删除
// 顺序表 被删除的下一位开始 依次向前移动一位
bool remove_index(SeqList *L, int index){
// 不可删除未存在的值
if(L->length <= index){
return 0;
}
--L->length;
for(int i = index; i <= L->length; ++i){
L->data[i] = L->data[i+1];
}
// 实际元素小于内存占用一半
if(L->length < L->maxSize / 2){
IncreaseSize(L,L->length/4 * 3 );
}
return 1;
}
更改
// 安位改
void update_index(SeqList *L, int index, int el){
if(index < L->length){
L->data[index] = el;
}
}
// 安值改
void update_value(SeqList *L, int value, int el){
for (int i = 0; i < L->length; ++i) {
if(value == L->data[i]){
L->data[i] = el;
}
}
}
查询
// 查询元素首个位置 返回位序
int select_element(SeqList *L, int el){
for (int i = 0; i < L->length; ++i) {
if(el == L->data[i]){
return i+1;
}
}
return 0;
}
// 安位查找
int select_index(SeqList *L, int index){
return L->data[index];
}
迭代器
// 迭代器
int* iter(SeqList *L){
return L->data;
}
main() 测试
int main(){
//不可以声明为指针 否则是指向SeqList结构体的 传值时就不是变量L了
SeqList L;
// 取变量L地址
InitList(&L);
printf("data all the");
for (int i = 0; i < 10; ++i) {
push_list(&L,i);
printf(" %d", L.data[i]);
}
printf("\n");
push_list(&L, 333);
printf("push[10] is %d \n", L.data[10]);
drop_tail(&L);
printf("drop[10] is %d \n", L.data[10]);
printf("drop[10] is %d \n", *(iter(&L) + 1));
printf("L size %d \n", (int) sizeof(L.data));
add_list(&L,8,33333);
add_list(&L,13,13);
remove_index(&L,3);
for (int i = 0; i < L.maxSize; ++i) {
printf("%d:%d ",i, L.data[i]);
}
printf("\n%d", L.length);
return 0;
}