資料結構 線性表3

2021-09-18 04:56:41 字數 1952 閱讀 2329

每天要學習的太多,今天花大量時間敲完靜態鍊錶的**,發現後面還有迴圈鍊錶,雙向鍊錶,這樣學習效率太低。所以後面不打算把偽碼重新實現一遍,只記錄學習的要點等。

通過物理的線性結構實現邏輯的鏈式儲存,下標由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.已知線性表中...