C C 學習筆記 04 傳統鍊錶

2021-10-06 17:32:47 字數 2478 閱讀 8389

在任何乙個工程中專案中,都免不了要對資料進行有組織的運算,這些組織方式,最終的目的是要讓我們處理資料更加高效。

不同的資料組織方式,會有不同的特性,這些特性對於某些運算還說是非常關鍵的,但也可能是毫不敏感的。

因此我們的任務就是使用恰當的資料組織方式(即資料結構)來處理對某方面運算敏感的資料,讓程式整體效能最大化。

鍊錶就是一種最普遍的資料組織方式,它不需要連續 的大片記憶體也可以儲存大量的資料,而且對於資料的插入和刪除運算響應速度也夠快,但查詢效能一般。(「高大上」:紅黑樹–>演算法中的貴族:雜湊演算法)

鍊錶:是最普遍的資料組織方式,鍊錶的全稱是「鏈式儲存的線性表」,換句話說,鍊錶就是將線性相關的資料用鏈式儲存的方式串起來的一種資料結構。

(1、線性關係:數學意義上來講,資料有三種關係,集合、線性關係、非線性關係。而集合意思就是資料之間「沒有關係」,而所謂的線性關係就是一對一,非線性關係就是一對多。2、鏈式儲存:不管是線性還是非線性,指的都是這對資料的內在邏輯關係,不管我們怎麼處置它們,它們都不以人的意志所轉移的。我們能做的就是:如何在記憶體中選擇合適的方式存放它們。這裡就有兩種方式:a、順序儲存,b、鏈式儲存。怎麼理解呢?把順序儲存理解為用磚頭水泥砌的一排牆,這樣一來,想要在中間插入或者刪除就i顯得很吃力了,需要移動一大片的磚頭(記憶體),而這時鏈式儲存就相當輕鬆了,我們不把磚頭乙個個用水泥砌上去,而是將它們分開存放,用指標把它們連線起來,使他們邏輯上保持連貫,因為鍊錶中的節點是離散分部的,所以在設計鍊錶節點的時候至少預留乙個可以儲存其他位址的指標針(即鍊錶的節點有資料域也至少還要有乙個位址域);綜上所述:鍊錶的優點①不需要一塊連續的記憶體②插入刪除效率高③節點擴充套件容易。

傳統的鍊錶有:單向鍊錶、單向迴圈鍊錶、雙向鍊錶、雙向迴圈鍊錶;

下面詳細詳細來介紹單向鍊錶的使用。一般對鍊錶的使用無非就是初始化空鍊錶、建立新節點、插入節點、刪除節點、移動節點、查詢節點、遍歷節點。

1、設計節點

假設我們要處理的設計型別為datatype,我們只需要在節點中增加乙個指向本節點的指標即可。

typedef

struct node

listnode,

*singly_list;

2、初始化空鍊錶

第一種空鍊錶直接了當,使用乙個指向的空(null)的指標head即可。第二種使用乙個指向頭節點的指標。這個所謂的節點是不帶有效資料的節點,在鍊錶中插入節點是時候就不需要關注頭指標head是否為空,換句話說使用第一種純粹的空煉表在插入節點的時候我們需要判斷當時的頭指標是否為空。一般,都是建立帶頭指標的空鍊錶。

bool is_empty

(singly_list list)

//判斷鍊錶list是否為空

singly_list init_list

(void

)return mylist;

}

3、插入節點

鍊錶的最大優點就是插入刪除方便,快速。對單鏈表而言就是修改兩個指標。假設要將乙個250插入到200後面,指標new和p分別指向250和200,假設函式insert()接受new和p兩個引數,實現將new插到p的後面

void

insert

(singly_list p, singly_list new)

4、刪除節點

對乙個鍊錶而言,由於單鏈表沒有指向前驅節點的指標,所以,刪除乙個節點時,需要另乙個指標p輔助才行。(200§–>250(delete)–>300)

bool remove_node

(singly_list mylist,singly_list delete)

if(p ==

null

)return false;

p->next = delete->next;

//②將節點200的下乙個節點指向300

delete->next =

null

;//③將250的指標置空

return ture;

}

5、移動節點

將乙個節點從乙個地方移動到另外乙個地方,其實這是兩個操作:先將該節點從原來的位置刪除,然後將該節點插入到新的位置(想把data(p)移動到achor節點的後面)

由於之前對插入和刪除都做了封裝,那麼移動和刪除的操作如下

void

move_node

(singly_list mylist, singly_list p; singly_list achor)

6、查詢節點

由於乙個指定的節點資料找到這個節點指標,也是常用的基本操作;思路:用乙個指標p沿著煉表頭一直向下找,找到為止(或者找不到)

singly_list find_node

(singly_list mylist, datatype data)

return p;

}

C C 學習筆記 C提高 鍊錶

陣列和鍊錶的區別 陣列 一次性分配一塊連續的儲存區域。優點 隨機訪問元素效率高 缺點 1 需要分配一塊連續的儲存區域 很大區域,有可能分配失敗 2 刪除和插入某個元素效率低 鍊錶 無需一次性分配一塊連續的儲存區域,只需分配n塊節點儲存區域,通過指標建立關係。優點 1 不需要一塊連續的儲存區域 2 刪...

鍊錶 04 迴圈鍊錶

迴圈鍊錶 template class circlelist template class circlelistiterator 節點類circlelistnode template class circlelistnode 預設的建構函式 迴圈鍊錶類circlelist template clas...

鍊錶操作(04)

輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個arraylist 方法一 使用棧來作為中間儲存結構 struct listnode class solution while v.empty return arraylist 方法二 遞迴呼叫 struct listnode class solution ...