鍊錶順序表
每個元素的訪問
每個節點都需要通過指標找到記憶體然後載入到快取中
記憶體訪問時,不需要多次從記憶體到快取的步驟
頭插,頭刪,中間位置
直接增加或刪除節點
在插入或刪除之前要先對之後的資料進行挪動
尾插,尾刪
需要對空間進行操作
直接對資料進行操作,空間是之前一次性開闢好的
空間操作
每次對乙個節點大小進行操作,不會造成空間浪費
通常一次性開闢好空間,擴容時直接增加兩空間,會造成空間浪費
- 遞迴法,最後乙個節點最先列印
void printlistfromtailtohead_r(listnode* head)
}
因為不知道鍊錶的頭節點,所以不能直接常規刪除(找到要刪除的節點位置直接刪除),將所要刪除的節點a之後乙個節點b資料與a資料交換,然後刪除交換後的b節點。如圖,圖中,要刪除數為3的節點,先將存有資料3、4的節點中的資料進行交換,然後刪除交換後的節點(綠色框中的存有資料3的節點):
和問題3中的一樣,不知道頭節點,不能用常規頭插,將問題中的頭插變為尾插,插入之後與節點a的資料進行交換,就基本完成了無頭單鏈表頭插的要求
約瑟夫環:約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。
解法:用乙個計數器實現約瑟夫計數機制,將鍊錶的尾與頭銜接,依次刪除節點,所剩最後乙個節點時,就是要求的節點
給乙個新的鍊錶的頭(newlist == null):用兩個指標,乙個指向目標鍊錶的頭(mov),另乙個用來儲存 mov 後面乙個節點的位址(sto)。在儲存 sto 之後,將 mov 指向的節點摘出來頭插在新煉表頭前面(newlist),newlist 指向當前頭插後的新鍊錶的頭,依次迴圈上述步驟頭插,直到目標鍊錶 list 被遍歷完。
氣泡排序或快速排序,交換的是節點中的資料。
建立新鍊錶(newlist),比較兩個目標鍊錶的頭節點中的資料,摘出其中較小者(若相等規定取其一)對 newlist 尾插,依次遍歷兩個目標鍊錶,直到其中乙個遍歷完成,將另乙個所剩節點銜接在新鍊錶之後。
快慢指標(fast、slow),fast 每次走兩個節點,slow 每次走乙個節點,在快指標遍歷完的時候,慢指標剛好走了一半。此時,慢指標所指節點為中間節點
快慢指標(fast、slow),fast 與 slow 每次都走乙個節點,但是 fast 比 slow 先走 k 個節點,這樣,快慢指標直接總是隔開 k 個節點,在 fast 遍歷完之後,slow 所指節點為單鏈表倒數第 k 個節點
鍊錶和順序表
順序表一般可以分為 1 靜態順序表 使用定長陣列儲存 2 動態順序表 使用動態開闢的數值儲存 順序表的靜態儲存 define n 100 typedef int sldatatype typedef struct seqlist seqlist 順序表的動態儲存 typedef struct seq...
鍊錶和順序表的區別
都屬於線性表,都是線性結構 順序表 順序儲存 優點 支援隨機訪問 儲存密度高 缺點 大片連續空間分配不方便,改變容量不方便 鍊錶 鏈式儲存 優點 離散的小空間分配方便,改變容量方便 缺點 不可隨機訪問,儲存密度低 創銷 增刪改 查 順序表 順序儲存 需要預分配大片連續空間。若分配空間過小,則之後不方...
c 封裝雙向鍊錶和順序表
null 乙個節點 else 多個節點 void pushfront const datatype data else void popfront else if tail ppre null 乙個節點 else 多個節點 node find const datatype data cur cur ...