** 雙向鍊錶的結構如下:**
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 邏輯結構 只反映資料元素之間的邏輯關係的資料結構,其中的邏輯關係是指資料元素之間的前後關係,而與他們在計算機中的儲存位置無關,有以下四類 集合結...