目录
在顺序表与链表(上),我们讲了什么是线性表、顺序表和链表,以及重点讲了 顺序表的几个接口:顺序表初始化、销毁、头增尾增,头删尾删。
在(下)中,我们讲顺序表的剩余几个接口:查找、固定位置插入、固定位置删除、修改。
查找接口非常简单,只需要遍历顺序表找到对应数据就行了。
代码如下:
- //test.c
- int ret = SeqFind(&s, 3);
- printf("\n%d\n", ret);
- //Seqlist.c
- int SeqFind(SEQ* pq, SeqDateType x)
- {
- assert(pq);
- for (int i = 0; i < pq->size; ++i)
- {
- if (pq->a[i] == x)
- {
- return i;
- }
- }
- return -1;
- }
注意这里返回类型是int,找到了对应数据返回的数据的下标,没找到就return -1;
打印出来观察结果。
与头插尾插不同的是,需要传参给定插入的位置,注意给定的是下标。
其他地方与头插相似,只是要注意挪动数组的起始位置变成了插入位置pos
代码如下:
- /SeqList.c
- void SeqInsert(SEQ* pq, int pos, int x)
- {
- assert(pq);
- assert(pos >= 0 && pos < pq->size - 1);
- SeqCheckFull(pq);
- int end = pq->size - 1;
- while (end >= pos)
- {
- pq->a[end + 1] = pq->a[end];
- end--;
- }
- pq->a[pos] = x;
- pq->size++;
- }
较之插入相对容易,也是一样注意删除位置以及挪动数组起始位置改变就行了。
代码如下:
- void SeqErase(SEQ* pq, int pos)
- {
- assert(pq);
- assert(pos >= 0 && pos < pq->size - 1);
- int begin = pos;
- while (begin < pq->size - 1)
- {
- pq->a[begin] = pq->a[begin + 1];
- begin++;
- }
- pq->size--;
- }
可以发现,固定位置插入、删除较之之前说的头插头删,尾插尾删有更广泛的特点。
可以在头上插入、中间插入,也可以尾部插入,删除也一样,所以上面的头插头删,尾插尾删代码也可以相应的更改为这种普遍的方法,直接调用下面的固定插入、删除函数就行了。
在这里就不赘述了,相信大家自己也很清楚了。
这也是非常容易的,无非就是给个下标,修改对应数据。
代码如下:
- void SeqModify(SEQ* pq, int pos, int x)
- {
- assert(pq);
- assert(pos >= 0 && pos < pq->size - 1);
- pq->a[pos] = x;
- }
链表内容相对较多,放到之后再说吧。祝大家万事顺遂!!