1. 程式人生 > 實用技巧 >資料結構中有關順序表的問題:為何判斷插入位置是否合法時if語句中用length+1,而移動元素的for語句中只用length?

資料結構中有關順序表的問題:為何判斷插入位置是否合法時if語句中用length+1,而移動元素的for語句中只用length?

bool ListInsert(SqList &L,int i, ElemType e){
if(i<||i>L.length+) //判斷i的範圍是否有效
return false;
if(L.length>=MaxSize) //當前儲存空間已滿,不能插入
return false;
for(int j=L.length;j>=i;j--) //將第i個元素及之後的元素後移
L.data[j] = L.data[j-];
L.data[i-] = e;
L.length++;
return true;
}

(有關順序表)

第一個問題回答:

  1.首先明確length的含義?

  ——length表示當前表中擁有元素的個數,也就是順序表的表長

  2.為什麼if語句中用length+1

  ——要判斷當前插入的 i 的位置是否合法,也就是必須存在可以包含 i 這個位置的表長(在確定陣列長度是可以包含的之後,是表長不是陣列長度),在其中很容易理解(因為數數是從1開始,順序表中的也是從 1 開始數數)所以不能輸入 i 小於 1。如果我們不是限定為i>L.length+1 而是限定為i>L.length+2 ,此時我們就會發現(當給表中新增一個新的元素後的表的長度只增加 1 ,而我們規定判別i>L.length+2,就會導致表中在1到i>L.length+2 中出現一個斷空,從而違背了順序表的定義(一組地址連續的儲存單元邏輯上相鄰的兩個元素的物理位置上也相鄰),而如果我們是規定i>L.length時我們就會將最後一個元素丟失。

第二個問題回答:

  在for迴圈中時,此時我們就要考慮陣列下標和位序的關係了。雖然for迴圈中定義 j=L.length,但是它對映到陣列時候對應為數量的L.length+1(注:陣列的開始下標為0)