數據結構學習筆記--線性表篇

線性表的定義

  • 線性表是最簡單和最經常使用的一種數據結構,由n(n>=0)個相同類型的數據元素(結點)組成的一個有序數列。bash

  • 線性表中所含元素的個數個數n定義爲線性表的長度數據結構

  • 當n>0時,稱爲空表,用一對空括號標示。記爲()性能

  • 當n>0時,可表示爲(a1,a2...,an),a1稱爲表頭元素,an稱爲表尾元素,a(i-1)稱爲ai的直接前驅,a(i+1)稱爲ai的直接後繼(2<= i <= n-1)ui

線性表的基本運算

  1. 初始化操做 InitList(L):線性表不存在,建立一個空的線性表L
  2. 求表長度 ListLength(L):求線性表L中全部數據元素的個數
  3. 取表元素 GetNode(L,i):輸出線性表L中第i位置上的元素
  4. 定位元素 LocateNode(L,x):在線性表中查找值爲x的數據元素首次出現的位置
  5. 插入操做 InsertList(L,i,x):在線性表L中的第i位置上插入一個元素x
  6. 刪除操做 DeleteList(L,i):在線性表L中刪除第i位置上的元素

線性表的存儲方式

(一)線性表的順序存儲結構

用一組地址連續的存儲空間一次存儲線性表中的數據元素。即邏輯上相鄰的元素存儲在的存儲單元物理位置也是相鄰的。spa

通常用這種方法存儲的線性表簡稱順序表,順序表在內存的起始地址稱做順序表的基地址。指針

線性表的順序存儲結構中的特色:code

  1. 數據在線性表中相鄰,在計算機內存中也相鄰。
  2. 只要肯定了存儲線性表的起始位置,線性表中任一數據元素均可隨機存取,因此順序表是一種隨機存儲結構。
  3. 容量固定,訪問速度快

實現線性表的逆置:將(a1,a2,a3...an)轉換爲(an,....a2,a1)內存

SeqList Conveerts (SeqList L)
    {
        DataType x;
        int i,k=L.length/2;
        for(i = 0; i<k; i++)
        {
            x = L.data[i];
            L.data[i] = L.data[L.length-i-1];
            L.data[L.length-i-1] = x;
        }
        return L;
    }
複製代碼

(二)線性表的鏈式存儲結構

能夠用內存空間一組任意的存儲單元(能夠是地址連續的,也能夠是不連續的)來存儲線性表中的數據元素(data)。it

在存儲數據元素時,除了存儲數據元素自己外,還有存儲與它相鄰的數據元素在內存中的存儲地址信息。這兩部分信息組成該數據元素的存儲映像(Image),稱爲結點(Node)io

把存儲數據元素自己信息的域叫結點的數據域(Data Domain)

把存儲與它相鄰的數據元素的存儲地址信息的域叫結點的指針域(Reference Domain)

線性表經過每一個結點的指針域(引用域)造成了一個‘鏈條’,因此也叫作鏈表,單鏈表的頭用 head 聲明,尾部用 rear聲明。head-》 |data|next| 。。。 |data|next| 《-rear

若是結點的指針域只存儲該結點直接後繼(next)結點的存儲地址,則該鏈表叫「單鏈表」,單鏈表由:數據域(存儲元素自己信息)和指針域(存儲表中下一個結點的存儲地址)兩部分組成

若是單鏈表中的最後結點的指針域不爲空,而是指向單鏈表的頭結點,這樣就造成了一個「單循環鏈表」,優勢:從表的任一結點均可以訪問表中其餘結點

若是單鏈表的結點中增長一個指向其直接前趨的指針域(prior),這樣就造成了雙向鏈表。--》|prior|data|next|

有時候爲了操做運算方便,將雙向鏈表的尾結點和頭結點連接起來,就構成了雙向循環列表。

(三)順序表和鏈表的比較

  1. 順序存儲結構的特色:元素的存儲位置能夠用一個簡單的公式計算,能夠隨機存取任一元素,然而插入和刪除時,需移動大量數據元素。
  2. 鏈式存儲結構的特色:在插入和刪除時,不須要移動大量數據元素,可是失去了隨機訪問數據元素的特色。
  3. 時間性能比較:若是在實際問題中,對線性表的操做是常常性的查找運算,以順序存儲結構爲宜,若是常常進行的運算是插入和刪除運算,以鏈式存儲結構爲宜。
  4. 空間性能比較:數據量預先知道,適合使用順序存儲,數據量變更較大的動態問題,適合使用鏈式存儲
相關文章
相關標籤/搜索