線性表(list):零個或多個資料元素的有限序列。
首先,它是乙個序列,也就是說,元素之間是有順序的,若元素存在多個,則第乙個元素無前驅,最後乙個元素無後繼,其他每個元素都有且只有乙個前驅和後繼。
其次,線性表是有限的。
一、基本概念
線性表(
list
):由零個或多個資料元素組成的有限序列。
注意:1.
線性表是乙個序列。
2.0個元素構成的線性表是空表。
3.線性表中的第乙個元素無前驅,最後乙個元素無後繼,其他元素有且只有乙個前驅和後繼。
4.線性表是有長度的,其長度就是元素個數,且線性表的元素個數是有限的,也就是說,線性表的長度是有限的。
如果用數學語言來進行定義,可如下:
若將線性表記為(
a1,…,ai-1,ai,ai+1,…an),
則表中ai-1
領先於ai,ai
領先於ai+1,
稱ai-1是ai
的直接前驅元素
,ai+1是ai
的直接後繼元素。如下圖所示:
在複雜的線性表中,乙個資料元素可以由若干個資料項組成。
二、線性表的抽象資料型別
線性表的抽象資料型別定義如下:
adt線性表
(list)
data
operation
initlist(*l):
初始化操作,建立乙個空的線性表l。
listempty(l):
若線性表為空,返回
true
,否則返回
false
。clearlist(*l):
將線性表清空。
getelem(l,i,*e):
將線性表
l中的第
i個位置元素值返回給e。
locateelem(l,e):
l中查詢與給定值
e相等的元素,如果查詢成功,返回該元素在表中序號表示成功;否則,返回
0表示失敗。
listdelete(*l,i,*e):刪除線性表中第i個位置元素,並用e返回其值。
listlength(l):返回線性表l的元素個數
endadt
對於不同的應用,線性表的基本操作是不同的,上述操作是最基本的。
對於實際問題中涉及的關於線性表的更複雜操作,完全可以用這些基本操作的組合來實現。
線性表是線性結構的一種,那麼線性表當然也有物理結構,也就是說,線性表有兩種,分別是順序結構的線性表(叫做順序表)和鏈式結構的線性表(叫做鍊錶)。
順序表是指順序儲存結構的線性表,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。
順序表表現在物理記憶體中,也就是物理上的儲存方式,事實上就是在記憶體中找個初始位址,然後通過佔位的形式,把一定的記憶體空間給佔了,然後把相同資料型別的資料元素依次放在這塊空地中。注意,這塊物理記憶體的位址空間是連續的。
順序表的結構體定義
#define maxsize 20 // 順序表的最大儲存容量通過上面用結構體定義順序表,我們可以看出順序表的封裝需要三個屬性:typedef int elemtype; // 順序表儲存的資料型別
typedef struct sqlist;
1.儲存空間的起始位置。陣列data的儲存位置就是線性表儲存空間的儲存位置
2.線性表的最大儲存容量。陣列長度maxsize
3.線性表的當前長度。length
注意:陣列的長度與線性表的當前長度是不一樣的。陣列的長度是存放線性表的儲存空間的總長度,一般初始化後不變。而線性表的當前長度是線性表中元素的個數,是會改變的。
順序表查詢元素操作
**實現:
順序表插入元素操作
思路如下:
1.如果插入位置不合理,丟擲異常;
2.如果線性表長度大於等於陣列長度,則丟擲異常或動態增加陣列容量;
3.從最後乙個元素開始向前遍歷到第i個位置,分別將它們都向後移動乙個位置;
4.將要插入元素填入位置i處;
5.線性表長+1。
**實現:
順序表刪除元素操作
思路如下:
1.如果刪除元素的位置不合理,丟擲異常。比如使用者刪除第0個位置的元素(線性表是從1開始的)、刪除元素的位置大於線性表的長度也要丟擲異常。
2.刪除第i個位置的元素。
3.把第i個位置的元素後面的所有的元素的位置加一。
4.線性表長度減一。
**實現:
由以上**可以看出:
線性表的順序儲存結構,在存、讀取資料時,不管是在哪個位置,時間複雜度都是o(1)。而在插入或者刪除時,時間複雜度都是o(n)。
這也就是線性表的順序儲存結構比較適合訪問資料,不適合經常插入和刪除資料的應用。
優點:1.無需為了表示表中元素之間的邏輯關係而增加額外的儲存空間(相對於鏈式儲存而言)。
2.可以快速的訪問表中任意位置的元素。
缺點:1.插入和刪除操作需要移動大量的元素。
2.當線性表長度變化較大時,難以確定儲存空間的容量。
3.容易造成儲存空間的「碎片」(因為線性表的順序儲存結構申請的記憶體空間都以連續的,如果因為某些操作(比如刪除操作)導致某個部分出現了一小塊的不連續記憶體空間,因為這一小塊記憶體空間太小不能夠再次被利用/分配,那麼就造成了記憶體浪費,也就是「碎片」)
ps:windows系統有磁碟碎片整理工具,而linux系統沒有,因為linux系統核心優化的很好,幾乎是沒有磁碟碎片的。
資料結構線性表之順序表
純手打順序表相關操作,包括順序表的建立 初始化 輸出 插入 刪除 銷毀等,僅供自己回顧使用,可能會有不對的或者不恰當的地方望大家指正,共同學習。如下 資料結構順序表 include include include define maxsize 100 using namespace std type...
資料結構 線性表之順序表
線性表是包含若干資料元素的乙個線性序列 記為 l a0,ai 1,ai,ai 1 an 1 l為表名,ai 0 i n 1 為資料元素 n為表長,n 0 時,線性表l為非空表,否則為空表。線性表l可用二元組形式描述 l d,r 即線性表l包含資料元素集合d和關係集合r d r 關係符在這裡稱為有序對...
mysql 線性表 資料結構 線性表之順序線性表
public class sequencelist else stringbuilder sb new stringbuilder for int i 0 i size i int len sb.length public class sequencelisttest public static v...