大話資料結構與演算法-程杰
第三章 線性表
線性表的定義
零個或多個資料元素的有限序列。
這裡需要強調幾個關鍵的地方:
首先該線性表一定是有序的,若元素有多個,則第乙個元素無前驅,最後乙個元素無後繼,其他元素都有且只有乙個前驅和後繼;
線性表的順序儲存結構
順序儲存結構的定義
線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。
順序儲存方式
線性表的順序儲存結構,說白了,就是在記憶體中找了塊地兒,通過佔位的形式,把一塊記憶體給佔了,然後把相同資料型別的資料元素依次存放在這塊空地上。既然線性表的每個資料元素的型別都相同,所以可以通過一維陣列來實現順序儲存結構,即把第乙個資料元素存到陣列下標為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年 相當於我們中國的唐朝時期 所寫的 印度數字算術 中。如今普遍認可的對演算法的定義是 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示...