數據結構與算法 - 線性表

這裏咱們只介紹線性表中 存儲結構不一樣的 順序表鏈表,以及操做受限的 隊列算法

數據結構與算法系列文章 數據結構與算法 - 時間複雜度 數據結構與算法 - 線性表數組

目錄

1、 概述 2、順序表   2.一、 插入元素   2.二、 刪除元素   2.三、 特色 3、鏈表   3.一、線性鏈表(單鏈表)      3.1.一、插入元素      3.1.二、刪除元素   3.二、循環鏈表(單向)   3.三、雙向鏈表   3.四、雙向循環鏈表   3.五、鏈表的特色 4、   4.一、順序棧   4.二、鏈棧 5、隊列   5.一、順序隊列   5.二、鏈隊列網絡

1、概述

        線性表 是具備線性結構特色、最簡單且最經常使用的一種數據結構。         線性表 ( Linear List) 是具備相同特性的數據元素組成的一個有限序列。其元素能夠是整數、字符等簡單數據,也能夠是由多個數據項組成的複合形式,甚至能夠是一頁書或其餘更復雜的信息。         例如,由26個大寫英文字母組成的字母表(A,B,C,…,x,Y,Z)就是一個線性表,表中的每一個數據元素均是一個大寫字母。再如,某高校1990年以來擁有的副教授以上職稱的教師個數(48,64,77,93,112,136,167,…,235)也是一個線性表,表中的每一個數據元素均是一個正整數。這兩個線性表都是包含簡單數據元素的例子。         線性表 中的數據元素能夠是多種形式的,可是,對於同一個線性表,其數據元素必須具備同一種形式,也就是說,同一線性表中的數據元素必須同屬一個數據對象集合,表中相鄰的數據元素之間存在某種序偶關係。數據結構

線性結構 特色: 在數據元素的非空有限集合中,存在惟一的一個稱爲「第一個」的數據元素(頭結點);存在惟一的一個「最後一個」的數據元素(末結點)除第一個外,集合中的每一個數據元素都只有一個直接前驅;除最後一個外,集合中的每一個數據元素都只有一個直接後繼。設計

2、順序表

        順序表 是指用一組地址連續的存儲單元依次存儲線性表中的數據元素的線性表 。         由於這種方式與高級程序設計語言中一維數組的表示和實現相一致,因此也稱爲數組表示法。採用順序表表示的線性表,表中邏輯位置相鄰的數據元素將存放到存儲器中物理地址相鄰的存儲單元之中,表中元素的邏輯關係與存儲順序(物理關係)相符,換言之,順序表中數據元素的邏輯關係是以其在存儲結構中的物理(位置)關係來表示的。         所以,在順序表中,能夠根據順序表中數據元素的位序,隨機訪問表中的任一元素,即順序表是一種隨機存取的存儲結構。3d

  • 2.一、 順序表的插入

        順序表的插入是指在順序表的第i-1個元素和第i個元素之間插入一個新的元素,此時順序表中插入位置先後元素之間的邏輯關係發生變化,所以除非插入位置是當前表中的最後一個元素以後,不然必須經過順序移動數據元素的存儲位置才能實現。插入過程示意圖如圖所示:指針

順序表的插入

        順序表的插入算法時間耗費主要是元素的移動,移動元素的個數取決於插入位置。 最好狀況,插入位置在順序表表尾,無須移動元素;最壞狀況是在第一個位置插入,須要移動n個元素。在長度爲n的順序表i位置前插入一個元素,須要移動n-i+1個元素,能夠以有n+1個插入位置,在插入位置等機率條件下,插入一個元素的平均移動次數爲1/(n+1)*∑(n-i+1)=n/2,所以算法的時間複雜度爲O(n)。 注意:∑(n-i+1)表示下標是i=1,上標是n+1的求和表達式。cdn

  • 2.二、順序表的刪除

        順序表的刪除和插入的過程相似,須要移動刪除元素後面的全部元素存儲位置。過程如圖所示:對象

順序表的插入和刪除

        同插入算法同樣,刪除算法時間主要消耗在元素的移動。最好狀況,刪除位置在順序表末尾,無須移動元素;最壞狀況,刪除位置是第一個元素,須要移動n-1個元素。在長度爲n的順序表的i位置刪除元素,須要移動n-i個元素,在刪除位置等機率條件下,刪除一個元素的平均移動次數爲1/n*∑(n-i)=(n-1)/2,所以算法的時間複雜度爲O(n)。 注意:∑(n-i)表示下標是i=1,上標是n+1的求和表達式。blog

  • 2.三、順序表的特色

        順序表的特色 是以「存儲位置相鄰」表示兩個元素之間的前驅後繼關係。順序表的優勢是能夠隨機存取表中任意一個元素。其主要缺點一是容易產生存儲空間的浪費;二是每作一次插入或刪除操做時,平均來講必須移動表中一半元素。所以,順序表常常主要應用於爲查詢而不多作插入和刪除操做、表長變化不大的線性表。

3、鏈表

        所謂 鏈表 ,就是指採用鏈式存儲結構表示和實現的線性表。         鏈表的特色是採用一組任意的存儲單元來存放線性表中的數據元素,這些存儲單元能夠是連續的,也能夠是不連續的。 在鏈表中,數據元素之間的邏輯關係並不依賴其對應的存儲地址,而是經過設置專門用於指示數據元素之間邏輯關係的指針來描述。         所以,在鏈表中的每一個數據元素是由用於存放表明其自己信息的數據域和用於存放指示數據元素之間邏輯關係的指針域兩部分組成的,數據元素的這種特殊存儲方式,稱爲 結點(Node) 。         根據鏈表結點中包含指針域的指針個數、指針指向和鏈接方式,可將鏈表分爲線性鏈表、循環鏈表、雙向鏈表、多重鏈表、十字鏈表、二叉鏈表、鄰接表、鄰接多重表等,其中線性鏈表、循環鏈表和雙向鏈表用於實現線性表的鏈式存儲結構,其餘形式則用於實現擴展線性結構(數組和廣義表等)或非線性結構(樹、圖等)。

鏈表結構示意圖

  • 3.一、線性鏈表(單鏈表)

        線性鏈表也稱 單鏈表 ,在每一個結點中只包含一個指針,用於指示該結點的直接後繼結點,整個鏈表經過指針相連,最後一個節點由於沒有後集結點,其指針置爲空NUll。結構示意圖如上圖所示。

3.1.一、單鏈表的插入

        線性鏈表的插入是指在線性鏈表的第-1個結點和第i個結點之間插入一個新的結點,此時,線性鏈表中插入位置先後結點之間的邏輯關係發生變化,所以除非插入位置是當前表中的最後一個結點以後,不然必須經過同時修改插入位置以前結點和當前插入結點的指針指向才能實現。         線性鏈表的插入無須移動元素,插入算法的基本步驟以下圖所示:         (1)尋找插入位置,即第i-1個結點的位置。         (2)申請結點存儲空間,生成新結點。         (3)修改第-1個結點和新結點指針域,將新結點連接在鏈表中。

單鏈表的插入和刪除示意圖

        線性鏈表的插入算法時間主要消耗在尋找插入位置上,須要從鏈表頭指針開始依次訪問結點,直到找到插入位置,所以算法的時間複雜度爲O(n)。

3.1.二、單鏈表的刪除

        線性鏈表的刪除是指刪除線性鏈表的第i個結點,此時,線性鏈表中刪除位置先後結點之間的邏輯關係發生變化,所以必須經過修改刪除位置以前結點的指針指向才能實現。刪除過程示意圖,如上。         同插入結點同樣,刪除過程首先尋找要刪除結點的前一個結點位置,再經過修改結點指針域完成刪除操做。 所以算法的時間複雜度爲也O(n)。

  • 3.二、循環鏈表(單向)

       在線性鏈表中,最後一個結點的指針指向NULL,表示該線性鏈表的結束。若是把表尾結點的指針改成指向該鏈表的第一個結點,則整個線性鏈表構成一個閉合的迴路,稱這種頭尾相連的線性鏈表形式爲 循環鏈表 。         整個鏈表就像一條單向環形的公交線路,人們能夠從線路中的任一站點出發到達整個線路的其餘站點。插入和刪除的時間複雜度也爲O(n),循環鏈表存儲結構示意圖以下:

循環單向鏈表示意圖

  • 3.三、雙向鏈表

        若是在線性鏈表的結點中增長一個指針域,用來指向結點的直接前驅,則從表中的任一結點出發,既能夠向後查找結點的後繼,也能夠向前查找結點的前驅。整個鏈表包含分別指向前驅和後繼的兩條鏈,稱爲 雙向鏈表 。雙向鏈表的存儲結構示意如圖:

雙向鏈表的存儲結構示意

  • 3.四、雙向循環鏈表

        使雙向鏈表中的兩條鏈均構成閉合迴路,則造成 雙向循環鏈表 。雙向循環鏈表結構示意圖以及插入和刪除過程示意圖以下:

雙向循環鏈表

雙向循環鏈表插入和刪除過程示意圖

  • 3.五、鏈表的特色

        鏈表的特色 是以「指針」指示其後繼元素,鏈表中的元素能夠存儲在任意一組存儲單元中。所以,鏈表的優勢是無須預先估計線性表的大小,節省存儲開銷,且作插入、刪除操做時,無須移動元素;其主要缺點是不管鏈表作插入、刪除仍是查找,均須要從鏈表的起始位置開始,鏈表不具有隨機存取的特性。

4、棧

        是一種操做受限的線性表,上面提到的順序表和鏈表能夠在表的兩端和表內進行插入刪除操做,而 棧僅容許在一端(棧頂)進行插入刪除操做 ,也就是進(入)棧和出棧操做,棧頂是棧讀取數據的惟一入口,操做遵循「 先進後出(LIFO) 」的原則。例如Object-C中的導航控制器就是用棧的特性實現的。

棧的結構示意圖

根據存儲結構的不一樣,也能夠把棧分爲 順序棧鏈棧 兩種存儲結構。

  • 4.一、順序棧

        棧的順序存儲也稱爲順序棧,它利用一組地址連續的存儲單元依次存放自棧底到棧頂的元素,同時附設棧頂標識top來指示棧頂元素在順序棧中的位置。順序棧的入棧和出棧操做結構示意圖如圖所示:

順序棧的入棧和出棧操做結構示意圖

  • 4.二、鏈棧

        棧的鏈式存儲也稱爲鏈棧,它和鏈表的存儲原理同樣,均可以利用閒散空間來存儲元素,用指針來創建各結點之間的邏輯關係。鏈棧也會設置一個棧頂元素的標識符top,稱爲棧頂指針。鏈棧的入棧和出棧操做結構示意圖如圖所示

鏈棧結構示意圖

鏈棧的入棧和出棧操做結構示意圖

5、隊列

        隊列 是也一種操做受限的線性表,但隊列和棧不一樣, 隊列只容許在一端(隊尾)進行插入(入隊)操做 ,在另外一端(隊頭)進行刪除(出隊)操做,操做遵循的是「 先進先出(FIFO) 」原則。         隊列中會有一個指針指向隊頭,這個指針稱爲 隊頭指針front 。當有元素出隊時,隊頭指針向後移動,指向下一個元素,下一個元素成爲新的隊頭元素(相似於棧的棧頂指針);隊列中也會有一個指針指向隊尾,稱爲 隊尾指針rear ,隊尾指針是指向最後一個元素以後的一個空指針。當有元素須要入隊時,就插入到隊尾指針所指位置處,插入以後,隊尾指針向後移動,指向下一個空位。當隊列已滿時,元素不能再入隊;同理,當隊列爲空,沒法執行出隊操做。

隊列結構示意圖

根據存儲結構的不一樣,也能夠把隊列分爲 順序隊列鏈式隊列 兩種存儲結構。

  • 5.一、順序隊列

        使用順序表實現的隊列稱做 順序隊列 。順序隊列的實現和順序表的實現類似,只是在順序隊列中只容許在一端進行插入,在另外一端進行刪除。定義兩個變量 front與rear分別標識隊頭與隊尾,當刪除隊頭元素時, front後移到下一個位置;當插入新元素時,在rear指示的位置插入,插入後,rear向後移動指向下一個存儲位置。順序隊列的出入隊操做示意圖以下:

順序隊列的出入隊操做示意圖

  • 注意 :隊列的「假溢出」

        在順序隊列的存儲過程當中,可能出現「溢出」現象,隊列的「溢出」有兩種狀況,一種真「溢出」,另外一種爲假「溢出「。         所謂 真「溢出」 是指當隊列分配的空間已滿,此時再往裏存儲元素則會出現「溢出」,這種「溢出」是真的再無空間來存儲元素,是真「溢出」;而 假「溢出」 是指隊列尚有空間而出現的「溢出」狀況。當 front端有元素出隊時, front向後移動;當rear端有元素入隊時,rear向後移動,若rear已指到隊列中下標最大的位置,此時雖然 front前面有空間,但再有元素入隊也會出現「溢出」,這種「溢出」叫做「假溢出」,示意圖以下。         解決「假溢出」有兩種方法。一是採用「移動隊列」的方法,即每當執行一次出隊操做,則依次將隊頭和隊尾指針向數組的起始位置移動,始終保持隊頭在數組的起始位置,這種方法的代價是產生大量的元素移動,顯然不是一個好方法;另外一種方法就更合理高效了,就是採用5.2循環隊列。

假溢出示意圖

  • 5.二、循環隊列

        爲了解決順序隊列中的假「溢出」現象,充分利用數組的存儲空間,能夠將順序隊列的頭尾相連,構成一個 循環隊列,循環隊列通常都是用數組來實現的。將循環隊列假想爲一個環狀的空間,以下圖所示。         在循環隊列中, front與rear都是能夠循環移動的,當隊空時, front=rear成立;當隊滿時, front=rear也成立。所以顯然不能只憑 front=rear來判斷隊空仍是隊滿。         爲了解決這個問題,在循環隊列中有一個約定:少用一個元素空間,當隊尾標識的rear在隊頭標識front的上一個位置時,隊列爲滿。此時,判斷隊空和隊滿的條件分別以下:         隊空時: front==rear爲真。         隊滿時:(rear+1)% MAXSIZE== front爲真 ( MAXSIZE是隊列容量的大小)。         循環隊列中ront和rear的移動再也不是簡單的加1,由於是循環的,可能本來指在末尾,前進一個單位就是又一個循環的開始,因此每次移動都要對隊列容量 MAXSIZE取模:front = (front +1)% MAXSIZE,rear = (rear+1)% MAXSIZE。         在循環隊列中,求隊列的長度也不只僅是rear與ront相減這麼簡單,由於,rear的值有可能比front小,這樣的相減結果是負值,顯然不對。在求循環隊列的長度時,都是用rear加上隊列容量,減去 front的值後,再對容量取模:(rear+ MAXSIZE- front)% MAXSIZE。

循環隊列結構示意圖

  • 5.三、鏈式隊列

        用鏈表來實現的隊列也稱爲 鏈式隊列 ,在鏈式隊列中也用指針 front與rear分別指示隊頭與隊尾,在隊頭 front處刪除元素,在隊尾rear處插入元素。與順序隊列不一樣,鏈式隊列的rear指針指向最後一個元素。鏈式隊列的結構和出入隊操做示意圖以下:

鏈式隊列的結構示意圖

鏈式隊列的出入隊操做示意圖


注:文中的圖片均轉摘自網絡

相關文章
相關標籤/搜索