线性表
1. 顺序表
顺序表是指用一段连续的地址,依次存放数据元素的线性数据结构。此种存储方式使得顺序表的物理结构与逻辑结构都是连续的。
与数组的区别:函数中的数组被存放在栈段中,而栈段有系统限制的大小(可使用ulimit -s查看系统限制的大小,单位为KB),因此顺序表往往使用在堆段中操作管理动态数组的方式实现。
1.1 管理结点
在顺序表中,管理节点内部一般存放:数据域地址(*data)、**总容量(size)以及当前数据量(len)**等等。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Vector {
//数据域
int *data;
//总容量
int size;
//当前元素个数 或 指向末尾元素的后一位
int len;
} Vector;
//初始化
Vector *initVector(int size){
Vector *v = (Vector *) malloc(sizeof(Vertor));
v->data = (int *) malloc(sizeof(int) * size);
v->len = 0;
v->size = size;
return v;
}
//释放
void freeVector(Vector *v){
if(!v) return;
free(v->data);
free(v);
}
int main(){
//初始化size为10的线性表
Vector *v = initVector(10)
return 0;
}
1.2 顺序表的插入
//插入
//将 v->data[idx] 处变成 val
void insert(Vector *v, int idx, int val){
//判断 v 是否为空 返回
if(!v) return;
//判断 idx 是否合法
if(idx > v->len || idx < 0) return ;
//判断 v 的容量是否已满
if(v->len == v->size) return ;
//维护顺序表的特性 将 idx 及之后的元素后移
for(int i = v->len; i > idx ;i++){
v->data[i] = v->data[i - 1];
}
//在 idx 处插入数据
v->data[i] = val;
//更新当前元素个数
v->len++;
}
1.3 顺序表的删除
//删除
//将 v->data[idx] 删除
void delete(Vector *v, int idx){
if(!v) return ;
if(idx >= v->len || idx < 0) return ;
// idx 之后的元素前移
for(int i = idx; i < v->len-1;