网站建设投标人资质要求,发布app需要什么条件,手机号申请邮箱,哪家公司建网站好目录
线性表
顺序表
动态顺序表类型
初始化 销毁
打印
检查空间是否充足#xff08;扩容#xff09;
尾部插入
头部插入
尾部删除
头部删除
指定位置插入
指定位置删除
查找数据 线性表 线性表是n个相同特性的数据元素组成的有限序列#xff0c;其是一种广泛运…目录
线性表
顺序表
动态顺序表类型
初始化 销毁
打印
检查空间是否充足扩容
尾部插入
头部插入
尾部删除
头部删除
指定位置插入
指定位置删除
查找数据 线性表 线性表是n个相同特性的数据元素组成的有限序列其是一种广泛运用的数据结构常见的线性表有顺序表、栈、链表、队列等。 其在逻辑上是线性的物理结构存储结构上不一定是线性的。 顺序表 顺序表就是线性表的一种它在逻辑结构与物理结构上都是连续的一般情况下它的底层就是数组在数组基础上多了增删查改操作。
顺序表有静态顺序表和动态顺序表我们常常采用动态顺序表因为它的扩容方便、空间浪费更少。 动态顺序表类型
typedef int SeqDataType;//将动态顺表的存储数据的类型重命名方便后期统一修改//动态顺序表
typedef struct SeqList {//命名Sequence List顺序表SeqDataType* arr;int capacity;//动态顺序表的容量int size;//动态顺序表的有效个数
}SL; 初始化
//初始化
void SLInit(SL* s) {s-arr NULL;s-capacity s-size 0;
} 销毁
//销毁
void SLDestory(SL* s) {if (!s-arr) {//等同于s-arrNULL判断要释放的空间是否是NULL防止释放NULLperror(Destory Fail);//打印错误exit(1);}free(s-arr);//释放动态开辟的内存s-arr NULL;s-capacity s-size 0;
} 打印
打印操作方便我们检查错误。
//打印
void SLPrint(SL* s) {assert(s);for (int i 0; i s-size; i) {printf(%d , s-arr[i]);}printf(\n);
}检查空间是否充足扩容
插入操作会扩大空间大小那么在进行插入操作前我们应该检查空间是否充足扩容
//检查空间是否充足扩容
void SLCheckCapacity(SL* s) {if (s-capacity s-size) {//判断有效元素个数是否和空间大小相同相同空间用满了要扩容int newcapacity s-capacity 0 ? 4 : s-capacity * 2;//空间是否为0,是赋个初值4防止按倍数扩容出错//不是按两倍扩容赋给临时变量防止扩容失败对原capacity改变SeqDataType* p (SeqDataType*)realloc(s-arr, sizeof(SeqDataType) *newcapacity);//这里是为s-arr扩容不是为结构体动态顺序表if (!p) {perror(realloc fail);exit(1);}s-arr p;s-capacity newcapacity;}
}尾部插入
//尾插
void SLPushBack(SL* s, SeqDataType x) {assert(s);SLCheckCapacity(s);//检查空间是否充足s-arr[s-size] x;//尾部插入数据并使有效元素加1
} 头部插入
//头插
void SLPushFront(SL* s, SeqDataType x) {assert(s);//SLCheckCapacity(s);for (int i s-size ; i 0; i--) {s-arr[i] s-arr[i-1];}//将数据整体后移一位腾出第一位给头插且循环条件初始化i等于s-sizes-arr[0] x;s-size;//别忘了将有效数据个数加一
} 尾部删除
//尾删
void SLPopBack(SL* s) {assert(s-arr);//不能对空数组进行删除assert(s-size);//不能对有效元素0个的数组进行删除s-size--;//直接使有效元素个数减1即可
} 头部删除
//头删
void SLPopFront(SL* s) {assert(s-arr);assert(s-size);for (int i 0; i s-size - 1; i) {s-arr[i] s-arr[i 1];}//注意循环条件s-size-1取到最后一个元素前一个位置s-size--;
} 指定位置插入
//指定位置之前插入数据
void SLInsert(SL* s, int pos, SeqDataType x) {assert(s);assert(pos 0 pos s-size);//pos0时头插poss-size时尾插SLCheckCapacity(s);for (int i s-size; i pos; i) {//从pos位置开始腾出位置给要插入的数据s-arr[i] s-arr[i - 1];}s-size;s-arr[pos] x;
} 指定位置删除
//指定位置删除
void SLErase(SL* s, int pos) {assert(s-arr);assert(pos 0 pos s-size);//保证pos是可删除的for (int i pos; i s-size - 1; i) {//使pos以后的数据向前移一位s-arr[i] s-arr[i 1];}s-size--;
} 查找数据
//查找数据
void SLFind(SL* s, SeqDataType x) {assert(s-arr);assert(s-size 0);for (int i 0; i s-size; i) {//遍历顺序表找到值返回下标找不到返回-1if (s-arr[i] x) {return i;}}return -1;
} 最后我们来测试一下我们写的代码