資料結構 線性表之陣列

2021-10-12 13:04:13 字數 1625 閱讀 4536

什麼叫陣列:

陣列(array)是一種線性表資料結構。它是一組連續的記憶體空間,來儲存一組具有相同型別的資料。

什麼線性表跟非線性表:

線性表:通俗一點就是資料像一條線一樣排成的結構,線性表上的資料只有前後兩個方向,另外像鍊錶,佇列,棧等也是線性表的資料結構。

非線性表:像二叉樹,圖,堆等,資料之間不只是前後的關係。

陣列是連續的記憶體空間和相同型別的資料。這讓它有著高效地隨機訪問和低效地刪除跟新增資料。為了保證連續性,就需要大量地資料搬移,效率就很差。

高效地資料訪問是如何做到的?

比如我們申請了乙個長度為10的int型的陣列,(說到這兒,陣列的長度是指存放線性表的儲存空間的長度,線性表的長度指的是線性表中資料元素的個數),那麼計算機分配了一塊連續的記憶體,假設1000~1038,記憶體的首位址1000。那麼計算機通過位址來訪問記憶體中的資料,a[i] = 1000 + i*4,4是陣列中每個元素的大小。

低效地插入與刪除:

插入:為了保證記憶體資料的連續性,將乙個資料插入到第k位置的大小為n的陣列中,那麼k~n的元素都要順序地往後移動,最好的時間複雜度為1,最壞為n,平均為o(n)。

改進:如果乙個陣列儲存的元素並不是有序的,只是簡單的用來儲存元素,那麼可以將新的元素放在k的位置,原來的元素放到最後。

刪除:刪除也需要搬資料,不然記憶體**現空洞導致不連續。最好時間複雜度1,最壞為n,平均為n。

陣列越界

int main(int argc, char* ar**)

; for(; i<=3; i++)

return 0;

}

因為,陣列大小為 3,a[0],a[1],a[2],而我們的**因為書寫錯誤,導致 for 迴圈的結束條件錯寫為了 i<=3 而非 i<3,所以當 i=3 時,陣列 a[3]訪問越界。

我們知道,在 c 語言中,只要不是訪問受限的記憶體,所有的記憶體空間都是可以自由訪問的。根據我們前面講的陣列定址公式,a[3]也會被定位到某塊不屬於陣列的記憶體位址上,而這個位址正好是儲存變數 i 的記憶體位址,那麼 a[3]=0 就相當於 i=0,所以就會導致**無限迴圈。陣列越界在 c 語言中是一種未決行為,並沒有規定陣列訪問越界時編譯器應該如何處理。

因為,訪問陣列的本質就是訪問一段連續記憶體,只要陣列通過偏移計算得到的記憶體位址是可用的,那麼程式就可能不會報任何錯誤。

int i = 0;

int j = 0;

int y = 0;

int arr[3] = ;

qdebug() << &i;

qdebug() << &j;

qdebug() << &y;

qdebug() << &arr[0];

qdebug() << &arr[1];

qdebug() << &arr[2];

0x70fdac

0x70fda8

0x70fda4

0x70fd98

0x70fd9c

0x70fda0

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...