老楊《大話資料結構》第三章 線性表

Yzy_Carlisle發表於2020-09-26

基本概念

線性表是零個或者多個資料元素的有序序列,第一個元素沒有前驅,最後一個元素沒有後繼,其他資料元素有且僅有一個前驅一個後繼,同時線性表元素的個數n定義為線性表長度。

線性表的抽象資料型別ADT

=>Data

{a1, a2, ..., an}, 且每個元素的型別均為DataType,從第二個資料元素到倒數第二個資料元素都有且僅有一個前驅元素,和一個後繼元素。

=>Operation

InitList(*L)

ListEmpty(L)

ClearList(*L)

GetElem(L, i, *e)

LocateElem(L, e)

ListInsert(*L, i, e)

ListDelete(*L, i, *e)

ListLength(L)

endADT

void union(List *La, List Lb)

{

ing La_len, Lb_len, i ;

ElemType e;

La_len = ListLength(La);

Lb_len = ListLength(Lb);

for (i=1; i<=Lb_len; i++) {

     GetElem(Lb, i, e);

     if (!LocateElem(La, e, equal))

          ListInsert(La, ++La_len, e); }

}

線性表的順序儲存結構

線性表的順序儲存結構,指的是用一段連續的實體地址儲存單元一次儲存線性表的資料元素,(a1, a2, ..., ai-1, ai, ..., an)

線性表的順序儲存結構就是通過佔位的形式,把一定記憶體空間佔據,然後讓不同的資料元素一次放在空地中。線性表順序儲存的結構程式碼中需要三個屬性

  1. 儲存空間的起始位置
  2. 最大儲存容量
  3. 線性表當前的長度

順序儲存結構的插入與刪除

線性表的插入本質上是將元素i插入到表的某處,並將後續資料元素依次向後挪一位。插入演算法的思路是,

  1. 插入位置不合理,丟擲異常
  2. 線性表長度大於或者等於陣列長度,丟擲異常或者動態增加容量
  3. 最後一個元素開始向前遍歷到i位置,分別後移
  4. 元素插入位置i
  5. 表長加1

刪除操作則反向,將元素刪除後,後續資料元素向前挪位。刪除演算法思路:

  1. 如果刪除位置不合理,丟擲異常
  2. 去除刪除元素
  3. 刪除元素位置遍歷到最後,前移
  4. 表長-1

優缺點:

優點:無需因為邏輯關係增加儲存空間,且可以快速存取表中元素

缺點:插入和刪除操作需要移動大量元素,難以確定儲存空間容量且會造成儲存空間碎片

線性表的鏈式儲存結構

鏈式儲存結構的設計打破了物理儲存地址必須連續的規定,這也是他和線性表區別最大的地方。一個資料元素包含了兩個部分,即資料域和指標域。資料域負責儲存所使用的具體資料,指標域則負責指向後繼節點地址。由於節點之間使用鏈子式結構進行連結,因而稱為線性表的鏈式儲存結構,這兩部分的組合稱為一個節點Node。

 

同理,對於線性表來說,都是有頭有尾的人物。因此連結串列也不例外,第一個節點儲存位置稱為頭指標,最後一個節點的後繼指標指向Null,就是空。第一個節點稱為頭節點。頭指標式指向第一個節點的指標,頭指標具有標識作用,且無論連結串列是否為空,頭指標均不是空。頭指標式連結串列的必要元素。

單連結串列的插入與刪除

連結串列插入非常簡單,將新節點和相鄰節點的指標域重新連結即可。注意順序不能反 不然會出現迴圈指標造成錯誤。

s->next = p->next;

p->next = s;

那麼,單連結串列的第i個資料插入的思路是:

  1. 宣告節點p指向連結串列第一個節點,初始化j從1開始
  2. j<i, 繼續遍歷連結串列讓p指標後移,j累加1
  3. 若p為空連結串列,則第i元素不存在
  4. 否則查詢成功,生成空節點s
  5. 將e賦值給s->data
  6. 單連結串列插入標準語句
  7. 返回OK

單連結串列的刪除

q=p->next; p->next = p->next->next

本質上就是將q節點隔開了,同時重新接上了p節點和下下個節點q->next 或者p->next->next。

單連結串列的整表建立與刪除

單連結串列的整表建立是:

  1. 宣告節點p和i計數器變數i
  2. 初始化空連結串列i
  3. L的頭結點指標指向NULL
  4. 迴圈
  • 生成新結點給p
  • 隨機生成數字給p資料域
  • p插入到頭結點與新節點之間

單連結串列的整表刪除:

宣告節點P和Q

第一個節點的值賦值給P

迴圈

  • 將下一節點賦值給Q
  • 釋放P
  • Q賦值給P

相關文章