學習到鍊錶的小夥伴可以看看了

2021-09-25 13:41:35 字數 2800 閱讀 5729

鍊錶的概念鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。相比於線性表順序結構,操作複雜。由於不必須按順序儲存,鍊錶在插入的時候可以達到o(1)的複雜度,比另一種線性表順序表快得多,但是查詢乙個節點或者訪問特定編號的節點則需要o(n)的時間,而線性表和順序表相應的時間複雜度分別是o(logn)和o(1)。使用鍊錶結構可以克服陣列鍊錶需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。但是鍊錶失去了陣列隨機讀取的優點,同時鍊錶由於增加了結點的指標域,空間開銷比較大。鍊錶最明顯的好處就是,常規陣列排列關聯專案的方式可能不同於這些資料專案在記憶體或磁碟上順序,資料的訪問往往要在不同的排列順序中轉換。而鍊錶是一種自我指示資料型別,因為它包含指向另乙個相同型別的資料的指標(鏈結)。鍊錶允許插入和移除表上任意位置上的結點,但是不允許隨機訪問。鍊錶有很多種不同的型別:單向鍊錶,雙向鍊錶以及迴圈鍊錶。

鍊錶的分類 2.1 按儲存結構分類按照儲存結構進行分類可以分為順序儲存結構和鏈式儲存結構,與之對應採用不同儲存結構建立的鍊錶可以稱為靜態鍊錶和動態鍊錶。2.1.1靜態鍊錶靜態鍊錶是用類似於陣列方法實現的,是順序的儲存結構,在實體地址上是連續的,而且需要預先分配位址空間大小。順序儲存結構的主要優點是節省儲存空間,因為分配給資料的儲存單元全用存放結點的資料(不考慮c/c++語言中陣列需指定大小的情況),結點之間的邏輯關係沒有占用額外的儲存空間。採用這種方法時,可實現對結點的隨機訪問,即每乙個結點對應乙個序號,由該序號可以直接計算出來結點的儲存位址。但順序儲存方法的主要缺點是不便於修改,對結點的插入、刪除運算時,可能要移動一系列的結點。所以靜態鍊錶的初始長度一般是固定的,在做插入和刪除操作時需要移動元素,2.1.2動態鍊錶到目前為止,凡是遇到處理「批量」資料時,我們都是利用陣列來儲存。定義陣列必須(顯式的或隱含的)指明元素的個數,從而也就限定了乙個陣列中存放的資料量。在實際應用中,乙個程式在每次執行時要處理的資料的數目通常並不確定。如果陣列定義的小了,就沒有足夠的空間存放資料,定義大了又浪費儲存空間。對於這種情況,如果能在程式執行過程中,根據需要隨時開闢儲存空間,不需要時再隨時釋放,就能比較合理的使用儲存空間。c 語言的動態儲存分配提供了這種可能性。每次動態分配的儲存單元,其位址不一定是連續的,而所需處理的批量資料往往是乙個整體,各資料之間存在著接序關係。鍊錶的每個節點中,除了要有存放資料本身的資料域外,至少還需要有乙個指標域,用它來存放下乙個節點元素的位址,以便通過這些指標把各節點連線起來。由於鍊錶每個儲存單元都由動態儲存分配獲得,故稱這樣的鍊錶為「動態鍊錶」。所以鍊錶的順序表示(陣列結構)優點的是隨機訪問表中的任意元素,但是在做插入或刪除操作時,需移動大量元素。而鍊錶的鏈式表示,在隨機插入元素時沒有順序表示的缺陷,但同時不能對元素進行隨機訪問。 2.2 按鍊錶的實現分類從鍊錶的實現方式可以把鍊錶分為單向鍊錶,迴圈鍊錶,雙向鍊錶。2.2.1單向鍊錶單向鍊錶它包含兩個域,乙個資料域和乙個指標域,鍊錶中的結點的指向只能是前乙個結點指向鍊錶中的下乙個結點,鍊錶中的最後乙個節點為空,元素之間不能相互指向也是一種線性鍊錶。,如圖12.1就是一種單向鍊錶。單向鍊錶也是鍊錶的最基本的結構,是鍊錶的一種,其特點是鍊錶的鏈結方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始;鍊錶是使用指標進行構造的列表;又稱為結點列表,因為鍊錶是由乙個個結點組裝起來的;列表是由結點構成,一般用指標head指向鍊錶的第乙個結點為鍊錶的表頭,而鍊錶的最後乙個結點的指標域賦值為null。2.2.2雙向鍊錶雙向鍊錶即是這樣乙個有序的結點序列,每個鍊錶元素既有指向下乙個結點的指標,又有指向前乙個結點的指標,其中每個結點都有兩種指標,即left和right。left指標指向左邊結點,right指標指向右邊結點。乙個雙向鍊錶分為三大類,第一類就是資料,第二類指標指向前乙個結點的位址,第三類指標指向後乙個結點的位址。雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。一般是在需要大批量的另外儲存資料在鍊錶中的位置的時候用。2.2.

迴圈鍊錶迴圈鍊錶是與單鏈向表一樣,是一種鏈式的儲存結構,所不同的是,單向鍊錶的最後乙個結點的指標域為null,而迴圈鍊錶的最後乙個結點的指標是指向該迴圈鍊錶的第乙個結點或者表頭結點,也就是尾結點的指標域中儲存著鍊錶的第乙個結點的位址,從而構成乙個環形的鏈。對於迴圈鍊錶而言,可以從該鍊錶的任意乙個結點可以一直到鍊錶的頭結點,有利於資料的儲存快取。2.3從鍊錶的結構分類鍊錶從結構上來講一般由三部分組成,分別是頭結點、節點(中間節點)和尾節點(最後乙個節點),頭結點只有指標域沒有資料域,但是在某些情況下在使用鍊錶的時候頭結點有資料域,這種情況下鍊錶就沒有頭結點,所以根據有無頭結點可以將鍊錶分為有頭鍊錶和無頭鍊錶。有頭的浪費空間,但易理解,邊界好處理,不易出錯,**簡單,無頭鍊錶節省空間,難理解,邊界不易處理,**稍複雜。但是只有根據實際情況選用真正的有無頭節點鍊錶,本書中採用的是無頭鍊錶。1.2 動態單向鍊錶的實現 1.2.1 動態鍊錶的說明所謂動態鍊錶,是指在程式執行過程中從無到有地建立起乙個鍊錶,即乙個乙個地開闢結點和輸入各結點資料,並建立起前後相鏈的關係,採用動態申請記憶體的方式申請空間,即使用記憶體管理函式來分配空間,這樣的話,可以做到有需要就申請空間,空間不用就可以釋放掉,並不存在浪費記憶體的問題,真正的實現即用即取,不用就釋放的效果。動態鍊錶是用記憶體申請函式(malloc)動態申請記憶體的,每當使用乙個結點就申請一塊記憶體空間,所以在鍊錶的長度上沒有限制。動態鍊錶因為是動態申請記憶體的,所以每個結點的實體地址不連續,要通過指標來順序訪問,所以對乙個鍊錶而言,其鍊錶的表頭很重要,不能弄丟鍊錶的表頭,否則你的鍊錶很可能就找不回了。動態鍊錶的主要的操作有:1)建立鍊錶2)遍歷鍊錶3)查詢鍊錶中的某乙個結點4)刪除鍊錶中的某乙個結點5)在鍊錶中插入乙個結點

更多交流學習可以私我vx13260562029

我的小夥伴呢

小y和他的小夥伴們到魔窟去探險,然而不幸發生坍塌後小y的小夥伴們掉落到了不同的地點。當然了,小y的小夥伴們都會飛行魔法,可以飛出魔窟,但是魔窟中某些地方安裝了魔法干擾器,若周圍魔法干擾器超過4個便不能使用飛行魔法。魔窟可以看作n n的地圖,當中.表示為空地,表示為魔法干擾器,小y的小夥伴字母a表示。...

git的學習筆記(與小夥伴協作)

git remote origin git remote v 詳細資訊 origin fetch origin。push 第一次開始工作的時候,將遠端倉庫的檔案需要轉殖下來 git clone git github.com nber1994 jty.git 這個是從我的github上轉殖下來,哈哈,...

機智的小夥伴,上幾個笑話

一日記者問韓寒 請問,你母親和郭四娘一起掉進水裡你先救哪乙個?不少人納悶,怎麼提這種問題。韓寒肯定的說 先救四娘 全場譁然,議論紛紛。韓寒看出了大家的疑惑,補充了一句 水深一公尺四 頓時掌聲雷動 韓寒的機智打動了在場的所有人,然後大家起立合唱了一首 白雪公主與七個郭敬明 你如果得了狂犬病,要做的第一...