線性表— 順序存儲和單鏈表

定義

零個或者多個數據元素的有限序列;

順序儲存結構

指的是用一段地址連續的儲存單元依次存儲線性表的數據元素;

  • 線性表的長度:是線性表中數據元素的個數,隨著表的插入和刪除操作的進行,這個量是變化的;
  • 數據的長度:是存放線性表的存儲空間長度,存儲分配后這個量是一般不變的;
  • 存儲器中的每一個存儲單元都有自己的編號,這個編號稱為地址;

獲得元素

enum Status{
  case Error
  case OK
}

func getElem(list:Array<Any>, i:Int, e:Any) -> Status{
  
  if list.count == 0 || i < 1 || i > list.count {
    return .Error
  }
  e = list[i - 1]
  return.OK
}

插入操作


func listInsert(L:SqList, i:Int, e:Any) -> Status{
  
  var j : Int
  
  if L.length == MAXSIZE {
    return .Error
  }
  
  if i < 1 || i > L.length + 1 {
    return .Error
  }
  
  if i <= L.length {
    for j in (i-1 ... L.length-1).reversed() {
      L.data[j + 1] = L.data[j]
    }
  }
  
  L.data[i - 1] = e
  L.length += 1
  return .OK
}

刪除


func delet(L:SqList, i:Int) -> Status{
  
  if L.length == 0 {
    return .Error
  }
  
  if i < 1 || i > L.length + 1 {
    return .Error
  }

  if i <= L.length {
    for j in (i ... L.length) {
      L.data[j-1] = L.data[j]
    }
  }
  L.length -= 1;
  return .OK;
  
}

順序存儲結構的優缺點

  • 優點:
    1、 無須為表中元素之間的邏輯關系而增加額外的存儲空間;
    2、可以快速的存取表中任一位置的元素

  • 缺點
    1、 插入和刪除元素操作需要移動大量元素;
    2、 當線性表的長度變化比較大時,難以確定存儲空間的容量;
    3、 造成存儲空間的碎片;

鏈式存儲結構

  • 我們把存儲數據元素信息的域為數據與,把存儲直接后繼位置的域稱為指針域;
  • 指針域中存儲的信息稱作指針或者鏈;
  • 指針域和數據域組成數據元素的存儲映像,稱為結點;
  • 鏈表中每一個結點中只包含一個指針域,稱為單鏈表;
  • 鏈表中,第一個節點的存儲位置稱為頭指針;
  • 在單鏈表的第一個結點前附設一個結點,稱為頭結點;
頭指針 頭結點
頭指針是指鏈表指向第一個結點的指針,若鏈表有頭結點,則是指向頭結點的指針 頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其數據域一般無意義(也可存放鏈表的長度。)
頭指針具有標識作用,所以常用頭指針冠以鏈表的名字 有了頭結點,對在第一元素結點前插入結點和刪除第一結點,其操作就統一了
無論鏈表是否為空,頭指針均不為空。頭指針是鏈表的必要元素 頭結點不一定是鏈表必須要素

單鏈表的插入和刪除 (算法復雜度 O(n))

對于插入或者刪除數據越頻繁的操作,單鏈表的效率優勢就越明顯;

插入
假設有結點 p, p 的下一個結點為 p->next, 需要將結點s插入到結點p之后;
算法思路: 將p的指向下個結點的指針地址更改為結點s的地址, 將結點s指向下個結點的指針地址更改為p->next的地址即可;

刪除
假設有連續的三個結點 p,q,r;現要刪除q;
算法思路:將p的存儲指針更改為r的指針地址;將q釋放;

單鏈表的整表創建

單鏈表的創建過程就是一個動態生成鏈表的過程,即從“空表”的初始狀態起依次建立各元素結點,并逐個插入鏈表;

  • 頭插法:始終讓新結點在第一位置;
  • 尾插法:每次把新結點都插在終端結點的后面;

單鏈表的整表刪除

算法思路
1、 聲明結點p,q;
2、 將第一個結點賦值給p;
3、 循環
* 將下一結點賦值給q;
* 釋放p;
* 將q賦值給p;

單鏈表結構和順序存儲結構優缺點

1、 存儲分配方式

  • 順序存儲結構用一段連續的存儲單元依次存儲線性表的數據元素;
  • 單鏈表采用鏈式存儲結構,用一組任意的存儲單元存放線性表的元素;

2、時間性能

  • 查找
    . 順序存儲結構O(1);
    . 單鏈表O(n);
  • 插入和刪除
    . 順序存儲結構需要平均移動表長一半的元素 時間為O(n);
    . 單鏈表在線出某位置的指針后,插入和刪除的時間為O(1);

3、 空間性能

  • 順序存儲結構需要預分配存儲空間,分大了,浪費,分小了易發生上溢;
  • 單鏈表不需要分配存儲空間,只要有就可以分配,元素個數也不受限制;

4、 總結

  • 若線性表需要頻繁的查找,很少進行插入和刪除操作時,宜采用順序存儲結構。若需要頻繁的插入個刪除的時,宜采用單鏈表結構。
  • 當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構,這樣不需要考慮存儲空間大小的問題。而如果事先知道線性表的大致長度,順序存儲效率較高;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容