1. 程式人生 > >資料結構與演算法分析——第三章 表、棧和佇列1

資料結構與演算法分析——第三章 表、棧和佇列1

3.1 抽象資料型別
抽象資料型別(ADT):一些操作的集合
理解:數學的抽象;模組化設計;沒有實際的資料,只是一種結構,一種對於資料儲存的思想。
3.2 表ADT
定義:空表、後繼、前驅
操作:PrintList、MakeEmpty、Find、FindKth、Insert、Delete(Find是返回關鍵字首次出現的位置,FindKth是返回某個位置上的元素)
3.2.1 表的簡單陣列實現
陣列是動態指定的,但是還是需要對錶的大小的最大值進行估計。通常要估計得大一些,從而會浪費大量的空間。
PrintList:線性時間
Find:線性時間
FindKth:常數時間
插入/刪除:線性時間
3.2.2 連結串列
連結串列由一系列不必在記憶體中相連的結構組成。每一個結構均含有表元素和指向包含該元素後繼元的結構的指標(Next指標)。最後一個單元的Next指標指向NULL。
P -> FieldName
PrintList:線性時間
Find:線性時間
FindKth(L,i):花費O(i)時間以顯性方式穿越連結串列而完成。
刪除:修改一個指標
插入:一次malloc呼叫,兩次指標調整
3.2.3 程式設計細節
可能出現的問題:1)並不存在從所給定義出發在表的前面插入元素的真正顯性的方法。2)從表的前面實行刪除改變了表的起始端,程式設計中的疏忽會造成表的丟失。3)刪除演算法要求我們記住被刪除元素前面的表元。
解決:留出一個標誌結點(表頭)。
3.2.4 常見的錯誤
1)memory access violation或segmentation violation
有指標變數包含了偽地址。
原因:(1)初始化變數失敗(2)指標是NULL,指向是非法的。
2)宣告指向一個結構的指標並不建立該結構,而只是給出足夠的空間容納結構可能會使用的地址。建立尚未宣告過的記錄的唯一方法是使用malloc庫函式。
如果想使用一個指標變數沿著一個錶行進,則沒必要使用malloc。
刪除時free函式釋放空間,需要一個臨時變數