mysql 線性表_數據結構之線性表

概要

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

線性表

定義

線性表(List):零個或多個數據元素的有限序列。

若將線性表記為 \((a_1, \cdots, a_{i-1}, a_i, a_{i+1}, \cdots, a_n)\),則表中 \(a_{i-1}\) 領先于 \(a_i\),\(a_i\) 領先于 \(a_{i+1}\),稱 \(a_{i-1}\) 是 \(a_i\) 的直接前驅元素,\(a_{i+1}\) 是 \(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 或 “^” 符號來表示)。

有時,為了更加方便地對鏈表進行操作,會在單鏈表的第一個結點前附設一個結點,稱為頭結點。頭結點的數據域可以不存儲任何信息,也可以存儲如線性表的長度等附加信息,頭結點的指針域存儲指向第一個結點的指針,如圖

635104ff6feac4ca06248011b7a90fd5.png

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

頭指針:

頭指針是指鏈表指向第一個結點的指針,若鏈表有頭結點,則是指向頭結點的指針

頭指針具有標識作用,所以常用頭指針冠以鏈表的名字

無論鏈表是否為空,頭指針均不為空。頭指針是鏈表的必要元素

頭結點

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

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

頭結點不一定是鏈表必須要素

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

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

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_{i+1}\) 的指針。也就是說,如果 \(p->data = a_i\),那么 \(p->next->data = a_{i+1}\).

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

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

7cca8f2171450bdbe3565689da8a56ee.png

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

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

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

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542764.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542764.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542764.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用JavaScript修改瀏覽器URL地址欄的實現代碼

現在的瀏覽器里,有一個十分有趣的功能,你可以在不刷新頁面的情況下修改瀏覽器URL;在瀏覽過程中.你可以將瀏覽歷史儲存起來,當你在瀏覽器點擊后退按鈕的時候,你可以沖瀏覽歷史上獲得回退的信息,這聽起來并不復雜,是可以…

ruby array_在Ruby中使用Array.pop和Array.shift方法從Array中刪除元素

ruby arrayRuby Array.pop和Array.shift方法 (Ruby Array.pop and Array.shift methods) If you are reading an article that is related to deleting elements from the instance of Array class then it is expected from you that you are aware of the basic things relat…

python語言百分號的含義_python中百分號意思的是什么

python中百分號意思的是什么 發布時間:2020-07-09 16:38:13 來源:億速云 閱讀:158 python中百分號意思的是什么?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有…

MATLAB學習——矩陣

矩陣矩陣運算算術運算基本算術運算點運算關系運算邏輯運算元素處理取整取模和取余矩陣分析與處理矩陣行列式、秩與跡、特征值分析矩陣的逆與線性方程組求解矩陣的分解與變換矩陣運算 算術運算 基本算術運算 #檢查矩陣階數[n,m] size(A),l length(A) A [1 2;3 4] B [1 1;…

sqldeveloper mysql遷移_通過SQL Developer工具將MySQL數據庫內容遷移至Oracle的步驟

通過SQL Developer工具將MySQL數據庫內容遷移至Oracle的步驟發布時間:2020-06-08 15:52:18來源:51CTO閱讀:210作者:三月本篇文章給大家主要講的是關于通過SQL Developer工具將MySQL數據庫內容遷移至Oracle的步驟的內容&#xff0c…

未能成功加載擴展程序_【JAVA虛擬機(JVM)精髓】09-幾種不同的類加載器

持續更新JVM相關知識,敬請關注:Java虛擬機精髓專欄?zhuanlan.zhihu.com上一節說了下類加載器和類加載過程。這一節我們看下幾種不同的類加載器。JVM支持的類加載器有兩類,分別是引導類加載器和自定義加載器。這里的自定義自定義加載器&#…

Oracle .事物,提交,回滾

事物(transaction) -->作為單個邏輯工作單元執行的一系列操作(要么全部成功要么全部失敗) 提交(commit) -->系列操作全部成功的場合才會執行 回滾(rollback) -->系列操作其…

perl 哈希數組的哈希_第一個元素使用哈希在數組中出現K次

perl 哈希數組的哈希Prerequisite: Hashing data structure 先決條件: 哈希數據結構 Problem statement: 問題陳述: Find the first element occurring K times in the array. 查找數組中出現K次的第一個元素。 Example: 例: Input array…

圖片md5修改工具_如何修改視頻和圖片的MD5,用電腦自帶的命令

首先說下,md5到底是啥,它是一段固定長度的數據。無論原始數據是多長或多短,其MD5值都是128bit。另外md5是確定性,一個原始數據的MD5值是唯一的,同一個原始數據不可能會計算出多個不同的MD5值;類似人類的身份…

iOS - UISearchController

前言 NS_CLASS_DEPRECATED_IOS(3_0, 8_0, "UISearchDisplayController has been replaced with UISearchController")interface UISearchDisplayController : NSObjectavailable(iOS, introduced3.0, deprecated8.0, message"UISearchDisplayController has bee…

浮點數轉換為整數四舍五入_定義宏以將浮點值四舍五入為C中最接近的整數

浮點數轉換為整數四舍五入Given a float value and we have to round the value to the nearest integer with the help of Macro in C language. 給定一個浮點值,我們必須借助C語言中的Macro將其舍入到最接近的整數。 Macro Definition: 宏定義: #def…

c語言遍歷文件內容_C語言學習第28篇---動態內存分配剖析

為什么C語言要動態分配內存的意義?1.C語言中的一切操作都是基于內存的2.變量和數組都是內存的別名---內存分配由編譯器在編譯期間決定的---定義數組的時候必須指定數組長度---數組長度是在編譯期就必須確定的需求:程序運行的過程中,可能需要使…

重啟mysql的命令 linux_linux重啟mysql命令

如何啟動/停止/重啟MySQL一、 啟動方式1、使用 service 啟動:service mysqld start2、使用 mysqld 腳本啟動:/etc/inint.d/mysqld start3、使用 safe_mysqld 啟動:safe_mysqld&二、停止1、使用 service 啟動:service mysqld s…

tomcat 多項目多HOST配置

一、場景&#xff1a;使用一個tomcat部署多個項目&#xff0c;并且分別使用不同域名進行訪問。二、詳細配置tomcat/conf/server.xml 中寫<Engine name"Catalina" defaultHost"localhost">***********************************<Host name"biz…

javascript原型_使用JavaScript的示例報告卡Web應用程序原型

javascript原型Hi! At times, beginners always find it hard getting the application of the theory they learn In programming or a particular language. 嗨&#xff01; 有時&#xff0c;初學者總是很??難在編程或特定語言中應用他們學到的理論。 In this article, we…

vb.net cad 塊表最后的實體_21個繪圖命令+7個技巧,3分鐘讓你成為CAD高手

繪制圖紙需要用到CAD&#xff0c;CAD制圖在生活中也是廣泛運用&#xff0c;那么學習CAD到底難不難呢&#xff1f;在這里要告訴CAD新手們&#xff0c;世上無難事&#xff0c;可以用3分鐘讓你成為CAD高手。21個繪圖命令A&#xff1a;繪圓弧B&#xff1a;定義塊C&#xff1a;畫圓D…

本地tomcat啟動war包_「shell腳本」懶人運維之自動升級tomcat應用(war包)

準備&#xff1a;提前修改war包里的相關配置&#xff0c;并上傳到服務器&#xff1b;根據要自動升級的tomcat應用修改或添加腳本相關內容&#xff1b;tomcat啟動腳本如是自己寫的&#xff0c;要統一格式命名&#xff0c;如&#xff1a;xxx、xxxTomcat 等&#xff1b;拿到生產使…

python將txt轉為字符串_python做第一只小爬蟲

“受盡苦難而不厭&#xff0c;此乃修羅之路”本文技術含量過低&#xff0c;請謹慎觀看之前用R語言的Rcurl包做過爬蟲&#xff0c;給自己的第一感覺是比較費勁&#xff0c;看著看著發際線就愈加亮眼&#xff0c;最后果斷丟之。不過好的是和python爬取原理基本一致&#xff0c;且…

c#查找列表指定元素的索引_在集合的指定索引處插入元素 在C#中

c#查找列表指定元素的索引Given a Collection<T> of Integer and we have to insert an element at given index. 給定Integer的Collection <T>&#xff0c;我們必須在給定的索引處插入一個元素。 To insert an element in Collection<T>, we use Insert() …

跨域技術(JSONP與CROS)

JSONP 我們發現&#xff0c;Web頁面上調用js文件時不受是否跨域的影響&#xff0c;凡是擁有"src"這個屬性的標簽都擁有跨域的能力&#xff0c;比如<script>、<img>、<iframe>。那就是說如果要跨域訪問數據&#xff0c;就服務端只能把數據放在js格式…