上一篇《數據結構和算法之時間複雜度和空間複雜度》中介紹了時間複雜度的概念和常見的時間複雜度,並分別舉例子進行了一一說明。這一篇主要介紹線性表。html
線性表屬於數據結構中邏輯結構中的線性結構。回憶一下,數據結構分爲物理結構和邏輯結構,邏輯結構分爲線性結構、幾何結構、樹形結構和圖形結構四大結構。其中,線性表就屬於線性結構。剩餘的三大邏輯結構從此會一一介紹。算法
線性表(List):由零個或多個數據元素組成的有限序列。windows
注意:數組
1.線性表是一個序列。數據結構
2.0個元素構成的線性表是空表。數據結構和算法
3.線性表中的第一個元素無前驅,最後一個元素無後繼,其餘元素有且只有一個前驅和後繼。工具
4.線性表是有長度的,其長度就是元素個數,且線性表的元素個數是有限的,也就是說,線性表的長度是有限的。post
若將線性表記爲(a1,…,ai-1,ai,ai+1,…an),則表中ai-1領先於ai,ai領先於ai+1,稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素。優化
InitList(*L): 初始化操做,創建一個空的線性表L。 url
ListEmpty(L): 判斷線性表是否爲空表,若線性表爲空,返回true,不然返回false。
ClearList(*L): 將線性表清空。 GetElem(L,i,*e): 將線性表L中的第i個位置元素值返回給e。
LocateElem(L,e): 在線性表L中查找與給定值e相等的元素,若是查找成功,返回該元素在表中序號表示成功;不然,返回0表示失敗。
ListInsert(*L,i,e): 在線性表L中第i個位置插入新元素e。
ListDelete(*L,i,*e): 刪除線性表L中第i個位置元素,並用e返回其值。
ListLength(L): 返回線性表L的元素個數。
對於不一樣的應用,線性表的基本操做是不一樣的,上述操做是最基本的。
對於實際問題中涉及的關於線性表的更復雜操做,徹底能夠用這些基本操做的組合來實現。
咱們知道,數據結構分爲邏輯結構和物理結構,邏輯結構分爲集合結構、線性結構、樹形結構和圖形結構四大類。物理結構分爲順序存儲結構和鏈式存儲結構。我在以前寫的《數據結構和算法》中已經介紹過。
線性表是線性結構的一種,那麼線性表固然也有物理結構,也就是說,線性表有兩種,分別是順序結構的線性表(叫作順序表)和鏈式結構的線性表(叫作鏈表)。
順序表是指順序存儲結構的線性表,指的是用一段地址連續的存儲單元依次存儲線性表的數據元素。
順序表表如今物理內存中,也就是物理上的存儲方式,事實上就是在內存中找個初始地址,而後經過佔位的形式,把必定的內存空間給佔了,而後把相同數據類型的數據元素依次放在這塊空地中。注意,這塊物理內存的地址空間是連續的。
舉 個例子,好比C語言中的基本變量的存儲就是連續的存儲在內存中的,好比聲明一個整數i,在64位系統中整數i在內存中佔8字節,那麼系統就會在內存中爲這 個整型變量分配一個長度爲8個字節的連續的地址空間,而後把這個i的二進制形式從高地址向低地址存儲,長度不足時候,最高位用0補齊。
#define MAXSIZE 20 // 順序表的最大存儲容量 typedef int ElemType; // 順序表存儲的數據類型 typedef struct { ElemType data[MAXSIZE]; // 用數組表示順序表 int length; // 線性表當前長度 } SqList;
經過上面用結構體定義順序表,咱們能夠看出順序表的封裝須要三個屬性:
代碼實現:
思路以下:
1.若是插入位置不合理,拋出異常;
2.若是線性表長度大於等於數組長度,則拋出異常或動態增長數組容量;
3.從最後一個元素開始向前遍歷到第i個位置,分別將它們都向後移動一個位置;
4.將要插入元素填入位置i處;
5.線性表長+1。
代碼實現:
思路以下:
由以上代碼能夠看出:
前面咱們講的線性表的順序存儲結構,它最大的缺點就是插入和刪除時須要移動大量元素,這顯然就須要耗費時間。
那咱們能不能針對這個缺陷或者說遺憾提出解決的方法呢?要解決這個問題,咱們就得考慮一下致使這個問題的緣由!
爲何當插入和刪除時,就要移動大量的元素?
緣由就在於相鄰兩元素的存儲位置也具備鄰居關係,它們在內存中的位置是緊挨着的,中間沒有間隙,固然就沒法快速插入和刪除。
線性表的鏈式存儲結構的特色是用一組任意的存儲單元存儲線性表的數據元素,這組存儲單元能夠存在內存中未被佔用的任意位置。
鏈式存儲結構中,除了要存儲數據元素信息外,還要存儲它的後繼元素的存儲地址(指針)。
也就是說除了存儲其自己的信息外,還需存儲一個指示其直接後繼的存儲位置的信息。
咱們把存儲數據元素信息的域稱爲數據域,把存儲直接後繼位置的域稱爲指針域。
指針域中存儲的信息稱爲指針或鏈。
這兩部分信息組成數據元素稱爲存儲映像,或稱爲結點(Node)。
n個結點連接成一個鏈表,即爲線性表(a1, a2, a3, …, an)的鏈式存儲結構。
由於此鏈表的每一個結點中只包含一個指針域,因此叫作單鏈表。
對於線性表來講,總得有個頭有個尾,鏈表也不例外。咱們把鏈表中的第一個結點的存儲位置叫作頭指針,最後一個結點指針爲空(NULL)。
單鏈表是線性表中最具表明性的一種,下一篇文章中,本人將會拿出一章來介紹單鏈表,敬請期待!
圖片來源參考自:魚C工做室。感謝魚C工做室貢獻出了這麼好的圖片。
如非特別說明,筆者全部文章都是原創文章。若是您喜歡這篇文章,轉載請註明出處。若是您對數據結構感興趣,請關注我,後續會更新大量精品文章供你們參考!
PS:本篇文章在簡書也有同步更新,你們也能夠移步簡書關注本人,後續會更新更多精品文章!
簡書地址:http://www.jianshu.com/users/93131dfba96a/latest_articles