資料結構之線性表

2021-10-09 15:06:04 字數 3780 閱讀 2836

線性表

線性表(list)的定義:

由零個或多個資料元素組成的有限序列。

數學語言來進行定義:

若將線性表記為(a1,…,ai-1,ai,ai+1,…an),則表中ai-1領先於ai,ai領先於ai+1,稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素。

所以線性表元素的個數n(n>=0)定義為線性表的長度,當n=0時,稱為空表。

強調幾個關鍵的地方:

首先它是乙個序列,也就是說元素之間是有個先來後到,前後順序的;

若元素存在多個,則第乙個元素無前驅,而最後乙個元素無後繼,其他元素都有且只有乙個前驅和後繼;

線性表元素是有限的,事實上無論計算機發展到多強大,它所處理的元素都是有限的。

抽象資料型別

抽象資料型別(abstract data type,adt),定義:

乙個數學模型及定義在該模型上的一組操作。抽象資料型別的定義僅取決於它的一組邏輯特性,而與其在計算機內部如何表示和實現無關。

比如1+1=2這樣乙個操作:

在不同cpu的處理上可能不一樣,但由於其定義的數學特性相同。所以在計算機程式設計者看來,它們都是相同的。

抽象資料型別不僅僅指那些已經定義並實現的資料型別,還可以是計算機程式設計者在設計軟體程式時自己定義的資料型別。比如,乙個3d遊戲中,要定位角色的位置,那麼總會出現x,y,z三個整型資料組合在一起的座標。我們就可以定義乙個point的抽象資料型別,它擁有x,y,z三個整型變數。好處就是:將角色的位置操作轉換為可控的數學描述為了便於在之後的講解中對抽象資料型別進行規範的描述。

描述抽象資料型別的標準格式:

adt 抽象資料型別名

data

資料元素之間邏輯關係的定義

operation

操作endadt

那麼線性表對應的抽象資料型別如下:

data:

線性表的資料物件集合為,每個元素的型別均為datatype。

其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素。

除了最後乙個元素an外,每乙個元素有且只有乙個直接後繼元素。

資料元素之間的關係是一對一的關係。

operation:

initlist(*l): 初始化操作,建立乙個空的線性表l。

listempty(l): 判斷線性表是否為空表,若線性表為空,返回true,否則返回false。

clearlist(*l): 將線性表清空。

getelem(l,i,*e): 將線性表l中的第i個位置元素值返回給e。

listdelete(*l,i,*e): 刪除線性表l中第i個位置元素,並用e返回其值。

listlength(l): 返回線性表l的元素個數。

對於不同的應用,線性表的基本操作是不同的。

上述操作是最基本的,對於實際問題中涉及的關於線性表的更複雜操作。

完全可以用這些基本操作的組合來實現。

示例:比如要實現兩個線性表a、b的並集操作,即要使得集合:a=a∪b,說白了就是把存在集合b中,但不存在集合a中的元素,插入到a中即可。

思路:迴圈遍歷集合b中的每乙個元素,判斷當前元素是否存在a中,若不存在,則插入a中即可。

**:

//la表示a集合,lb表示b集合

// union代表並集,l代表線性表

void

unionl

(list *la, list lb)

// list *la 帶指標,list lb不帶

}}

線性表有兩種物理儲存結構:順序儲存結構和鏈式儲存結構

順序儲存結構

用一段位址連續的儲存單元依次儲存線性表的資料元素,物理結構上就是陣列的儲存方式,先在記憶體中找個初始位址,然後通過佔位的形式。把一定的記憶體空間給佔了,然後把相同資料型別的資料元素依次放在這塊空地中。

#define maxsize 20    

//線性表的最大儲存容量:陣列的長度

typedef

int elemtype;

typedef

struct

sqlist;

這裡封裝了乙個結構體,事實上就是對陣列進行封裝,增加了個當前長度的變數而已。要注意的是,陣列的長度是存放線性表的儲存空間的總長度,一般初始化後不變。而線性表的當前長度是線性表中元素的個數,是會變化的。

線性表的順序儲存結構,在存、讀資料時,不管是哪個位置,時間複雜度都是o(1)。而在插入或刪除時,時間複雜度都是o(n)。說明它比較適合元素個數比較穩定,不經常插入和刪除元素,而更多的操作是訪問資料的應用。

優點:

無需為表示表中元素之間的邏輯關係而增加額外的儲存空間;

以快速地訪問表中任意位置的元素。

缺點:

插入和刪除操作需要移動大量元素;

當線性表長度變化較大時,難以確定儲存空間的容量;

容易造成儲存空間的「碎片」。

鏈式儲存結構

順序儲存結構插入和刪除需要移動大量的元素是因為相鄰兩元素的儲存位置也具有鄰居關係,它們在記憶體中的位置是緊挨著的,中間沒有間隙,當然就無法快速插入和刪除。為解決這個問題,我們可以每個元素都用乙個位置來存放指向下乙個元素的位置的指標。這樣子從第乙個元素可以找到第二個元素,第二個元素可以找到第三個元素。依此類推,所有的元素我們就都可以通過遍歷而找到了。這樣前後元素就不是在相鄰的記憶體位置,如此一來就方便了插入和刪除元素的操作了。於是,就引出了鏈式儲存結構:

typedef

struct node

node;

typedef

struct node* linklist;

//結點由存放資料元素的資料域和存放後繼結點位址的指標域組成

無論是單鏈表在第i個位置插入還是刪除演算法,它們其實都是由兩個部分組成:第一部分就是遍歷查詢第i個元素;第二部分就是實現插入和刪除元素。從整個演算法來說,我們很容易可以推出它們的時間複雜度都是o(n)。

如果在我們不知道第i個元素的指標位置,單鏈表資料結構在插入和刪除操作上與線性表的順序儲存結構是沒有太大優勢的。但如果,我們希望從第i個位置開始,插入連續10個元素,對於順序儲存結構意味著,每一次插入都需要移動n-i個位置,所以每次都是o(n)。而單鏈表,我們只需要在第一次時,找到第i個位置的指標,此時為o(n),接下來只是簡單地通過賦值移動指標而已,時間複雜度都是o(1)。顯然,對於插入或刪除資料越頻繁的操作,單鏈表的效率優勢就越是明顯。

總結單鏈表結構和順序儲存結構優缺點(三個方面)

mysql 線性表 資料結構之線性表

概要 參考 大話資料結構 把常用的基本資料結構梳理一下。線性表定義 線性表 list 零個或多個資料元素的有限序列。若將線性表記為 a 1,cdots,a a i,a cdots,a n 則表中 a 領先於 a i a i 領先於 a 稱 a 是 a i 的直接前驅元素,a 是 a i 的直接後繼元...

資料結構之線性表

從現在開始,我們開始討論如何實現一些常用的資料結構和其中的一些經典演算法.等把資料結構講完了.我可能會繼續討論vc 的程式設計只是以及vs平台下的c c 開發等等.呵呵.我們進入正題吧.我在這裡就只實現線性表的連表結構.當然了,這裡實際上包含了好多知識.我希望大家在引用的時候.一定要領悟裡面的一些變...

資料結構之線性表

線性表是具有相同特性的資料元素的乙個有限序列。該序列中所含元素的個數叫做線性表的長度,用n表示,n 0。當n 0時,表示線性表是乙個空表,即表中不包含任何元素。設序列中第i i表示位序 個元素為ai 1 i n 線性表的一般表示為 a1,a2,ai,ai 1,an include include d...