線性表有兩種物理儲存結構:順序儲存結構和鏈式儲存結構
順序儲存結構指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。(陣列)
如:(a1,a2,......,an)
物理上的儲存方式事實上就是在記憶體中找個初始位址,然後通過佔位的形式,把一定的記憶體空間給佔了,然後把相同資料型別的資料元素依次放到這塊空地種。
1.儲存空間的起始位置,陣列data,它的儲存位置就是線性表儲存空間的儲存位置。
2.線性表的最大儲存空間容量:陣列的長度maxsize。
3.線性表的當前長度:length。
4.陣列的長度與線性表的當前長度的區別:
陣列的長度:其為存放線性表的儲存空間的總長度,一般初始化後不變。(例外:動態擴容陣列)
線性表的當前長度:線性表中元素的個數,是會變化的。
線性表是從1開始。而線性表元素對應下標是從0開始的。
所以隊醫第n個資料元素an的儲存位置可以由a1推算得出:loc(an) = loc(a1) + (i-1)*c (可理解為:n = 1 + (n-1))
(loc:表示獲得儲存位置的函式;c:表示有c個儲存單元(位元組))
作用:通過這個公式,我們可以隨時計算出線性表中任意位置的位址,不管它是第乙個還是最後乙個,都是相同的時間。那麼它的儲存時間效能當然就為0(1),我們通常稱為隨機儲存結構。
線性表l中的第n個位置元素值返回。就程式而言非常簡單了,我們值需要把陣列第n-1下表的值返回即可。(即第1個元素的下標為0,所以第n個元素的下標為n-1)
public bool getelem(listl,int i,ref t j)
j = l[i - 1];
return true;
}
思路:1.如果插入位置不合理,丟擲異常(這裡用false表示)。
2.如果線性表長度大於或等於陣列長度,則丟擲異常或動態增加陣列容量;
3.從最後乙個元素開始向前遍歷到第i個位置,分別將他們都向後移動乙個位置;
4.將要插入元素填入位置i處;
public bool listinsert(ref tl, int i, t j)
if (i <= l.length)
}l[i - 1] = j; //指定位置插入指定資料
return true;
}
思路:1.如果刪除位置不合理,丟擲異常;
2.去除刪除元素;
3.從刪除元素位置開始遍歷到最後乙個元素位置,分別將他們都向前移動乙個位置;
4.表長-1;
public bool listdelete(ref t l, int i)
if (i <= l.length)
for (k = 0;k < array.length;k++)
l = array; //減少容量
}return true;
}
插入和刪除的時間複雜度:
插入和刪除操作剛好要求在最後乙個位置操作,因為不需要移動任何元素,所以此時的時間複雜度為o(1).
如果要插入和刪除的位置是第乙個元素,那就意味著要移動所有的元素向後或者向前,所以這個時間複雜度為o(n)
所以綜上所述:
1.線性表的順序儲存結構在存,讀資料時,不管時哪個位置,時間複雜度都是o(1);而在插入或刪除時。時間複雜度都是o(n)。
2.這就說明,他比較適合元素個數比較穩定,不經常插入和刪除元素,而更多的操作時訪問資料的應用。
1.無須為表示表中元素之間的邏輯關係而增加額外的儲存空間。
2.可以快速的訪問表中任意位置的元素。
1.插入和刪除菜哦做需要移動大量元素。
2.當線性表長度變化較大時,難以確定儲存空間的容量
3.容易造成儲存空間的「碎片」;
線性表線性(順序)儲存結構
實現順序表的曾刪查操作 元素結構體 define maxsize 100 線性表的最大長度 typedef int elemtype elemtype為線性表元素的型別 typedef struct sequenlist 插入操作 bool insertinseqlist sequenlist l,...
線性表 線性表的順序儲存結構
線性表的順序儲存結構 線性結構是乙個資料元素的有序 次序 集。集合中必存在唯一的乙個 第一元素 集合中必存在唯一的乙個 最後元素 除最後元素外,均有唯一的後繼 除第一元素外,均有唯一的前驅。adt list 資料關係 r1 adt list 容易混的概念 引用符號 和引用型操作沒有關係 加工型操作 ...
線性表 線性表的順序儲存結構
include include using namespace std define ok 1 define error 0 define list init size 100 define listincrement 10 typedef int status typedef int elemty...