線性表

線性表

線性表(Linear List)是最簡單和最常用的一種數據結構,它是由n個數據元素(節點)a1,a2,a3,...an組成的有限序列,數據元素的個數n爲表的長度。

  • 線性表的邏輯特徵(非空的線性表)

    • 有且只有一個稱謂開始元素的a1, 他沒有前趨,僅有一個直接後繼a2
    • 有且只有一個稱爲終端元素的an,他沒有後繼,僅有一個直接前趨an-1
    • 其餘元素ai (2 <= i <= n-1 )稱爲內部元素,它們都有一個直接前趨ai-1和後繼ai+1
  • 線性表的基本運算
    • 置空表 initList(L),構造一個空的表
    • 求表長 ```ListLength(L)
    • 取表中的第i個元素GetnNode(L, i)
    • 按值查找 LocateNode(L, x), 在表L中查找一個值爲i的元素
    • 插入 InsertList(L, i, x), 在表L的第i個元素插入一個值爲x的元素,表的長度加1
    • 刪除 DeleteList(L, i), 刪除表L的第i個元素,表長減一

順序表

線性表的順序存儲指的是將線性表的數據元素按照邏輯順序依次存入一組地址連續的存儲單元裏,用這種方法存貯的線性表稱爲順序表。

線性表的第i個元素的存儲位置:

  // d爲每個元素佔用的存儲單元個數
  LOC(ai) = LOC(a1) + (i - 1) * d

線性表的這種機內表示稱爲線性表的順秀存儲結構,它的特點是,元素在表中的相鄰關係,在計算機內也存在着相鄰的關係。每個元素a1的存儲地址是該元素
在表中的位置i的線性函數,只要知道基地址和每個元素佔用的單元數(元素的大小),就可以求出表中的任意元素的存儲地址。

只要確定了線性表存儲的起始位置,線性表中的任意一個元素都可以隨機存取,所以順序表也是一種隨機存取結構。

  • 優點

    • 通過下標獲取元素,時間複雜度爲O(1)
  • 缺點
    • 插入,刪除操作需要移動大量元素,時間複雜度爲O(n)

鏈表

線性表順序存儲結構的特點是,在邏輯關係上相鄰的兩個元素在存儲位置上也是相鄰的,因此可以隨機存取表中的任一元素。
但是,當經常需要做插入和刪除運算時,需要移動大量的元素,而採用鏈式存儲結構時就可以避免這些移動。

由於鏈式存儲結構存儲線性表的數據元素的存儲位置可能是連續的也可能是不連續的,因此鏈表的節點是不可以隨機存取的。

在使用鏈式存儲結構表示每個數據元素ai是,除了存儲ai本身的信息之外,還需要一個存儲指示其後繼元素ai+1存儲位置的指針,由這兩個部分組成元素ai的存儲映像通常稱爲節點。

  • 節點包括兩個域:
    1. 存儲數據元素的域,稱爲數據域
    2. 存儲直接後繼指針的域,稱爲指針域

利用這種存儲方式表示的線性表稱爲鏈表:

  +-----------+------------+
  |    data   |    next    |
  +-----------+------------+

鏈表指的是有n個節點鏈成一個鏈表,即爲線性表的鏈式存儲結構

單鏈表

單鏈表的每個節點只包含一個指針域,因此稱爲單鏈表。

  head
   |
   |      +----+---+      +----+----+               +----+----+
   \----> | a1 |   |----->| a2 |    |----> ... ---->| an |    |
          +----+---+      +----+----+               +----+----+

數據結構

線性表

線性表(Linear List)是最簡單和最常用的一種數據結構,它是由n個數據元素(節點)a1,a2,a3,...an組成的有限序列,數據元素的個數n爲表的長度。

  • 線性表的邏輯特徵(非空的線性表)

    • 有且只有一個稱謂開始元素的a1, 他沒有前趨,僅有一個直接後繼a2
    • 有且只有一個稱爲終端元素的an,他沒有後繼,僅有一個直接前趨an-1
    • 其餘元素ai (2 <= i <= n-1 )稱爲內部元素,它們都有一個直接前趨ai-1和後繼ai+1
  • 線性表的基本運算
    • 置空表 initList(L),構造一個空的表
    • 求表長 ```ListLength(L)
    • 取表中的第i個元素GetnNode(L, i)
    • 按值查找 LocateNode(L, x), 在表L中查找一個值爲i的元素
    • 插入 InsertList(L, i, x), 在表L的第i個元素插入一個值爲x的元素,表的長度加1
    • 刪除 DeleteList(L, i), 刪除表L的第i個元素,表長減一

順序表

線性表的順序存儲指的是將線性表的數據元素按照邏輯順序依次存入一組地址連續的存儲單元裏,用這種方法存貯的線性表稱爲順序表。

線性表的第i個元素的存儲位置:

  // d爲每個元素佔用的存儲單元個數
  LOC(ai) = LOC(a1) + (i - 1) * d

線性表的這種機內表示稱爲線性表的順秀存儲結構,它的特點是,元素在表中的相鄰關係,在計算機內也存在着相鄰的關係。每個元素a1的存儲地址是該元素
在表中的位置i的線性函數,只要知道基地址和每個元素佔用的單元數(元素的大小),就可以求出表中的任意元素的存儲地址。

只要確定了線性表存儲的起始位置,線性表中的任意一個元素都可以隨機存取,所以順序表也是一種隨機存取結構。

  • 優點

    • 通過下標獲取元素,時間複雜度爲O(1)
  • 缺點
    • 插入,刪除操作需要移動大量元素,時間複雜度爲O(n)

鏈表

線性表順序存儲結構的特點是,在邏輯關係上相鄰的兩個元素在存儲位置上也是相鄰的,因此可以隨機存取表中的任一元素。
但是,當經常需要做插入和刪除運算時,需要移動大量的元素,而採用鏈式存儲結構時就可以避免這些移動。

由於鏈式存儲結構存儲線性表的數據元素的存儲位置可能是連續的也可能是不連續的,因此鏈表的節點是不可以隨機存取的。

在使用鏈式存儲結構表示每個數據元素ai是,除了存儲ai本身的信息之外,還需要一個存儲指示其後繼元素ai+1存儲位置的指針,由這兩個部分組成元素ai的存儲映像通常稱爲節點。

  • 節點包括兩個域:
    1. 存儲數據元素的域,稱爲數據域
    2. 存儲直接後繼指針的域,稱爲指針域

利用這種存儲方式表示的線性表稱爲鏈表:

  +-----------+------------+
  |    data   |    next    |
  +-----------+------------+

鏈表指的是有n個節點鏈成一個鏈表,即爲線性表的鏈式存儲結構

單鏈表

單鏈表的每個節點只包含一個指針域,因此稱爲單鏈表。

  head
   |
   |      +----+---+      +----+----+               +----+----+
   \----> | a1 |   |----->| a2 |    |----> ... ---->| an |    |
          +----+---+      +----+----+               +----+----+

單鏈表中的每個節點的存儲結構是存放在其直接前趨節點的指針域(next)中,而開始節點無直接前趨,因此設立頭指着鞥heead只向開始節點。又由於終端節點無後繼節點,所以終端節點的指針域爲空

如果鏈表中一個節點都沒有,則爲空鏈表,此時head=NULL

  • 基本運算
    • 建立單鏈表
      1. 頭插法:將節點插入到表頭,節點的次序和輸入的次序相反,將head指向新節點(p),將p的next指向原來head指向的節點
      2. 尾插法: 節點的次序與輸入的次序一致,將新節點(p)插入在當前鏈表的表尾上,需要設立一個尾指針(rear),使其始終指向鏈表的尾節點
    • 查找
    • 在單鏈表中,任何兩個節點的存儲位置之間沒有的聯繫,每個節點的存儲位置包含在其前趨的指針域中,因此在單鏈表中存取第i個節點時,必須從表頭節點開始搜索,平均複雜度爲O(n)
    • 插入
    • 先使新節點p指向ai-1的位置,然後生成一個數據域爲x的新節點*s, 在進行插入操作,鏈表插入不需要移動節點,但是需要從表頭開始進行查找,因此該操作的複雜度爲O(n)
    • 刪除
    • 將鏈表的第i個元素從表中刪除,由於第i-1個節點的存儲地址是存儲在第i-1個節點的指針域next中,因此要先使p指向第i-1個節點,然後使得p->next指向第i+1個節點,在將第i個節點釋放掉。時間複雜度也是O(n)

循環鏈表

循環鏈表是鏈式存儲結構的另一種形式,其特點是單鏈表中最後一個節點的指針域不爲空,而是指向鏈表的頭結點,使整個鏈表構成一個環。
任意一節點開始都可以訪問表中的其他元素。這種結構形式的鏈表稱爲單循環鏈表。

循環鏈表的節點類型與單鏈表完全相同,在操作上也與單鏈表基本一致,差別僅在與算法中循環的結束判斷條件不在是p或p->next是否爲空,而是它們是否等於頭結點。

雙向鏈表

在單鏈表和單循環鏈表中的節點只設有一個紙箱器直接後繼的指針域,因此從某個節點出發只能順指針向後訪問其他節點。若需要查找節點的直接前趨,則需要從頭指針開始查找某節點的直接前趨節點。

雙向鏈表可以從表中快速確定一個節點的直接前趨,雙向鏈表中的節點類型中增加了一個指向其直接前趨的指針域prior,形成了兩條不同方向的鏈,因此稱爲雙向鏈表。

與單鏈表不同的是在雙向鏈表中插入和刪除必須同時修改兩個方向上的指針

順序表和鏈表的比較

線性表有兩種存儲結構:順序存儲和線性存儲,這兩種存儲表示各有其特點:順序表結構可以隨機存取表中的任一元素,元素的存儲位置可用一個簡單的公式來表示,然而在做插入和刪除操作時,需要移動大量的元素。
鏈式存儲則可以克服在做插入和刪除運算時大量移動元素的問題,但卻失去了隨機存取的特點。

  • 性能比較:

    1. 時間性能

      • 在實際問題中,對線性表的經常性操作的查找運算,以順序表形式存儲爲宜。順序表是一種隨機存取結構,可以隨機訪問任一節點,訪問每個節點的時間代價是一樣的,每個節點的存取時間複雜度均爲O(1)。而鏈式存儲結構必須從表頭開始沿
        鏈逐一訪問節點,其時間複雜度爲O(n)。
      • 如果經常使用插入和刪除操作,以鏈式存儲結構爲宜。因爲順序存儲結構需要移動大量的節點元素,而鏈式存儲結構只要修改相應的指針。
    2. 空間性能
      • 順序表的存儲空間是靜態分配的,在程序執行之前必須給定空間大小。若線性表的長度變化較大,則存儲空間很難預先確定,設置過大則導致空間浪費,過小則導致空間溢出,因此對數據量大小能事先知道的問題,適合使用順序存儲結構。
      • 鏈式存儲結構是動態分配存儲空間,只要內存有空閒的空間,就不會產生溢出,依次對數據量變化較大的動態問題,以鏈式存儲結構爲好。

線性表節點的存儲密度,也是選擇存儲結構的一個重要依據,所謂存儲密度就是節點空間的利用率。它的計算公式爲:

  存儲密度 = (節點數據域所佔空間)/ (整個節點所佔空間)

一般來說存儲密度越大,存儲空間的利用率就越高。順序表的存儲密度爲1,而鏈表的節點的存儲密度小於1,若不考慮順序表的空閒區,則順序表的存儲空間利用率爲100%,遠高於鏈表的節點存儲密度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章