線性表是最常用且最簡單的一種線性結構。
線性結構的特點是:在資料元素的非空有限集中,①存在唯一的乙個被稱作「第乙個」的資料元素。②存在唯一的乙個被稱作「最後乙個」的元素。③除第乙個以外,集合中的每個資料元素都只有乙個前驅。④除了最後乙個以外,集合中的每個元素都只有乙個後繼。簡單總結就是,有頭有尾,中間元素有唯一的前驅與後繼,這樣的資料結構便是線性結構。線性結構是有序的。
抽象資料型別線性表定義如下:
adt list
關係:r=
對資料的操作:
構造,析構;
//平凡操作 (trivial)
t&getitem
(int idx)
: 找到第idx個元素, 返回其引⽤.
void
(t d)
: 將新資料元素d新增到表的最後
intlocateitem
(t d,
bool
compare()
): 在表中從頭開始查詢第⼀個滿⾜compare
()函式的下標.不存在則返回-
1.void
insertbefore
(t d,
int idx)
: 在第idx個元素前插⼊⼀個元素d.
t deleteitem
(int idx)
: 刪除第idx個元素. 返回該元素
intsize()
: 計算表中有多少個元素.
void
printall()
: 按序列印表中所有元素.
};
以連續記憶體⽅式實現線性表的時間複雜度分析:
以連續記憶體⽅式實現線性表的優缺點
為了解決順序表示的這種缺點,便產生了鏈式儲存結構,即以鍊錶的形式實現線性表。
線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素(這組儲存單元可以是連續的,也可以是不連續的)。因此,為了表示每個資料元素ai 與其直接後繼資料元素 ai+1 之間的邏輯關係,對資料元素 ai來說,除了儲存其本身的資訊之外,還需要儲存乙個指示其直接後繼的資訊(即直接後繼的儲存位置)。這兩部分資訊組成資料元素 ai 的儲存映像,稱為結點( node)。它包括兩個域:其中儲存資料元素資訊的域稱為資料域;儲存直接後繼儲存位置的域稱為指標域。指標域中儲存的資訊稱作指標或者鏈。 n 個結點(ai ( 1 ≤i≤n )的儲存映像)鏈結成乙個鍊錶,即為線性表因為資料元素不再在記憶體中按順序儲存,為了表示每個資料元素之間的關係,在結點中設定了乙個指標指向該元素的直接後繼。鍊錶的訪問從頭開始,利用指標進行線性表的遍歷。( a1 , a2 , … , an )
的鏈式儲存結構。又由於此鍊錶的每個結點中只包含乙個指標域,故又稱為線性鍊錶或者單鏈表。
這個鍊錶的訪問必須從頭指標開始進行,頭指標指示鍊錶中第乙個結點(即第乙個資料元素的儲存映像)的儲存位置。線性鍊錶中最後乙個結點的指標為「空」( null )。
用線性鍊錶表示線性表時,資料元素之間的邏輯關係是由結點中的指標指示的。換句話說,指標為資料元素之間的邏輯關係得映像,則邏輯上相鄰的兩個資料元素其儲存的物理位置不要求緊鄰,由此,這種儲存結構為非順序映像或者鏈式映像。
鍊錶的每個節點中只包含乙個指標域的被稱為線性鍊錶或單鏈表。
單向鍊錶的節點結構:
struct node
通過頭指標就可以將整個線性表資料依次遍歷:
node *head;
for(node *p = head; p!=
null
; p = p-
>next)
p->data;
// do something
可以在單鏈表的第乙個結點之前附設乙個結點,稱之為頭結點。頭結點的資料域可以不儲存任何資訊,也可以儲存如線性表的長度等類的附加資訊,頭結點的指標域儲存指向第乙個結點的指標(即第乙個元素結點的儲存位置)。單鏈表是非隨機訪問的儲存結構。單鏈表和順序儲存結構不同,它是一種動態結構。
void
(list& list, elemtype d)
//找到指向最後⼀個節點的指標
while
(t->next !=
null
) t = t-
>next;
t->next =
newelemtype
(d);
}
getitem(…)
push_front / insert_front(…)
pop_front / remove_front(…)
pop_back / remove_back(…)
insertbeforeitem(…)
remove(…)
printall(…)
迴圈鍊錶( circular linked list)是另一種形式的鏈式儲存結構。它的特點是表中最後乙個結點的指標域指向頭結點,這個鍊錶形成乙個環。在單鏈表中, nextelem 的執行時間為 o( 1 ),而 priorelem 的執行時間為 o( n )。為克服單鏈表這種單向性的缺點,可利用雙向鍊錶( double linked list )。迴圈鍊錶的操作和線性表基本一致,差別僅在於演算法的迴圈條件不是 p 或者 p->next是否為空,而是它們是否等於頭指標。但有的時候,若在迴圈鍊錶中設立尾指標而不設頭指標,可使某些操作簡化。
在雙向鍊錶的結點中有兩個指標域,其一指向直接後繼,另乙個指向直接前驅。
struct node
;
struct doublelinklist
;
線性表學習總結
作用 線性表中在邏輯結構上相鄰的資料元素儲存在相鄰的物理儲存單元中,即通過資料元素物理儲存的相鄰關係來反映資料元素之間邏輯上的相鄰關係。順序儲存的實現 一維陣列儲存順序表中的資料 const int maxsize 100 template class seqlist 析構函式為空 int leng...
鏈式線性表和順序線性表
在這裡插入 片 線性表的儲存結構 typedef struct seqlist typedef struct seqlist 順序表基本操作 初始化順序表在這裡插入 片 intseqlist init seqlist list,int size 插入資料元素在這裡插入 片 intseqlist in...
線性表演算法題庫 線性表習題
鍊錶。若指標p指向某結點時,能夠根據該指標找到其直接後繼,能夠順後繼指標鏈找到p結點後的結點。但是由於不知道其頭指標,所以無法訪問到p指標指向的結點的直接前趨。因此無法刪去該結點。2.雙鏈表。由於這樣的鍊錶提供雙向指標,根據p結點的前趨指標和後繼指標可以查詢到其直接前趨和直接後繼,從而可以刪除該結點...