大話資料結構與演算法 三

2021-09-09 08:54:05 字數 3455 閱讀 8022

大話資料結構與演算法-程杰

第三章 線性表

線性表的定義

零個或多個資料元素的有限序列。

這裡需要強調幾個關鍵的地方:

首先該線性表一定是有序的,若元素有多個,則第乙個元素無前驅,最後乙個元素無後繼,其他元素都有且只有乙個前驅和後繼;

線性表的順序儲存結構

順序儲存結構的定義

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

順序儲存方式

線性表的順序儲存結構,說白了,就是在記憶體中找了塊地兒,通過佔位的形式,把一塊記憶體給佔了,然後把相同資料型別的資料元素依次存放在這塊空地上。既然線性表的每個資料元素的型別都相同,所以可以通過一維陣列來實現順序儲存結構,即把第乙個資料元素存到陣列下標為0的位置中,接著把線性表相鄰的元素儲存在陣列中相鄰的位置。

在建立順序表時,除了預先申請記憶體空間,還需要實時記錄順序表的長度和順序表本身申請的記憶體大小,便於後期對順序表中的資料元素進行調取。所以,順序儲存的結構**為:

#define maxsize 20	 // 儲存空間出事分配量

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

typedef struct

sqlist;

這裡,我們發現描述順序儲存結構需要的三個屬性:

<1> 儲存空間的起始位置:資料data,它的儲存位置就是儲存空間的儲存位置;

<2> 線性表的最大儲存容量:陣列長度maxsize;

<3> 線性表的當前長度:length

3. 資料長度與線性表長度區別

陣列的長度是存放線性表的儲存空間的長度,儲存分配後這個量一般是不變的。有個別人可能會問,陣列的大小一定不可以變嗎?我怎麼看有些書中談到可以動態分配的一維陣列。是的,一般高階語言,比如c、c++、vb都可以用程式設計手段實現分配陣列,不過會帶來效能上的損耗。

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

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

4. 順序儲存結構的基本操作

adt 線性表(list)

data

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

operation

int initlist (sqlist *l);	/** 初始化乙個順序表 **/

bool listempty (l); /** 若線性表為空,返回true,否則返回false **/

int printlist (sqlist l); /** 列印線性表中的每乙個元素 **/

int getlength (sqlist l); /** 返回線性表元素的個數 **/

/** 建立乙個鍊錶長度為length的線性表 **/

int createlist (sqlist *l,int length);

int insertlist (sqlist *l, int pos,elemtype elem);

/** 將線性表中第pos個位置的元素返回,儲存在*e中 **/

int getelem (sqlist l, int pos, elemtype *e);

如果沒有,返回狀態值0 **/

int locateelem (sqlist l, elemtype e);

/** 從線性表中刪除pos位置處的元素,並將其存放在elem中; **/

int deletelist (sqlist *l, int pos,elemtype *elem);

int clearlist (sqlist l,sqlist *pl); /** 清空順序表 **/

《一》 初始化乙個順序表

int initlist (sqlist *l)

《二》 判斷線性表是否為空

bool listempty (l)

《三》 列印線性表中的每乙個元素

int printlist (sqlist l)

《五》 建立乙個鍊錶長度為length的線性表

int createlist (sqlist *l,int length)

return 1;

}

《六》 指定位置pos處插入乙個新的元素elem

插入演算法思路:

a. 如果插入元素不合理,丟擲異常;

b. 如果線性表長度大於陣列長度,則丟擲異常或動態增加容量;

c. 從最後乙個元素開始遍歷到第i個位置,分別將它們都向後移動乙個位置;

d. 將要插入元素填入第i個位置;

e. 表長度加1。

int insertlist (sqlist *l, int i,elemtype elem)

}

l->data[pos-1] = elem; // 將新元素插入

l->length++;

return 1;

}

《七》 獲取順序表中指定位置處的元素值

int getelem (sqlist l, int pos, elemtype *e)

int locateelem (sqlist l, elemtype e)

}

l->length --;

return 1;

}

《十》 清空乙個順序表,將順序表的length置為0

int clearlist (sqlist l,sqlist *pl)

線性表順序儲存結構的優缺點

順序表是用一段位址連續的儲存單元依次儲存線性表的資料元素。其特點是:記憶體中位址連續,支援隨機查詢,按位查詢演算法的時間複雜度為o(1),按值查詢的平均時間效能是o(n),插入刪除操作的平均時間效能是o(n),適用於需要大量訪問元素,而沒有或少量增添或刪除元素的程式。

順序表的優點為:隨機訪問較快,建立簡單

缺點為:插入和刪除需要移動大量的元素;表的容量難以確定;造成儲存空間的「碎片」等

大話資料結構 (三)棧與佇列

棧的定義 棧是限定僅在表尾進行插入和刪除操作的線性表,是線性表內的乙個小分支。我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 buttom 不含任何資料元素的棧稱為空棧。棧又稱為後進先出的線性表,簡稱lifo結構。在日常生活中,棧的魅力無處不在,比如ctrl z回退快捷鍵,它會馬上返回到...

大話資料結構與演算法 演算法初步1

什麼是演算法呢?演算法是描述解決問題的方法。如今普遍認可的對演算法的定義是 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。對於乙個特定的問題,是可以有多個演算法來解決的。那麼我們就會想,有沒有通用的演算法呀?其實這個問題很弱智,就像問與沒有包治百...

大話資料結構(二) 演算法

什麼是演算法呢?演算法是描述解決問題的方法。演算法 algorithm 這個單詞最早出現在波斯數學家阿勒 花刺子密在公元 825年 相當於我們中國的唐朝時期 所寫的 印度數字算術 中。如今普遍認可的對演算法的定義是 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示...