20201016資料結構和演算法之 雙向鍊錶

2021-10-02 05:55:09 字數 4961 閱讀 1158

** 雙向鍊錶的結構如下:**

typedef

struct _dblinklistdblinklist,dblinknode;

**雙向鍊錶的特性:**由結構可以看出,雙向鍊錶繼承了單向鍊錶的特性同時,其構成相對於單向鍊錶,多了乙個指向前乙個元素的pre指標,具有了逆向追溯性。

**函式呼叫介面:**其結構函式初始化、尾部插入、查詢元素、增加元素、銷毀鍊錶同單向鍊錶,

但是前插法、刪除元素介面函式有些不一樣。

具體的詳見介面函式**注釋。

bool

dblinklistinsertfront

(dblinklist*

& link, dblinklist*

&node)

else

return

true

;}

以上是前插法的呼叫函式區分為空鍊錶插入和非空鍊錶插入,同時在非空鍊錶插入時,連線前後指標的順序非常重要,必須將外推的結點先賦值。

以下是刪除元素函式,和前插法函式有些類似,分為刪除的結點是尾結點和非尾結點兩種情況。

bool

dblinklistdeleteele

(dblinklist*

&link,

int i)if(

!p || pos > i)

return

false;if

(!p-

>next)

else

delete p;

return

true

;}

其他通用的函式和除錯**如下(含前面的介面程式,親測可用)

#include

#include

using

namespace std;

typedef

struct _dblinklist dblinklistnode,dblinklist;

//函式實現

bool

initdblinklist

(dblinklist*

&link)

;//雙向鍊錶初始化

bool

dblinklistinsertfront

(dblinklist*

& link, dblinklist*

&node)

;//鍊錶前插法

bool

dblinklistprint

(dblinklist*

& link)

;//列印鍊錶

bool

dblinklistinsertback

(dblinklist*

&link,dblinklist*

&node)

;//鍊錶尾插法

bool

dblinklistinsert

(dblinklist*

&link,

int i,dblinklist*

&node)

;//任意位置插入

bool

dblinklistgetele

(dblinklist*

& link,

int i, dblinklist*

& node)

;//獲取第i個位置的元素

//根據需要更改要查詢的資料型別

bool

dblinklistfindele

(dblinklist*

& link,

int e)

;//查詢是否有元素e

bool

dblinklistdeleteele

(dblinklist*

& link,

int i)

;//刪除第i個位置的資料

void

dblinklistdestroy

(dblinklist*

& link)

;//銷毀鍊錶

intmain()

dblinklistprint

(link)

; std::cout <<

"**************採用尾插法插入資料,請輸入要插入的個數:***********"

<< std::endl;

cin >> cout;

for(

int i =

0; i < cout; i++

)dblinklistprint

(link)

; std::cout <<

"**************任意位置插入資料,請輸入要插入的位置和資料:***********"

<< std::endl;

cin >> cout;

node =

new dblinklistnode;

cin >> node-

>data;if(

dblinklistinsert

(link, cout, node)

)else

std::cout <"**************獲取指定位置的資料,請輸入要獲取的位置:***********"

<< std::endl;

cin >> cout;

node =

new dblinklistnode;if(

dblinklistgetele

(link, cout, node)

)else

std::cout << endl <<

"**************查詢是否有指定的資料***********"

<< std::endl;

cout =4;

if(dblinklistfindele

(link,cout)

)else

std::cout << endl <<

"**************刪除指定位置的資料,請輸入位置***********"

<< std::endl;

cin>>cout;if(

dblinklistdeleteele

(link, cout)

)else

dblinklistdestroy

(link)

;system

("pause");

return0;

}bool

initdblinklist

(dblinklist*

&link)

bool

dblinklistinsertfront

(dblinklist*

& link, dblinklist*

&node)

else

return

true;}

bool

dblinklistprint

(dblinklist*

& link)

cout << endl;

cout <<

"逆向列印雙向鍊錶!"

<< endl;

while

(p!=link)

return

true;}

bool

dblinklistinsertback

(dblinklist*

& link, dblinklist*

& node)

p->next = node;

node-

>pre = p;

node-

>next =

null

;return

true;}

bool

dblinklistinsert

(dblinklist*

& link,

int i, dblinklist*

& node)

if(pos > i -1||

!p)return

false;

p->next-

>pre = node;

node-

>next = p-

>next;

p->next = node;

node-

>pre = p;

return

true;}

bool

dblinklistgetele

(dblinklist*

& link,

int i, dblinklist*

& node)if(

!p || pos > i)

return

false

; node = p;

node-

>next = p-

>next;

node-

>pre = p-

>pre;

return

true;}

bool

dblinklistfindele

(dblinklist*

& link,

int e)if(

!p || p==link)

return

false

;else

return

true;}

bool

dblinklistdeleteele

(dblinklist*

&link,

int i)if(

!p || pos > i)

return

false;if

(!p-

>next)

else

delete p;

return

true;}

void

dblinklistdestroy

(dblinklist*

& link)

delete p;

}

資料結構和演算法

判斷乙個演算法的效率時,函式中的常數和其它次要項常常可以忽略,而更應該關注主項 最高項 的階數。演算法時間複雜度的定義 在進行演算法分析時,語句中的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n ...

資料結構和演算法

程式是什麼?好多書上都寫著 程式 資料結構 演算法。可是怎麼去理解呢?好多程式設計人員對資料結構和演算法說不上熟悉,因為在他們所從事的工作中很少用到這些知識點。但並不表示他們不重要。還有一些人是這樣的想法 大公司才會注重這些知識點,小公司可能就不注重了。寫這篇文章之前我也是持這種想法的。但是,此時此...

資料結構和演算法

一 資料結構 1.概念 資料結構就是資料之間的結構關係,或者理解成資料元素之間存在的一種或者多種特定關係的集合,在傳統上資料結構分為邏輯結構與物理結構 1 邏輯結構 只反映資料元素之間的邏輯關係的資料結構,其中的邏輯關係是指資料元素之間的前後關係,而與他們在計算機中的儲存位置無關,有以下四類 集合結...