程式猿必修課之資料結構(三)線性表1

2021-08-23 12:13:36 字數 2477 閱讀 8140

線性表(list):零個或多個資料元素的有限序列。

首先它是乙個序列。也就是說,元素之間是有順序的,若存在多個元素,則第乙個元素無前驅,最後乙個元素無後繼,其他每個元素都有且只有乙個前驅和後繼。

其次,線性表強調是有限的。

線性表元素的個數 n (n >= 0) 定義為線性表的長度,當 n = 0 時,稱為空表。

adt 線性表(list)

data

線性表的資料物件集合為,每個元素的型別均為datatype。其中,除第乙個元素 a1 外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素 an 外,每乙個元素有且只有乙個直接後繼元素。資料元素之間的關係是一對一的關係。

operation

initlist (*l):初始化操作,建立乙個空的線性表 l。

listempty (l):若線性表為空,返回 true,否則返回 false。

clearlist (*l):將線性表清空。

getelem(l, i, *e):將線性表 l 中的第 i 個位置元素值返回給 e。

listdelete (*l, i, *e) ):刪除線性表 l 中第 i 個位置元素,並用 e 返回其值。

listlength (l) :返回線性表 l 的元素個數。

endadt

線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。

線性表的順序儲存結構,是在記憶體中開闢一塊連續的區域,然後把相同資料型別的資料元素依次存放在這塊記憶體中。

線性表的順序儲存結構**

# define maxsize 20

typedef int elemtype; /* elemtype 型別根據實際情況而定,這裡假設為 int */

typedef struct sqlist;

順序儲存結構需要的三個屬性:

陣列的長度是存放線性表的儲存空間的長度,儲存分配後這個量一般是不變的。

線性表的長度是線性表中資料元素的個數,隨著線性表插入和刪除操作的進行,這個量是變化的。

在任意時刻,線性表的長度應該小於等於陣列的長度。

儲存器中的每個儲存單元都有自己的編號,這個編號稱為位址。

由於每個資料元素,不管它是整型、實型還是字元型,它都是需要占用一定的儲存單元空間的。假設占用的是 c 個儲存單元,那麼線性表中第 i + 1 個資料元素的儲存位置和第 i 個資料元素的儲存位置滿足下列關係 (loc 表示獲取儲存位置的函式)。

loc(a(i+1)) = loc(a(i)) + c
所以對於第 i 個資料元素 a(i) 在儲存位置可以由 a(1) 推算得出:

loc(a(i)) = loc(a(1)) + (i - 1) * c
通過這個公式,我們可以發現,計算線性表中任意位置的位址所用的時間是相同的。那麼我們對每個線性表位置的存入或者取出資料,對於計算機來說都是相等的時間,也就是乙個常數,因此用時間複雜度的概念來說,它的訪問時間效能為 o(1)。我們把具有這一效能的儲存結構稱為隨機訪問結構。

順序儲存結構的操作主要包括:資料查詢、插入、刪除等。

查詢的實現方法非常簡單,只要將線性表中的第 i 個位置元素返回就可以了。

**實現如下:

elemtype getelem (sqlist l, int i) ;
插入演算法的思路:

**實現如下:

bool listinsert (sqlist *l, int i, elemtype e) 

/* 將新元素插入 */

l->data[i - 1] = e;

l->length++;

return true;

};

刪除演算法的思路:

**實現如下:

bool listdelete (sqlist *l, int i, elemtype *e) 

l->length--;

return true;

}

下面我們分析一下插入和刪除操作的時間複雜度

如果元素要插入到最後乙個位置,或者要刪除最後乙個元素,此時時間複雜度為 o(1),這是最好的情況。

如果元素要插入到第 1 個位置或者刪除第 1 個元素,此時時間複雜度為 o(n)。

平均情況,由於每個位置插入或者刪除的可能性是相同的,所以平均移動次數和最中間的那個元素的移動次數是相等的,為 (n -1) / 2,經推導,可以得出複雜度為 o(n)。

線性表的順序儲存結構,在儲存和讀取資料時,不管是哪個位置,時間複雜度都是 o(1);而插入或刪除時,時間複雜度都是 o(n)。這說明,線性表比較適合元素個數變化小的情況,適合資料的儲存與讀取,不適合頻繁插入刪除操作。

優點:缺點:

程式猿必修課之資料結構(五)線性表3

原文 對於單鏈表,由於每個結點只儲存了向後的指標,到了鍊錶末尾就停止了向後鏈的操作,這樣,結點就無法找到它的前驅結點了。將單鏈表中終端結點的指標域由空指標改為指向頭結點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。迴圈鍊錶和單鏈表的主要差異就在於迴圈的判斷條件上,原來...

程式猿必修課之資料結構(五)線性表3

對於單鏈表,由於每個結點只儲存了向後的指標,到了鍊錶末尾就停止了向後鏈的操作,這樣,結點就無法找到它的前驅結點了。將單鏈表中終端結點的指標域由空指標改為指向頭結點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。迴圈鍊錶和單鏈表的主要差異就在於迴圈的判斷條件上,原來是判斷...

程式猿必修課之資料結構(十)樹1

樹是一對多的資料結構 樹 tree 是 n n 0 個結點的有限集。n 0 時,稱為空樹。在任意一棵非空樹中 其實樹的定義用到了遞迴的方法。樹的每乙個結點包含乙個資料元素和若干個指向其子樹的分支。結點的度 結點擁有的子樹的個數稱為結點的度 degree 度為 0 的結點稱為葉結點 leaf 或終端結...