數據結構簡介與特點

數據結構簡介與特點

線性表

基本操作:

  • 創建表
  • 求表長度
  • 查找元素
  • 輸入元素
  • 刪除元素
  • 便利元素

順序表

結構特點:

  • 採用一組地址連續的存儲單元來存儲數據;
  • 表的存儲容量長度不易改變;
  • 方便隨機查找;
  • 適用於頻繁訪問元素的應用;
  • 不適用於頻繁增刪元素的應用。

單鏈表

結構特點:

  • 採用指針鏈接一系列存儲單元來存儲數據;
  • 動態分配存儲空間;
  • 插入和刪除元素的效率很高
  • 查找元素的效率較低。

循環鏈表

結構特點:

  • 所有元素一次連接,尾部元素連接到首部元素
  • 適用於環形結構處理場合
  • 便於特定步長便利循環表元素

雙向循環鏈表

結構特點:

  • 每個元素擁有指向前後繼的指針。
  • 便於元素的逆向查找和遍歷。
  • 同時具備循環鏈表的所有優點。

靜態鏈表

結構特點:

  • 用數組空間建立一個類似鏈表的邏輯結構,爲數據元素增加一個標號成員來模擬鏈表元素的next指針。
  • 個方面性能與鏈表類似,插入、刪除開銷小,查找開銷大。
  • 一次性分配大塊空間,當鏈表動態分配節點時,只用從預先申請的空間中取一個節點即可,避免普遍鏈表頻繁申請及釋放內存時產生的開銷。
  • 靜態分配的大塊空間可以被多個靜態鏈表所共享,比靜態分配內存的順序表更加節約內存。

基本操作:

  • 創建棧
  • 入棧操作
  • 出棧操作
  • 查詢棧的長度
  • 判斷棧是否爲空
  • 遍歷棧
  • 情況棧
  • 銷燬棧

順序棧

結構特點:

  • 採用一組地址連續的存儲單元來存儲數據
  • 順序棧的存儲容量不易改變
  • 適用於後進先出的應用環境

鏈棧

結構特點:

  • 採用不連續的存儲單元來存儲數據
  • 鏈棧的存儲空間靈活
  • 適用於特定的後進先出應用環境

隊列

基本操作:

  • 創建隊列
  • 入隊操作
  • 出隊操作
  • 查詢隊列長度
  • 判斷隊列是否爲空
  • 便利隊列
  • 清空隊列
  • 銷燬隊列

順序隊列

結構特點:

隊列是一種先進選出的線性表,允許一端進行刪除,另一端進行插入。

  • 採用一組地址連續的存儲單元來存儲數據。
  • 順序隊列的容量不容易改變
  • 適於特定的先進先出類應用環境

鏈隊列

結構特點:

  • 採用不連續的存儲單元進行存儲數據
  • 鏈隊列的存儲容量較爲靈活
  • 適應特定的先進先出的應用環境

循環隊列

結構特點:

在隊列的順序存儲結構中,除了用一組地址連續的存儲單元依次存放從頭到尾的元素之外,還需要設置兩個指針域front和rear分別指向隊列的隊頭和隊尾元素位置。
假設順序隊列的長度爲N,當隊尾插入N個元素後,隊頭一次刪除N個元素後,隊列中元素的個數爲0,隊列爲空,但是由於順序隊列的性質,此隊列將無法繼續使用,那麼循環隊列就是試圖將這些空間利用起來,方式就是將順序隊列造成一個環的空間。循環隊列的空和滿的狀態都存在 front = rear。
判斷隊列是空還是滿的方法。

  • 設置另一個位置標記區別空和滿。
  • 少用一個存儲空間,約定front = rear.next 即爲滿。

基本操作:

  • 串的創建和存儲
  • 串的複製
  • 求串的長度
  • 串的比較
  • 求子串
  • 串的連接

串的定長存儲

定長順序存儲結構特點:

  • 採用一組地址連續的存儲單元來存儲數據
  • 串的存儲容量長度不易改變
  • 適用於串的長度固定,或串的長度較小,或串的長度變化較小的應用
  • 不適用與串的長度變化較大的應用

串的堆分配存儲

堆分配存儲:

  • 採用堆分配存儲結構動態的存儲數據
  • 串的存儲容量長度可以通過動態分配函數malloc()和free()改變,不會浪費內存,也不會出現串移除的情況。
  • 堆分配順序存儲結構對串的處理方便,操作中對串長度沒有任何限制

串的塊鏈存儲

分塊鏈表存儲:

  • 採用若干個大小相等的鏈表塊來存取數據
  • 結點的數據根據串的大小來決定
  • 串長不一定是結點的整數倍,鏈表的最後一個結點不一定被填滿
  • 適用於串長較大的應用
  • 串值得鏈式存儲結構佔用存儲量大且操作複雜

基本操作:

  • 創建樹
  • 取根結點
  • 取雙親結點值
  • 求樹的深度
  • 插入子樹
  • 刪除子樹
  • 求某結點長子
  • 求某結點下一個兄弟
  • 判斷樹是否爲空
  • 按層便利
  • 替換結點中的值
  • 銷燬樹

樹的雙親表示法

結構特點:

將樹在順序存儲的基礎上加上雙親域。

  • 採用一組地址連續的存儲單元來存儲數據
  • 求結點的孩子需要便遍歷整個結構

樹的孩子兄弟表示法

樹的孩子兄弟表示法,又稱爲樹的二叉鏈表存儲或二叉樹表示法,指將樹按照左孩子右兄弟的方式進行存儲,結點的左指針指向孩子結點,右指針指向下一個兄弟結點。

二叉樹

二叉樹是一種特殊的樹型結構,特點是每個結點的孩子結點樹的度不超過2,並且二叉樹的子樹有左右之分,順序不能顛倒。

基本操作:

  • 創建二叉樹
  • 取根結點值
  • 取雙親結點值
  • 求二叉樹深度
  • 插入子樹
  • 刪除子樹
  • 求某結點左、右孩子
  • 求某結點左、右兄弟
  • 判斷樹是否爲空
  • 先序、中序、後序、層序遍歷
  • 替換樹種的結點值
  • 銷燬二叉樹

二叉樹的順序存儲

結構特點:

利用一組連續的存儲單元依次自上而下,從左到右存儲完全二叉樹上的結點,存儲過程中,將完全二叉樹的結點編號爲i的元素存儲在如上定義的一維數組的下標爲i-1的分量中。

若二叉樹不是完全二叉樹,那麼存儲二叉樹時要考慮到結點位置的唯一性和準確性,將非完全二叉樹作爲完全二叉樹來進行存儲。對空結點,用0表示。

二叉樹的鏈式存儲

結構特點:

利用指針域來指向特點的結點。
一般來講,表示二叉樹的鏈表中的結點至少包含3個域:數據域和左指針、右指針域。數據域用來存放該結點的數據,左右指針分別指向該結點的左孩子和右孩子。
有時爲方便查找雙親域,還添加一個指向雙親的指針域。
利用以上兩種結點構成的二叉樹的存儲結構分別稱爲二叉鏈表樹和三叉鏈表樹。

線索二叉樹

結構特點:

依遍歷規則把每個結點對應的前驅和後繼線索預存起來,這叫做“線索化”。
線索二叉樹是在二叉鏈表作爲基礎的同時,增加兩個標誌域:Ltag和RLtag。
tag = 0 時 child 指向孩子。
tag = 1 時 child 指向線索。

線索化過程就是在遍歷過程中修改空指針的過程。
將空的lchild改爲節點的直接前驅。
將空的rchild改爲結點的直接後繼。

基本操作:

  • 創建圖
  • 銷魂圖
  • 查詢頂點值
  • 查詢頂點序號
  • 插入頂點
  • 刪除頂點
  • 修改頂點值
  • 增加弧
  • 刪除弧
  • 深度優先遍歷
  • 廣度優先遍歷

圖的存在形式:

  • 有向圖
  • 有向網
  • 無向圖
  • 無向網

圖結構的表示方法

  • 鄰接矩陣
  • 鄰接表
  • 十字鏈表
  • 鄰接多重表

圖的鄰接矩陣表示

圖的鄰接矩陣表示特點:

  • 採用一維數組存儲圖的頂點信息
  • 採用二維數組構件鄰接矩陣,存儲圖(網)的弧(邊)信息。
  • 採用實現圖的各種操作(求度、查詢頂點、查詢弧等)
  • 存儲空間靜態申請,不便於擴展頂點數量
  • 空間利用率低,對於稀疏圖而言嚴重浪費空間。

圖的鄰接表表示

鄰接表表示特點:

  • 採用鏈表存儲每個頂點的鄰接信息(弧信息)
  • 存儲空間動態申請,便於擴展頂點數量。
  • 空間利用率較高,非常適合稀疏圖
  • 便於查詢鄰接頂點
  • 統計有向圖頂點的入度開銷龐大,針對有向圖可以構造逆鄰接表

圖的十字鏈表表示

十字鏈表表示特點:

  • 針對弧結點,增加入弧鏈表結構和出弧鏈表結構
  • 容易求得任意頂點的出度和入度,專用於有向圖的操作
  • 結構實現比較複雜

圖的鄰接多重表表示

鄰接多重表表示特點:

  • 每個邊結點均被其兩個依附頂點的邊鏈表所共用。
  • 容易判斷頂點之間的關係,專用於無向圖的操作
  • 結構實現相對複雜

本博客內容到此結束,歡迎指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章