雙向迴圈鍊錶類C 實現。2020 11 1

2021-10-10 03:41:25 字數 3188 閱讀 4002

記錄乙個小白的轉型之路,一轉眼又是新的一天過去了,博主今天想快速結束資料結構與演算法的線性表這一章,主要是想用c++把他們乙個個的實現起來,所以想直接將迴圈鍊錶和雙向鍊錶一起結合起來實現c++中的list容器的基本實現,emmm,這對於乙個小白還是挺煩的,倒不是說難,演算法到時很簡單,不過到了去實現的時候總會出千奇百怪的問題,除錯起來就很迷。

嘛,總歸是做出來了,基本實現也已經除錯好了,這是我學c++的第60天,希望將來有個好結果。

**放在下面了,在我注釋比較多的地方,希望有緣人可以多看看,加上了一些我的理解和演算法實現的細節問題。**有點粗糙,希望大家海涵。嘿嘿!

#include

#include

"doublelist.h"

using

namespace std;

void

test01()

intmain()

#pragma once

#include

#include

"node.h"

using

namespace std;

//本次是有無意義頭結點的迴圈雙向節點

//本次由於是雙向鍊錶,所以有些東西補血藥兩個輔助節點,因為節點有前置指標,可以直接找到前面後者後面的東西

class

doublelist

;

#include

"doublelist.h"

doublelist::

doublelist()

//建構函式,構建乙個有無意義頭結點的鍊錶,此節點資料域存放213,誒嘿嘿,你知道什麼意思了,哈哈

doublelist::

~doublelist()

//這是析構函式,我們要講乙個迴圈雙線鍊錶乙個乙個刪乾淨,要注意雙向鍊錶的刪除問題,尤其注意。

delete

this

->list;

//最終刪除所有,釋放空間

this

->list =

null

;this

->length =0;

//長度歸0

}void doublelist::

clearlist()

//這裡我保留頭結點

node* p =

this

->list-

>next;

while

(p->next != p)

this

->length =0;

//此時僅僅保留乙個無意義頭結點,不會吧不會吧,不會有人還想刪除這個頭結點吧,刪除了就什麼都沒有了,不去構造乙個出來就啥也沒了,會出現異常的。

}bool doublelist::

isemptylist()

else

}int doublelist::

getelementlocate

(int locate,

int* e)

if(locate >

this

->length)

int count =1;

//定義乙個計數變數

node* p =

this

->list-

>next;

while

(count < locate)

*e = p-

>data;

}int doublelist::

getelementthing

(int elemennt)

while

((p-

>data != elemennt)

&&(p-

>next!=

this

->list))if

(p->next==

this

->list)

return count;

}//注意雙向鍊錶的插入,他是非常難搞的

void doublelist::

insertheadlist()

}void doublelist::

insertrearlist()

}void doublelist::

deletelistlocate

(int i)

//刪除位置節點

while

((p-

>next !=

this

->list)

&&(count(p->next ==

this

->list)

//這裡有問題,要是只有乙個節點,剛好又是要刪的位置,也返回,坑定不反悔啊?

p->prior-

>next = p-

>next;

p->next-

>prior = p-

>prior;

delete p;

this

->length--;}

//思考下,要是多個元素要刪怎麼辦,防止漏刪怎麼辦,單鏈表中是怎麼解決的?

void doublelist::

deletelistthing

(int element)

//此時的p是一段過程中不為element的節點

p = p-

>next;

//更新下p,使之指向下乙個可能刪除點}}

int doublelist::

lengthlist()

void doublelist::

printlist()

cout << endl;

}void doublelist::

sortlist()

p = p-

>next;}}

}void doublelist::

modeficationlistlocate

(int i,

int element)

if(i >

this

->length)

int count =1;

//定義乙個計數變數

node* p =

this

->list-

>next;

while

(count < i)

p->data = element;

}

C 實現的雙向迴圈鍊錶類

部落格第一天 雙向鍊錶類 ccircularnode.h class ccircularnode ccircularnode ccircularnode getnextnode ccircularnode getlastnode static void initialize ccircularnod...

C 實現雙向迴圈鍊錶

雙向迴圈鍊錶 除錯正常,所有功能均測試 節點類 template class listnode listnode type d,listnode n nullptr,listnode p nullptr data d next n prev p void setdata type d 雙向迴圈鍊錶 ...

雙向迴圈鍊錶模板類 C

雙向鍊錶又稱為雙鏈表,使用雙向鍊錶的目的是為了解決在鍊錶中訪問直接前驅和後繼的問題。其設定前驅後繼指標的目的,就是為了節省其時間開銷,也就是用空間換時間。在雙向鍊錶的每個節點中應有兩個鏈結指標作為它的資料成員 pred指向其前驅節點,next指向其後繼節點。再加上資料域,因此每個雙向鍊錶至少包括三個...