顺序表的删除 文章目录代码代码解读边界判断e L.data[i-1];元素前移循环L.length- -;疑问解答为什么要使用 e?为什么删除判断不用 length1为什么先存 e 再移动元素C语言-指针版 顺序表的删除代码#includestdio.h#defineMaxSize10// 定义数组最大容量typedefstruct{intdata[MaxSize];// 静态数组存储数据intlength;// 顺序表当前有效元素个数}SqList;// 初始化顺序表voidInitList(SqListL){for(inti0;iMaxSize;i){L.data[i]0;// 数组全部置0清空垃圾值}L.length0;// 初始无有效元素}// 删除操作删除位序i的元素被删元素存入e带回boolListDelete(SqListL,inti,inte){// C 引用用来把被删掉的元素传出函数给 main 的 e 变量// 删除合法范围1 ≤ i ≤ length只能删已存在的元素if(i1||iL.length)returnfalse;eL.data[i-1];// 取出要删除的元素存入引用变量e// i位置之后所有元素整体向前覆盖一位for(intji;jL.length;j)L.data[j-1]L.data[j];L.length--;// 有效元素数量-1returntrue;}intmain(){SqList L;InitList(L);// ...省略插入数据操作inte-1;// 用来接收被删除的元素if(ListDelete(L,3,e)){printf(已删除第3个元素删除的元素值为%d \n,e);}else{printf(位序 i 不合法删除失败\n);}return0;}代码解读边界判断if(i1||iL.length)returnfalse;删除只能删已经存在的元素插入范围1 ≤ i ≤ length1允许表尾空位删除范围1 ≤ i ≤ length没有空位可删举例当前 length3只能删 i1/2/3i4 直接非法。e L.data[i-1];位序 i转数组下标i-1先把要删除的值存到 e因为后面元素前移会覆盖这个位置不提前存就丢失数据int e是引用函数内赋值会直接修改main里的变量e。元素前移循环for(intji;jL.length;j)L.data[j-1]L.data[j];举例子length4删除 i2下标对应i2 → 下标 1j 从 2 开始到 3j2data [1] data [2]j3data [2] data [3]后面所有元素整体往前挪一格覆盖掉被删除的位置。和插入循环对比记忆插入元素从后往前后移删除元素从前往后前移L.length- -;成功删除一个有效元素有效长度计数器-1和插入的L.length成对出现。疑问解答为什么要使用 e?普通传参int e只是副本函数内部赋值无法带回主函数引用int e是外部变量别名能把被删元素传出。当在 main 中调用ListDelete(L, 3, e);时编译器不会把 e 的值复制一份传给函数而是把 e 在栈上的地址偷偷传进函数内部。在函数ListDelete()中的e是外部变量的别名指向同一块内存地址。需要使用 “带回返回值”。那为什么不能直接return L.data[i-1]因为函数已经用 return 来返回操作状态true/false了。为了同时把“被删元素的值”带出来C 语言必须借助引用参数或指针参数来输出额外数据。为什么删除判断不用 length1插入允许在最后一个元素后面新增空位删除只能删已经存在的元素末尾空位不存在数据不能删。为什么先存 e 再移动元素前移会覆盖data[i-1]如果先移动再存原始数据直接丢失。C语言-指针版 顺序表的删除#includestdio.h#includestdbool.h#defineMaxSize10typedefstruct{intdata[MaxSize];intlength;}SqList;voidInitList(SqList*L){for(inti0;iMaxSize;i)L-data[i]0;L-length0;}boolListDelete(SqList*L,inti,int*e){if(i1||iL-length)returnfalse;*eL-data[i-1];for(intji;jL-length;j)L-data[j-1]L-data[j];L-length--;returntrue;}intmain(){SqList L;InitList(L);inte;if(ListDelete(L,3,e)){printf(删除元素%d,e);}else{printf(删除失败);}return0;}