c 做精品课程网站,做微信网站公司名称,wordpress淘宝客 采集器,我的世界做封面网站目录
顺序表的头插(SLPushFront)
此时#xff1a;我们有两个思路#xff08;数组移位#xff09;
顺序表的头删(学会思维的变换)(SLPopFront)
顺序表的尾插(SLPushBack)
有尾插就有尾删
既然头与尾部的插入与删除都有#xff0c;那必然少不了指定位置的插入删除
查找…目录
顺序表的头插(SLPushFront)
此时我们有两个思路数组移位
顺序表的头删(学会思维的变换)(SLPopFront)
顺序表的尾插(SLPushBack)
有尾插就有尾删
既然头与尾部的插入与删除都有那必然少不了指定位置的插入删除
查找目标值
指定位置插入(SLInsert)
指定位置删除(SLErase)
打印(顺序表的结尾之声)
书接上文
顺序表的头插(SLPushFront)
头插 对于头插我们需要先将数组头部的位置空余出来存放我们需要插入的数x
所以我们需要将数组中的数向后移一位
此时我们有两个思路数组移位
1、从下标为0开始向后置换此时会出现数值覆盖的问题我们需要另创建一个变量tmp存放后一个值以防覆盖之后寻找不到当tmp的下一个数组为NULL时怎么办了
这就要if语句判断或者使用while语句那有什么方法能将此简化呢这就来到第二个方法
2、我们从数组末尾进行移位这就防止了数值覆盖的问题还不需要使用到其余语句的创建
//头插
void SLPushFront(SL* ps, SLDataType x){
//记住SLDataType这里为我们为了方便typedef int SLDataTypeassert(ps);//断言一下防止指针为空SLCheckCapacity(ps);//开辟空间int i ps-size;for (; i 0; i--);//从后往前移位{ps-a[i] ps-a[i - 1];}ps-a[0] x;//此时a[0]就空出来存放xps-size;//不要忘记size需要
}
顺序表的头删(学会思维的变换)(SLPopFront)
对于头删我们需要删除下标为0的值然后将值向前移一位与头插类似只不过此时是从前往后移动;
//头删
void SLPopFront(SL* ps) {assert(ps);assert(ps-size);//存放的值不能为NULL;for (int i 0; i ps-size-1; i) {ps-a[i] ps-a[i 1];}ps-size--;
}
顺序表的尾插(SLPushBack)
当我们学会了头插顺序表的尾插相对我们来说简直轻而易举
尾插我们就要先判断是否还有空余位置就要利用SLCheckCapacity(SL* ps)是否需要扩容 此时ps-size的位置如图所示我们就可以直接将x的值赋给当前位置然后ps-size;
//尾插
void SLPushBack(SL* ps, SLDataType x) {assert(ps);void SLCheckCapacity(SL * ps);ps-a[ps-size] x;//相当于ps-a[ps-size] x;//ps-size
}
有尾插就有尾删
思考一下尾删我们将ps-size-1的位置删除将其置为NULL,ps-size--,就完成了尾删;
那我们换一个思路我们只将这个位置删除是否可以直接ps-size--呢因为当我们打印的时候只需打印[0,size)之间的数size这个位置需要打印吗当然不用啦如果我们需要尾插的时候呢我们可以直接将此位置覆盖掉
//尾删
void SLPopBack(SL* ps) {assert(ps);assert(ps-size);//进行尾删必须存在尾删的值ps-size--;
}
既然头与尾部的插入与删除都有那必然少不了指定位置的插入删除
查找目标值
对于查找数组中的值时一般使用遍历查询
//查找
int SLFind(SL* ps, SLDataType x) {assert(ps);for (int i 0; i ps-size; i) {//对数组进行遍历if (ps-a[i] x) {return i;}}return -1;//循环结束没有找到返回-1
}
指定位置插入(SLInsert)
指定位置插入与头插相似需要将指定位置后的值向后移移位在进行插入
//注意这里的pos对应数组下标
//指定位置插入
void SLInsert(SL* ps, int pos, SLDataType x) {assert(ps);assert(pos 0 ps-size pos);//pos必须在含有值之间插入//插入数据空间够不够SLCheckCapacity(ps);//让pos及之后的数据整体往后挪动一位for (int i ps-size; i pos; i--){ps-a[i] ps-a[i - 1];//a[pos1] a[pos]与头插具有相似之处导致值的覆盖}ps-a[pos] x;//这里的pos对应数组下标如果不对应则按情况-ps-size;
}
指定位置删除(SLErase)
//删除指定位置的数据
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos 0 pos ps-size);//与头删类似for (int i pos; i ps-size - 1; i){ps-a[i] ps-a[i 1];}ps-size--;
}
打印(顺序表的结尾之声)
这里我们要注意结构体访问成员的方式 ( . ) ( - )
C语言结构体—自定义类型—struct-CSDN博客
void SLPrint(SL s)//对于打印数组这里不再需要传地址而是传值
{for (int i 0; i s.size; i){//对于结构体的使用 .与-的不同printf(%d , s.a[i]);}printf(\n);
}
以上我们完成了顺序表的实现下一节我们将实现(通讯录)顺序表 看到这里就点个赞走吧