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

2021-10-17 23:24:01 字數 2948 閱讀 8224

概要

參考《大話資料結構》,把常用的基本資料結構梳理一下。

線性表定義

線性表(list):零個或多個資料元素的有限序列。

若將線性表記為 \((a_1, \cdots, a_, a_i, a_, \cdots, a_n)\),則表中 \(a_\) 領先於 \(a_i\),\(a_i\) 領先於 \(a_\),稱 \(a_\) 是 \(a_i\) 的直接前驅元素,\(a_\) 是 \(a_i\) 的直接後繼元素。線性表的元素個數 \(n\) 定義為線性表的長度,當 \(n=0\) 時,稱為空表。

線性表的順序儲存結構

線性表的順序儲存結構就是在記憶體中找了塊地兒,通過佔位的形式,把一定的記憶體空間給佔了,然後把相同資料型別的資料元素依次存放在這塊空地中。因此可以用一維陣列來實現順序儲存結構,即把第乙個資料元素存到陣列下標為 \(0\) 的位置中,接著把線性表相鄰的元素儲存在陣列中相鄰的位置。

來看看線性表的順序儲存結構的**。

# define maxsize 20 //儲存空間初始分配量

typedef int elemtype; // elemtype 型別根據實際情況而定,這裡假設為 int

typedef struct

elemtype data[maxsize]; // 陣列儲存資料元素,最大值為 maxsize

int length; // 線性表當前長度

}sqlist;

這裡注意描述順序儲存結構需要三個屬性:

儲存空間的起始位置:陣列 data,它的儲存位置就是儲存空間的儲存位置

線性表的最大儲存容量:陣列長度 maxsize(注意不等於線性表的長度)。

線性表的當前長度:length.

線性表順序儲存結構的優缺點

線性表的順序儲存結構,在存、讀資料時,不管是哪個位置,時間複雜度都是 \(o(1)\);而插入或刪除時,時間複雜度都是 \(o(n)\). 這就說明它比較適合元素個數不太變化,而更多是訪問資料的應用。優缺點總結如下:

優點:無須為表示表中元素之間的邏輯關係而增加額外的儲存空間

可以快速地訪問表中任一位置的元素

缺點:插入和刪除操作需要移動大量元素

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

造成儲存空間的 「碎片」

線性表的鏈式儲存結構

在鏈式結構中,除了要存資料元素資訊外,還要儲存它的直接後繼元素的儲存位址,我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱做指標或鏈。這兩部分資訊組成資料元素 \(a_i\) 的儲存映像,稱為結點。\(n\) 個結點鏈結成乙個鍊錶,即為線性表 \((a_1, a_2, \cdots, a_n)\) 的鏈式儲存結構*,因為此鍊錶的每個結點只包含乙個指標域,所以叫做單鏈表**。

對於線性表來說,總得有個頭有個尾,我們把鍊錶中第乙個結點的儲存位置叫做頭指標,那麼整個鍊錶的訪問就必須是從頭指標開始進行了。之後的每乙個結點,其實就是上乙個後繼指標指向的位置。最後乙個結點的指標為「空」(通常用 null 或 「^」 符號來表示)。

有時,為了更加方便地對鍊錶進行操作,會在單鏈表的第乙個結點前附設乙個結點,稱為頭結點。頭結點的資料域可以不儲存任何資訊,也可以儲存如線性表的長度等附加資訊,頭結點的指標域儲存指向第乙個結點的指標,如圖

注意頭指標與頭結點的異同點:

頭指標:

頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標

頭指標具有標識作用,所以常用頭指標冠以鍊錶的名字

無論鍊錶是否為空,頭指標均不為空。頭指標是鍊錶的必要元素

頭結點頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其資料域一般無意義(也可存放鍊錶的長度)

有了頭結點,對在第一元素結點前插入結點和刪除第一結點,其操作與其它結點的操作就統一了

頭結點不一定是鍊錶必須要素

來看看線性表的鏈式儲存結構的**。

// 線性表的單鏈表儲存結構

typedef struct node

elemtype data;

struct node *next;

}node;

typedef struct node *linklist; // 定義 linklist

從這個結構定義中,我們也就知道,結點由存放資料元素的資料域存放後繼結點位址的指標域組成。假設 \(p\) 是指向線性表第 \(i\) 個元素的指標,則該結點 \(a_i\) 的資料域我們可以用 \(p->data\) 來表示,\(p->data\) 的值是乙個資料元素,結點 \(a_i\) 的指標域可以用 \(p->next\) 來表示,\(p->next\) 的值是乙個指標,指向第 \(i+1\) 個元素,即指向 \(a_\) 的指標。也就是說,如果 \(p->data = a_i\),那麼 \(p->next->data = a_\).

單鏈表結構與順序儲存結構優缺點

簡單地對單鏈表結構和順序結構做對比:

通過上面的對比,我們可以得出一些經驗性的結論

若線性表需要頻繁查詢,很少進行插入和刪除操作時,宜採用順序儲存結構。若需要頻繁插入和刪除時,宜採用單鏈表結構。

當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構,這樣可以不需要考慮儲存空間的大小問題。如果事先知道線性表的大致長度,比如一年 12 個月,一周就是 7 天,這種用順序儲存結構效率會好很多

總之,線性表的儲存結構和單鏈表結構各有優缺點,視實際情況而定。

最後簡單說一下靜態鍊錶。靜態鍊錶是用陣列描述的鍊錶,我們讓陣列的元素都是由兩個數域組成, data 和 cur. 也就是說,陣列的每個下標都對應乙個 data 和下乙個 cur. 資料域 data,用來存放資料元素,也就是通常我們要處理的資料;而游標 cur 相當於單鏈表中的 next 指標,存放該元素的後繼在陣列中的下標。所以它還有個別名:游標實現法。它有單鏈表的插入和刪除操作效能,但是沒有解決連續儲存分配帶來的表長難以確定的問題,而且失去了順序儲存結構隨機訪問的特性。

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

資料結構之線性表

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

資料結構之線性表

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