for (int i = this.usedSize-1; i >= pos ; i--) { this.elem[i+1] = this.elem[i]; }this.elem[pos] = data; this.usedSize++;那当i=this.usedSizw-1时,i+1没有越界吗,为啥
时间: 2024-04-05 17:35:53 浏览: 63
当 i = this.usedSize-1 时,i+1 确实会越界,因为数组的下标是从 0 开始的,所以数组的最后一个元素的下标是 this.usedSize-1。如果在循环中访问了 this.elem[i+1],则会导致数组越界异常。
但是,在这段代码中,循环体执行完毕后,程序会执行 this.elem[pos] = data; 这行代码,将 data 插入到 pos 位置上,这时候 pos 的值是 this.usedSize,因此 this.elem[pos] 实际上是访问到了顺序表的一个空闲位置,不会导致越界访问。同时,这里还有一行代码 this.usedSize++; 用于将顺序表的长度加 1,表示插入了一个新的元素。
因此,在这段代码中,虽然 i+1 确实会越界,但是这个越界访问并不会导致程序出错,因为这个位置是顺序表的一个空闲位置,能够存储新的元素。
相关问题
for (int i = this.usedSize-1; i >= pos ; i--) { this.elem[i+1] = this.elem[i]; } //2.插入数据 this.elem[pos] = data; //3. usedSize++ this.usedSize+ 为什么此处eleme没越界
根据代码片段中的循环语句,可以看出在插入数据之前,数组元素从pos到this.usedSize-1已经向右移动了一位,也就是说,pos位置原来的元素已经被移动到了pos+1的位置,因此在执行this.elem[pos] = data时,pos位置上原来的元素已经被正确地移动到了pos+1的位置,没有越界。同时,由于在插入数据之前,数组中已经有this.usedSize个元素,因此在插入数据之后,数组的元素数量将会增加1,不会越界。
int ListInsert(SqList &L, int i, ElemType e) { if(L.length < 1 || i > L.length+1 || L.length+1 > MAXSIZE) return 0; for(int j = L.length+1; j >= i; j--) { L.elem[j] = L.elem[j-1]; } L.elem[i-1] = e; L.length++; return 1; }
这段代码是用来实现顺序表中插入元素的功能的。其中SqList是一个结构体类型,包含了顺序表的元素数组L.elem和顺序表的长度L.length,MAXSIZE是顺序表中元素的最大数量。如果顺序表的长度为0或者插入位置i超出了顺序表的范围,或者插入后顺序表长度超过了最大值,则返回0表示插入失败。否则,从顺序表的末尾开始往前遍历到插入位置i,将插入位置及其之后的元素全部后移一位,然后在插入位置处插入元素e,最后将顺序表的长度加1,返回1表示插入成功。
阅读全文