資料結構之線性表一順序表

2021-07-24 16:19:38 字數 2938 閱讀 4267

線性表(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...