一.抽象資料型別
抽象資料型別(abstract data type,adt)是一些操作的集合。抽象資料型別是數學的抽象,在adt定義中根本沒涉及如何實現這些操作。
例如:表、集合、圖及它們的操作,它們都可以看作抽象資料型別,就像整數、實數和布林量是資料型別一樣。整數、實數以及布林量有與它們相關的操作。對於集合adt,我們可以有並、交、求大小(size)以及取餘等操作。或者,我們也可以只要兩種操作——並和查詢(find),這兩種操作在該集合上定義了一種不同的adt。
二.表
處理形如a1,a2,a3……an的普通表。這個表的大小是n。我們稱大小為0的表為空表(empty list)。
以 i 定義表中元素的位置,表中第乙個元素是a1,最後乙個元素是an,將不定義a1的前驅元和an的後繼元。
與這些定義相關的是我們要在表adt上進行操作的集合。printlist和makempty是常用操作。find返回關鍵字首先出現的位置;insert和delete一般是從表的某個位置插入和刪除某個關鍵字;而findkth則返回某個位置上(作為引數指定)的元素。如果34,12,52,16,12是乙個表,則find(52)會返回3;insert(x,3)可能把錶變成34,12,52,x,16(如果在給定位置的後面插入的話);而delete(52)則將該錶變為34,12,x,16,12。
表的簡單陣列實現: 陣列實現需要對表達到大小最大值進行估計,這會浪費大量空間。插入乙個新的元素需要將後面整個陣列後移乙個位置一空出空間來,而刪除乙個元素則需要將表中的後面整個元素前移乙個位置。這兩種操作最壞的情況為o(n),所以也浪費執行時間。
鍊錶: 可以不連續儲存元素。鍊錶由一系列不必在記憶體中相連的結構組成。每乙個結構均含有表元素和指向包含該元素後繼元的結構的指標。稱之為next指標。最後乙個單元的next指向null; 為了執行printlist(l)或find(l,key),只要將乙個指標傳遞到該錶的第乙個元素,然後用一些next指標遍歷該錶。
一些細節問題:第一,並不存在從所給定義出發在表的起點端插入元素的真正顯性的方法。第二,從表的起始端實行刪除是乙個特殊情況,因為他改變了表的起始端,程式設計中的疏忽將會造成表的丟失。第三個問題涉及一般的刪除。雖然指標的移動很簡單,但是刪除演算法要求記住刪除元素前面的表元。上面三個問題通過留出乙個標誌節點即表頭(header)來解決。
三.線性表的定義與操作-順序表
typedef
int position;
typedef
struct lnode *list;
struct lnode
;/* 初始化 */
list makeempty()
/* 查詢 */
#define error -1
position find
( list l, elementtype x )
/* 插入 */
bool insert
( list l, elementtype x, position p )
if( p<
0|| p>l->last+1)
for( i=l->last; i>=p; i--
) l->data[i+1]
= l->data[i]
;/* 將位置p及以後的元素順序向後移動 */
l->data[p]
= x;
/* 新元素插入 */
l->last++
;/* last仍指向最後元素 */
return true;
}/* 刪除 */
bool delete
( list l, position p )
for( i=p+
1; i<=l->last; i++
) l->data[i-1]
= l->data[i]
;/* 將位置p+1及以後的元素順序向前移動 */
l->last--
;/* last仍指向最後元素 */
return true;
}
四.線性表的定義與操作-鍊錶
typedef
struct lnode *ptrtolnode;
struct lnode
;typedef ptrtolnode position;
typedef ptrtolnode list;
/* 查詢 */
#define error null
position find
( list l, elementtype x )
/* 帶頭結點的插入 */
bool insert
( list l, elementtype x, position p )
else
}/* 帶頭結點的刪除 */
bool delete
( list l, position p )
else
}
資料結構(二十一)
現在哈利 波特的手裡有一本教材,裡面列出了所有的變形魔咒和能變的動物。老師允許他自己帶乙隻動物去考場,要考察他把這只動物變成任意乙隻指定動物的本事。於是他來問你 帶什麼動物去可以讓最難變的那種動物 即該動物變為哈利 波特自己帶去的動物所需要的魔咒最長 需要的魔咒最短?例如 如果只有貓 鼠 魚,則顯然...
資料結構與演算法(二十一)
插入排序回顧 插入排序演算法 definsertsort alist for index in range 1 len alist currentvalue alist index position index while position 0and alist position 1 current...
資料結構學習筆記一 資料結構基礎
做個決定,從今天開始,每天一題,把自己每天學的東西寫出來,也算是個學習筆記。駑馬十駕,功在不捨 何謂資料結構?資料結構反映資料的內部構成,即乙個資料由哪些成分資料組成,以什麼樣的形式組成,呈現什麼樣的結構。資料結構包括邏輯上的資料結構和物理上的資料結構。邏輯上的資料結構指的是成分資料之間的邏輯關係,...