1. 程式人生 > >線性表(二)

線性表(二)

1.什麼是線性表

線性表是0個或多個數據元素的有限序列。

線性表的操作:
InitList(*L) //初始化線性表 空表
ListEmpty(L) //判斷 線性表是否為空 true/false
ClearList(*L) //清空線性表
GetElem(L,i,&e) //將線性表L 中第i個位置元素 返回給e
LocateElem(L,e) //查詢e線上性表l中的位置 沒有的話返回0
ListInsert(*L,i,e) //在第i個位置插入e
ListDelete(*L,i,*e) // 刪除第i個位置的元素 並返回個e
ListLength(L) //返回線性表元素個數

順序儲存的定義


線性表的順序儲存結構,指的是用一段地址連續的儲存單元一次儲存線性表中的資料元素。
就是 java中的陣列。

獲取元素的時間複雜度是 O(1)
LOC(ai-1) = LOC(ai) +C //C是一個數據元素佔用幾個儲存單元

第i個元素位置
LOC(ai) = LOC(a1)+(i-1)*c

順序儲存結構的優缺點
優點:
1.無需為表中的元素之間的邏輯關係而新增額外的儲存位置。
2.快速查詢表中任意元素的位置。
缺點:
1.插入和刪除都需要移動大量的元素。
2.線性表長度變化大時,無法確定儲存空間容量 因為需要一開始指定容量大小
3.容易造成儲存空間的碎片 。

鏈式儲存結構

每個節點都有一個前驅元素和後繼元素。
為了表示每個節點與其後繼元素之間的邏輯關係 除了儲存元素本身的資訊之外,還需要儲存指示其後繼元素地址的資訊。

即將節點分為了資料域和指標域
資料域儲存資料元素資訊。
指標域儲存後繼元素的位置

連結串列有 以下幾種:
單鏈表 靜態連結串列 迴圈連結串列 雙向連結串列

以單鏈表為例
單鏈表的新增元素

節點p -> 節點q

要在節點p和節點q 中插入一個 節點s

操作為:

s->next = p->next
p->next = s

單鏈表 刪除節點
節點p -> 節點p next -> 節點p next next

要想刪除中間的 節點p next 則需要

p->next = p->next->next

鏈式儲存 中單鏈表的結構和 順序儲存結構之間的優缺點。

1.儲存
單鏈表中的記憶體分配 可以不連續
順序儲存 必須是連續的儲存單元
2.時間複雜度
單鏈表中查詢一個元素的複雜度為O(n)
順序儲存查詢僅為O(1)
單鏈表新增和刪除的複雜度為O(1)
順序儲存新增和刪除需要O(n)
3.空間效能
順序空間儲存需要預分配空間 確定長度 擴容麻煩
鏈式儲存不需要分配 元素個數不受限制。

靜態連結串列、迴圈連結串列
用陣列描述的連結串列 叫做靜態連結串列 即 兩個資料域 一個存資料 另一個存下一個資料元素的下表 迴圈連結串列即將最後節點指向頭結點 這裡不做贅述。

雙向連結串列
即節點除了擁有資料域和next之外 還能指向前驅元素的位置
擁有 data 、prisor、next
p->next 指向下一個資料元素位置 p-prisor 指向上一個資料元素位置

雙向連結串列的插入

節點p -> 節點p next

要在節點p 和 節點p-next 插入 節點s
需要四步
1.確定s的後繼指標
2.確定s的前驅指標
3.修改p next的前驅指標指向s
4.修改p 的後繼指標指向s

詳細操作為:

s->next = p->next
s-prisor = p
p-next-prisor = s 
p-next = s

雙向連結串列的刪除

p的前驅元素(A) p p的後繼元素 (B)

要想刪除p 需要
將p的前驅元素的後繼指標指向p的後繼元素 ====A的後繼指標指向B
將p的後繼元度的前驅指標指向p的前驅元素 =====B的前驅指標指向A

詳細操作為:

p->prisor->next = p->next 
p->next->prisor = p->prisor

相關推薦

考研資料結構複習之線性

單鏈表的學習 #pragma once typedef char DataType; class SSeqListTest { public: SSeqListTest(); ~SSeqListTest(); }; typedef struct Node {

線性——順序儲存結構

線性表的順序儲存結構 構造原理 用一組地址連續的儲存單元依次儲存線性表的資料元素,資料元素之間的邏輯關係通過資料元素的儲存位置直接反映。 記做 ( a1,a2,a3,… … , an ) 所謂一個元素的地址是指該元素佔用的若干(連續的)儲存單元的第一個單元的地址。記做LOC(a

線性 單鏈應用——可利用空間

常常會有頻繁申請、釋放記憶體的需求,比如在傳送網路報文時,每次都要分配記憶體以儲存報文,等報文傳送完成後又需要刪除報文。 為了避免頻繁的new/delete對系統帶來的開銷,需要實現一個通用的Free

資料結構之線性

資料結構之線性表一主要講的是線性表的順序儲存結構和鏈式儲存結構的實現和程式碼。這次我們來討論下靜態連結串列,迴圈連結串列和雙向連結串列。 靜態連結串列 我們讓陣列每個元素都是由兩個資料域組成:data和cur。資料域data用來儲存資料元素,cur相當於我們連結串列中的n

線性

1.什麼是線性表 線性表是0個或多個數據元素的有限序列。 線性表的操作: InitList(*L) //初始化線性表 空表 ListEmpty(L) //判斷 線性表是否為空 true/false ClearList(*L) //清空線性表 G

資料結構線性

Status GetElem(SqList L, int i, ElemType *e) { if(L.length == 0 || i < 1 || i > L.length)

線性結構----單鏈

  單鏈表:     通過class建立物件,為物件給予特殊屬性成為節點,多個節點形成連結串列     1 public class Node { 2 3 //節點內容 4 int data; 5 //下一個節點 6 No

線性結構--- 雙鏈

    1 public class DoubleNode { 2 //上一個節點 3 DoubleNode pre=this; 4 //下一個節點 5 DoubleNode next=this; 6 //節點資料 7

數據結構-線性2

順序 序表 表示 元素 額外 alt 最大 spa 位置 線性表定義: 線性表是最基本、最簡單、也是最經常使用的一種數據結構。線性表中數據元素之間的關系是一對一的關系,即除了第一個和最後一個數據元素之外,其他數據元素都是首尾相接的。線性表的邏輯結構簡單,便於實現

mysql分區及分

存儲、數據管理 mysql分區分表(二)測試未分區表和分區表性能重新創建新的測試數據庫及未分區表back1 創建分區表back2,按照年月區分 maxvalue把對於2005的值全放在p11區裏創建大點的數據(方便測試的時候區分明顯分區和未分區的區別) r

數據結構之線性

不存在 ear public 線性結構 turn 過程 結構 length class 一、線性表的特性   1、線性結構的特性   (1)集合中必存在唯一的“第一元素”和唯一的“最後元素”。   (2)除最後一個元素之外,均有唯一的後繼和唯一的前驅。   2、線性表的基本

資料結構-----------線性下篇之雙向連結串列

//----------雙向連結串列的儲存結構------------ typedef struct DuLNode { ElemType date; struct DoLNode *prior; struct DoLNode *next; } DoLNode,*DoLinkList;

資料結構---------------線性下篇之單鏈

單鏈表 特點:儲存空間不連續 結點(資料元素組成):資料域(儲存資料)和指標域(指標)A1 若用p來指向  則資料域為p->date   指標域為p->next 鏈式儲存結構: 單鏈表、迴圈連結串列、雙向連結串列根據連

資料結構基礎之線性

轉自:http://www.cnblogs.com/edisonchou/p/4614934.html   線性表(下) 在上一篇中,我們瞭解了單鏈表與雙鏈表,本次將單鏈表中終端結點的指標端由空指標改為指向頭結點,就使整個單鏈表形成一個環,這種頭尾相接的單鏈表稱為單迴圈連結串列

資料結構與演算法——線性

#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 200 #define LISTINCREASE 10 #define ERROR 0 #define OK 1 typedef int Elemt

線性結構--- 棧

 棧: 先進後出  拿出資料後位置置空(棧長度減1) 1 public class MyStack { 2 3 //棧的底層我們使用陣列來儲存資料 4 int[] elements; 5 6 7 public MyStack() { 8

形象理解線性代數——行列式的意義

通過形象理解線性代數(一)——什麼是線性變換?,我們已經知道,原來矩陣的作用就是對向量的線性變換,而且更具體地講,是對原空間的基底的變換。如果原空間的基底是,那麼變換後的新的基底應該就相當於用A對舊的基底進行變換(縮放和旋轉),並且新的基底(,)。其中代表矩陣的列向量。 一、行列式與兩組基所圍成

線性代數-矩陣的運算

一、矩陣的加法 1.   二、矩陣的乘法 1.   三、矩陣與矩陣相乘 1. PS:必須注意,只有第一個矩陣的列數等於第二個矩陣的行數的時候兩個矩陣才能相乘; PS:矩陣相乘時要注意矩陣的順序,對於兩個矩陣A和B,如

線性迴歸

本文參考: 1)崔家華:https://cuijiahua.com/blog/2017/12/ml_12_regression_2.html 2)zsffuture: https://blog.csdn.net/weixin_42398658/article/details/835

線性——雙向連結串列

雙向連結串列 構造原理 所謂雙向連結串列是指連結串列的每一個結點中除了資料域以外設定兩個指標域,其中之一指向結點的直接前驅結點,另外一個指向結點的直接後繼結點。 鏈結點的實際構造可以形象地描述如下: 其中,data為資料域,llink, rlink分別為指向該結點的直接前驅結點