头删:
- void SLPopFront(SL* psl)
- {
- assert(psl);//遇到错误直接报错
- int begin = 0;
- while (begin < psl->size - 1)
- {
- psl->a[begin] == psl->a[begin + 1];
- begin++;
- }
- }
这种方法基本用不到,一般是采用尾删,头删没采用一次就要挪动n个数据,浪费资源。
尾删:
- void SLPopBack(SL* psl)
- {
- assert(psl);
- if (psl->size == 0)
- return;
- psl->size--;
- }
实质上是“增删查改”的增,之所以要弄头增头减是因为那两个经常会用到,单独列出来了。
- void SLInsert(SL* psl, size_t pos, SLDataType x)
- {
- assert(psl);
- assert(pos > psl->size);
- SLCheckCapacity(psl);
- size_t end=psl->size-1;
- while (end > pos)
- {
- psl->a[end] = psl->a[end - 1];
- end--;
- }
- psl->a[pos] = x;
- psl->size++;
- };
这里破损用到的是size_t类型,这是一个无符号整数类型,在以后的库的学习中用的还是这个,因此我们现在就应该适应。
有一些要注意的点,不可 用下面的代码实现这一功能:
- int end=psl->size;
- while (end >= pos)
- {
- psl->a[end+1] = psl->a[end];
- end--;
- }
这样当pos=0时会导致死循环,原因如下:
end被整型提升为无符号整数,当end为-1的时候在运算的时候会直接提取内存中的:
“11111111111111111111111111111111”一个极大的正数
如下:
- int SLFind(SL* psl, SLDataType x)
- {
- assert(psl);
- for (int i = 0; i < psl->size; i++)
- {
- if (psl->a[i] == x)
- {
- return i;
- }
- }
- return -1;
- }
- void SLErase(SL* psl, size_t pos)
- {
- assert(psl);
- assert(pos > psl->size - 1);
- size_t begin = pos + 1;
- while (begin <= psl->size - 1)
- {
- psl -> a[begin - 1] = psl->a[begin];
- begin++;
- }
- psl->size--;
- }
五、顺序表的改
- void SLModify(SL* psl, size_t pos, SLDataType x)
- {
- assert(psl);
- assert(pos < psl->size);
-
- psl->a[pos] = x;
- }