每天要學習的太多,今天花大量時間敲完靜態鍊錶的**,發現後面還有迴圈鍊錶,雙向鍊錶,這樣學習效率太低。所以後面不打算把偽碼重新實現一遍,只記錄學習的要點等。
通過物理的線性結構實現邏輯的鏈式儲存,下標由0開始,及s[0]為第乙個資料。
typedef
struct
component, staticlinklist[maxsize]
;
靜態鍊錶的實現,最大的問題是區分那些空間是已經使用的還是沒有使用的。
剛開始異想天開,自己這樣實現的:
將游標利用起來,cur=-1代表空間是空閒的,cur>=0代表指向下乙個使用的空間。當malloc時候,就將對應的下標修改為》0的,free時候,就將下標修改為-1,這樣也能實現,但每次都遍歷一遍 時間複雜度為n。
//通過遍歷的方式返回該表中空閒的空間下標
intsearchfree
(staticlinklist l)
return error;
}
其實正確的思路是這樣:
讓陣列的第乙個元素cur存放第乙個備用元素(未被占用的元素)下標,而陣列的最後乙個元素cur存放第乙個有值的元素下標,相當於頭結點作用。每當進行插入時候便返回備用鍊錶的第乙個節點,進行刪除時候便將刪除的節點連線到備用鍊錶的第乙個節點。
//從備用鍊錶獲得乙個空閒空間下標
intmalloc_ssl
(staticlinklist space)
/* 將下標為k的空閒結點**到備用鍊錶 */
void
free_ssl
(staticlinklist space,
int k)
刪除乙個元素,先迴圈到當前的i位置,將i-1游標指向i+1游標,並將i新增到備用鍊錶
/* 刪除在l中第i個資料元素 */
status listdelete
(staticlinklist l,
int i)
增加同理
/* 在l中第i個元素之前插入新的資料元素e */
status listinsert
(staticlinklist l,
int i, elemtype e)
return error;
}
表中的最後乙個節點指標指向指向頭節點,整個鍊錶形成乙個環
與線性鍊錶差別在:判斷是否迴圈完成的條件,由p->next是否為空變為是否等於頭指標。
雙向鍊錶為空:p->next=p->prior等於頭指標
先填充待插入元素的前驅和後繼,再由後到前釋放原指標
雙向鍊錶滿足:
p->next->prior=p->prior->next
資料結構3 線性表
設計演算法,將兩個安置遞增有序的單鏈表合併成乙個安置遞增有序的單鏈表。void listmerge linklist la,linklist lb,linklist lc else if la lc next la if lb lc next lb 設l為一帶有頭結點的迴圈單鏈表,鍊錶中儲存一組無序...
大話資料結構 線性表 3
順序儲存結構的建立,其實就是乙個陣列的初始化,即宣告乙個型別和大小的陣列並賦值的過程。而單鏈表和順序儲存結構就不一樣,他不像順序儲存結構那麼集中,他可以很分散,是一種動態結構。對於每個鍊錶來說,它所占用空間的大小和位置是不需要預先分配劃定的,可以根據系統的情況和實際的需求即時生成。所以,建立單鏈表的...
資料結構(線性表)
1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...