線性結構 列表

2021-09-26 19:11:50 字數 2915 閱讀 3738

從靜態到動態

根據是否修改資料結構,操作大致分為兩類:

1)靜態:讀取,資料結構的內容和組成一般不變:get, search

2) 動態:寫入,資料結構的區域性或者整體改變: insert,remove

與操作方式相對應,資料元素的儲存與組織方式也分為兩種

1) 靜態:資料空間整體建立或銷毀

資料元素的物理儲存次序和邏輯次序嚴格一致,因此支援高效的靜態操作 (比如向量) geto(1),search o(logn);而寫入最少要o(n),為了改變動態操作不足 採用動態的結構(列表)

2) 動態: 為各資料元素動態分配和**物理空間

邏輯上相鄰的元素記錄彼此的物理空間,在邏輯上形成乙個整體,支援高效的動態操作

從向量到列表

l=列表(list)是典型的動態儲存結構,其中各元素稱為節點, 各節點通過指標或者引用彼此連線,在邏輯上構成線性序列,除了首末元素外均有前驅後繼

從秩到位置

向量支援循秩訪問 ,v[i]=v+i*s, 如此快的訪問 能否被列表沿用?

列表也是線性結構,的確可以通過秩來訪問,但是循序漸進的 訪問成本高

因此,改為循位置訪問 即利用節點間的相互引用,找到特定節點

實現

節點作為列表的基本元素,需要首先實現封裝

**列表節點:listnode模板類**

#define posi(t) listnode*//定義型別

template //簡潔起見,完全開放而不過度封裝

struct listnode //列表節點模板類(雙向鍊錶形式實現)

//針對header和trailer的構造

listnode(t e,posi(t) p= null,posi(t) s=null)

:date(e),pred(p),succ(s){}//預設構造器

posi(t) insertaspred(t const& e);//前插入

posi(t) insertassucc(t const& e);//前插入

};**列表:list模板類**

include "listnode.h"//引入列表節點類

template class list

;**構造**

temolate void list::init()//初始化,建立列表時統一呼叫

秩到位置

可否模仿向量的循秩訪問方式?

**過載下標操作符**

template t list::operator(rank r )const//對列表過載操作符,訪問第r個元素

//節點的秩即前驅總數

**複雜度**:算術級數 每個節點訪問概率是1/n,所以複雜度為o(n)

查詢

在p節點的前驅中尋找e,注意對比,命中則停止

template //從外部呼叫時,0<=n<=rank(p)<_size

posi(t) list::find(t const& e,int n,posi(t) p) const

插入與複製

template posi(t) list::insertbefore(posi (t) p,t const & e)

//e作為p的前驅插入

template //前插入演算法

posi(t) listnode::insertaspred(t const& e)

//哨兵的建立使p即使是首節點仍合理

基於複製的構造

template //基本介面 o(n)

void list ::copynodes(posip,int n)

//insertaslast相當於insertbefore(trailer)!!!!!!!!!!!!!!

}

刪除與析構

template //刪除合法位置p節點,返回其數值 o(1)

t list::remove (posi(t))

析構把對外可見的節點刪除,再刪除哨兵

template list ::~list()//列表析構

//清空列表,釋放頭尾哨兵

template int list ::clear()

//o(n),線性正比於列表規模

唯一化

大致分為三部分:一部分不重複節點,待考察節點,待考察字尾

}

唯一化 構思

有序向量唯一化比無序向量完成更快,那列表呢?

有序向量相同元素彼此相鄰,只保留乙個元素,仿照此:p節點與後繼節點對比,相同則remove(q) ,繼續對比知道發現下乙個不同節點 ,則將p指向並保留該不同節點

唯一化實現

temolate int list ::uniquify()

//只需遍歷一遍,o(n)

查詢

template //在有序列表節點p的n個前驅中,返回不大於e的最後者

posi (t) list::search(t const &e,int n,posi(t) p) const

//

vector rank(秩): list posi(位置)

ram模型對應循秩訪問方式

圖靈機模型對應循位置訪問

線性列表 雙向列表

雙向鍊錶 在單鏈表中,每個節點所含的鏈域指向後繼節點,故從任一節點後繼很方便,但要找到 前驅及節點比較困難。public class dnode public dnode string name public dnode string name,dnode next,dnode prev packa...

線性結構和非線性結構

資料結構是計算機儲存 組織資料的方式。常見的資料結構分類方式如下圖 常用的線性結構有 線性表,棧,佇列,迴圈佇列,陣列。線性表中包括順序表 鍊錶等,其中,棧和佇列只是屬於邏輯上的概念,實際中不存在,僅僅是一種思想,一種理念 線性表則是在記憶體中資料的一種組織 儲存的方式。線性結構是最簡單最常用的一種...

線性結構與非線性結構

對於資料結構,感情是 在撓頭也要學啊 我愛資料結構,資料結構使我快樂 呵 這裡一點一點開始扯 線性資料結構 定義為 1.有唯一的首元素及尾元素,2.資料元素之間是一對一關係 3.除首元素和尾元素外,每個元素都只有唯一的前段和後端 我詞真窮 樣例 線性表,堆,棧,佇列,陣列 基本指一維的 鍊錶 非線性...