線性表包括順序表和連結清單,其中連結清單又包括單連結清單、循環連結清單、雙向連結清單。
順序存儲結構和鍊式存儲結構有所不同,具體差別如下表所示:

線性表是一種邏輯結構,相同資料類型的n個資料元素的有限序列,除第一個元素外,每個元素有且僅有一個直接前驅,除最後一個元素外,每個元素有且僅有一個直接後繼。
線性表的特點:
- 元素個數有限
- 邏輯上元素有先後次序
- 資料類型相同
- 僅讨論元素間的邏輯關系
注:線性表是邏輯結構,順序表和連結清單是存儲結構。
通過上面的對比,可以得出一些經驗性的結論:
- 若線性表需要頻繁查找,很少進行插入和删除操作時,宜采用順序存儲結構。若需要頻繁插入和删除時,宜采用單連結清單結構。
- 當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單連結清單結構,這樣可以不需要考慮存儲空間的大小問題。而如果事先知道線性表的大緻長度,用順序存儲結構效率會高很多。
順序表裡面元素的位址是連續的,連結清單裡面節點的位址不是連續的,是通過指針連起來的。
順序存儲:
順序存儲的優點:
- 無須為表示表中元素之間的邏輯關系而增加額外的存儲空間。
- 可以快速地存取表中任意位置地元素
順序存儲的缺點:
- 插入和删除操作需要移動大量元素
- 當線性表長度變化較大時,難以确定存儲空間的容量
- 容易造成存儲空間的”碎片“
鍊式存儲:
比起順序存儲結構每個資料元素隻需要存儲一個位置就可以。現在鍊式存儲結構中,除了要存儲資料元素資訊外,還要存儲它的後繼元素的存儲位址(指針)。把存儲資料元素資訊的域稱為資料域,把存儲直接後繼位置的域稱為指針域。指針域中存儲的資訊稱為指針或鍊。這兩部分資訊組成資料元素稱為存儲映像,稱為節點(Node)。
連結清單的每個節點中隻包含一個指針域,則稱為單連結清單。
頭指針和頭結點
頭指針是指連結清單指向第一個節點的指針,若連結清單有頭節點,則是指向頭結點的指針。頭指針具有表示作用,是以常用頭指針冠以連結清單的名字。無論連結清單是否為空,頭指針均不為空。頭指針是連結清單的必要元素。
上圖中的頭結點可以存在也可以不存在,但是頭指針必須有。
頭結點是為了操作的統一和友善而設立的,放在第一個元素的節點之前,其資料域一般無意義通常為空,但是指針域指向第一個元素。有了頭結點,對在第一進制素節點前插入結點和删除第一結點起操作與其它結點的操作就統一了。頭結點不一定是連結清單的必要元素。
單連結清單的建立
單連結清單和順序存儲結構不一樣,他不像順序存儲結構資料那麼集中,它的資料可以是分散在記憶體各個角落的,它的增長也是動态的。對于每個連結清單來說,它所占用空間的大小和位置是不需要預先配置設定劃定的,可以根據系統的情況和實際的需求即時生成。
頭插法:
頭插法從一個空表開始,生成新結點,讀取資料存放到新結點的資料域中,然後獎新結點插入到目前連結清單的表頭上,直到結束為止。
簡單來說,就是把新加進的元素放在表頭後的第一個位置:
- 先讓新節點的next指向頭節點之後
-
然後讓表頭的next指向新節點
用現實環境模拟的話就是插隊的方法,始終讓新節點插在第一的位置上。
靜态連結清單
對于線性連結清單,也可用一維數組來進行描述。這種描述方法便于在沒有指針類型的進階程式設計語言中使用連結清單結構。用數組描述的連結清單,即稱為靜态連結清單。
這種存儲結構,仍需要預先配置設定一個較大的空間,但在作為線性表的插入和删除操作時不需移動元素,僅需修改指針,故仍具有鍊式存儲結構的主要優點。其實和順序存儲結構類似來配置設定空間,插入元素時,元素依次放在後面,但是插入的元素的遊标域要根據插入位置來改變。
假如有如上的靜态連結清單S中存儲着線性表(a,b,c,d,f,g,h,i),Maxsize=11,如圖所示,要在第四個元素後插入元素e,方法是:先在目前表尾加入一個元素e,即:S[9].data = e;然後修改第四個元素的遊标域,将e插入到連結清單中,即:S[9].cursor = S[4].cursor; S[4].cursor = 9;,接着,若要删除第7個元素h,則先順着遊标鍊通過計數找到第7個元素存儲位置6,删除的具體做法是令S[6].cursor = S[7].cursor。
關于靜态連結清單:
- 我們對數組的第一個和最後一個元素做特殊處理,他們的data不存放資料。
- 我們通常把未使用的數組元素稱為備用連結清單。
- 數組的第一個元素,即下标為0的哪個元素的cur(遊标)就存放備用連結清單的第一個結點的下标。
- 數組的最後一個元素,即下标為MAXSIZE-1的cur則存放第一個有數值的元素的下标,相當于單連結清單中的頭結點作用。