这个与顺序插入很相似,只不过多了一个条件:在指定位置插入,那怎么解决这个问题?
你不能直接接访问这个位置然后修改这个位置元素的值,这是修改,不是插入。
由于顺序表的“指针”是指向最后一个元素的后一个空间,
所以我们需要先将指定位置的数据以及后面的数据先全部往后移动一个位置,
然后再将指定位置的值改为目标数据。
// 在 pos 位置新增元素
public void add(int pos, int data) {
if (this.elem == null) {
this.initSeqList();
}
if (pos < 0 || pos > this.size) {
System.out.println("插入位置非法!");
return;
}
if (isFull()) {
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
for (int i = size - 1; i >= pos; i--) { //总之pos是坐标,所以i=size-1也要是坐标,这样才能处理;8个数据,坐标0-7
this.elem[i+1] = this.elem[i];
}
this.elem[pos] = data;
this.size++;
}
//这个代码也不错
| //在i=L.length的情况下,i-1 = pos
//pos=0即i=1时是头插,pos=ps->size即i=size+1时是尾插
//所以i = 1时是头插,i = ps->size+1时是尾插
//先判断插入是否合法(省略)
for(int i=L.length; i>=pos; i—) //
L.data[i] = L.data[i-1]; //不会出现i=0的情况,i=1时即是头插,所以i不会出现=0的情况的,这样写貌似好理解些
L.data[i-1] = e; //e为插入元素
L.length++; //线性表长度加1```c
//通常传入的i都是元素个数位置 i = pos + 1 = size = length
typedef pos = size -1;
//size=0时没有元素何谈插入,
//size=1时,pos=0即是头插
for(int i = pos; i >= end; i—)
L.data[pos+1] = l.data[pos];
L.data[pos] = e
L.length++;
for(int i = length, i >= pos, i—)
L.data[i] = L.data[i-1];
L.data[i-1] = e;
L.length++;
```
|
| —- |
以上代码仅是理解探索过程,并不优良,反而带
来一些理解上的阻碍,以下代码才值得记忆
用循环貌似更简单明了
代码短,方法巧,区分度高。
假设需要在顺序表下标为3的位置插入一个数字22。