1. 程式人生 > >線性表------線性儲存結構

線性表------線性儲存結構

線性表從名字上來看就是具有像線一樣的性質的表,小朋友出校門排隊就是一個線性表的典型例子,有頭有尾,一個跟著一個,其中的小朋友都知道前一個和後一個是誰,如同有一根線吧他們串聯起來。

1.線性表:零個或者多個數據元素的有限序列。(第一個元素無前驅,最後一個元素無後繼,其他元素都有且只有一個前驅和後繼).線性表的相鄰元素之間存在著序偶關係。如用(a1,…,ai-1,ai,ai+1,…,an)表示一個順序表,則表中ai-1領先於ai,ai領先於ai+1,稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素。當i=1,2,…,n-1時,ai有且僅有一個直接後繼,當i=2,3,…,n時,ai有且僅有一個直接前驅 。所以線性表元素的個數n(n>=0)定義為線性表的長度,當n=0時,稱為空表。

2.在較複雜的線性表中,一個數據元素可以由若干個資料項組成。

3.線性表的抽象資料型別定義為下:

ADT 線性表(list)
Data
   資料表的資料物件集合為{a1,a2,...,an},每個元素的型別均為datatype。其中,除第一個元素a1外,每一個元素有且只有一個直接前驅元素,除了最後一個元素an外,每一個元素有且只有一個後繼元素。資料之間的關係是一對一的關係。
Operation
    Initlist(*L):初始化操作,建立一個空的線性表L
    ListEmpty(L):若線性表為空,返回值為true,否則返回false
    ClearList(*L):將線性表清空
    GetElem(L,i,*e):將線性表L中第i個位置處的元素返回給e
    LocateElem(L,e):線性表L中查詢與給定值e相等的元素,如果查詢成功返回該元素在表中的序號表示成功,否則返回0表示失敗
    ListInsert(*L,i,e):線上性表中的第i個位置插入新元素e
    ListDelete(*L,i,*e):刪除表中第i位置元素,並用e返回其值
    ListLength(L):返回線性表L的元素個數
endADT

4.線性表的順序儲存結構是指用一段地址連續的儲存單元依次儲存線性表的資料元素。

c語言中可以用一位陣列來實現順序儲存結構.(線性表長度<=資料長度maxsize)

線性表的順序儲存的結構程式碼

#define Maxsize 20    //儲存空間的初始分量
typedef int Elemtype
typedef struct
{
Elemtype data[Maxsize];//陣列儲存資料元素,最大值為Maxsize
int length;//線性表當前長度
}sqlist;

可以發現,順序儲存結構需要三個屬性:

  • 儲存空間的起始位置:陣列data,它的儲存位置就是儲存空間的儲存位置
  • 線性表的最大儲存容量:陣列長度Maxsize
  • 線性表的當前長度:length、

5.儲存器中的每個儲存單元都有自己的編號,這個編號稱為地址

對於第i個元素ai 的儲存位置可以由a1推算出:

LOC(ai)=LOC(a1)+(i-1)*c(c為資料型別長度)

依據公式,可以隨時算出線性表中任意位置的地址,不管它是第一個還是最後一個,都是相同的時間。所以它的存取時間效能為O(1).我們通常把具有這一特點的儲存結構稱為隨機儲存結構

6.獲取元素操作

#define ok 1
#define error 0
#define true 1
#define false 0
typedef int status;//status是函式的型別,其值是函式結果狀態程式碼,如ok等;初始條件:順序線性表L已存在,1<=i<=Listlength(L);操作結果:用e返回L中第i個數據元素的值
status Getelem(sqlist L,int i,Elemtype *e)
{
if(L.length==0||i<1||i>L.length)
return error;
*e=L.data[i-1];
return ok;
}

7.插入操作(類比插隊)

演算法思路如下:

  • 如果插入位置不合理,丟擲異常;
  • 如果線性表元素大於等於陣列長度,則丟擲異常或者動態增加容量
  • 從最後一個元素開始向前遍歷到第i個位置,分別將它們都向後移動一個位置
  • 將要插入元素填入位置i處
  • 表長加一

8.刪除操作(類比離隊)

演算法思路如下:

  • 如果刪除位置不合理,丟擲異常
  • 取出刪除元素
  • 從刪除元素位置開始遍歷到最後一個元素位置,分別將它們都向前移動一個位置
  • 表長減一

9.插入和刪除時,時間複雜度均為O(n)

10.線性表順序儲存結構的優缺點

優點:

  • 無須為表示表中元素之間的邏輯關係而增加額外的儲存空間
  • 可以快速地存取表中任一位置的元素

缺點

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