資料結構 C 實現(二) 單向鍊錶

2021-07-25 12:35:16 字數 4633 閱讀 5361

和陣列不同,鍊錶的資料結構內部多了乙個指標指標下乙個位置,使得在鍊錶中插入刪除特定位置的元素效率很高,**實現依舊分為三個部分,抽象類linearlist.h,模板類chain.h以及main函式原始檔。

廢話不多說,我們看**,這次linearlist.h抽象類裡面多了兩個成員函式乙個是push_back(),乙個是clear():

//

// created by djf on 2016/12/18 0018.

//#ifndef inc_01_arraylist_linearlist_h

#define inc_01_arraylist_linearlist_h

#include

template

class linearlist ;

virtual bool empty() const = 0;

virtual int size() const = 0;

virtual t& get(int index) const = 0;

virtual int indexof(const t& theelement) const = 0;//first pos

virtual void erase(int index) = 0;

virtual void insert(int index, const t& theelement) = 0;

virtual void output(std::ostream& out) const = 0;

//extend

virtual void clear() = 0;

virtual void push_back(const t& theelement) = 0;

};#endif //inc_01_arraylist_linearlist_h

然後是chain.h,單向鍊錶的模板類:

//

// created by djf on 2016/12/20 0020.

//#ifndef inc_02_chain_chain_h

#define inc_02_chain_chain_h

#include "linearlist.h"

using namespace std;

template

struct chainnode

chainnode(const t& e)

chainnode(const t& e, chainnode

* n)

};template

class chain: public linearlist

//operator t& operator*() const t* operator&() const iterator& operator++() iterator operator++(int) bool operator==(const iterator rhl) const bool operator!=(const iterator rhl) const //other protected: chainnode

* node; }; public: //consturct copy destory chain(int initcapacity=10); chain(const chain

&); ~chain(); //adt method from linearlist.h bool empty() const override ; int size() const override t& get(int index) const override; int indexof(const t&) const override; void erase(int index) override; void insert(int index,const t& theelement) override; void output(ostream& out) const override; void push_back(const t& theelement) override ; void clear() override ; //other void removerange(int fromindex,int toindex); int lastindexof(const t& theelement); t& operator(int index) const; void reverse(); protected: void checkindex(int index) const; chainnode

* headnode; int listsize; }; template

void chain

::removerange(int fromindex, int toindex) } } else } } template

chain

::chain(int initcapacity) template

chain

::chain(const chain

& thelist) chainnode

* sourcenode = thelist.headnode; headnode = new chainnode

(sourcenode->element); sourcenode = sourcenode->next; chainnode

* targetnode = headnode; while(sourcenode!= nullptr) targetnode->next = nullptr; } template

chain

::~chain() } template

t &chain

::get(int index) const template

void chain

::checkindex(int index) const } template

int chain

::indexof(const t & theelement) const return -1; } template

void chain

::erase(int index) else --listsize; delete deletenode; } template

void chain

::insert(int index, const t &theelement) if(index ==0) else listsize++; } template

void chain

::output(ostream &out) const template

void chain

::push_back(const t &theelement) template

void chain

::clear() listsize = 0; } template

int chain

::lastindexof(const t& theelement) } } template

t& chain

::operator(int index) const template

void chain

::reverse() else q->next = p; r->next = q; headnode = r; } } template

ostream& operator<<(ostream& out, const chain

&a) #endif //inc_02_chain_chain_h

隨便寫的測試:

#include #include "chain.h"

int main()

我發現寫這個還是很鍛鍊人的,乙個完善的資料結構輕輕鬆鬆幾百行**,每天一發,感覺很酸爽,c++簡直寫上癮。

不廢話了,我們回歸頭來看看鍊錶的標頭檔案裡都定義了啥:

chainnode類定義了節點類,包含資料成員以及指向下乙個節點的指標。包含構造、拷貝以及析構函式。

chan類繼承自linearlist抽象類,包含節點類的成員變數,以及乙個巢狀類iterator。

成員函式分為幾個部分,首先是構造、拷貝以及析構函式,值得注意的是在建構函式中有乙個引數initcapacity,實際是無作用的,僅僅為了和之前的arraylist一致。

然後是繼承自抽象類的方法,和arraylist中的區別不大。

最後是我做的幾個習題,

voidremoverange(

intfromindex,

inttoindex)

的作用是將引數限定範圍內的節點刪除的操作。

intlastindexof(

constt

& theelement)是返回與函式引數相等的最後乙個位置的索引。t&

operator(

intindex)

const是對運算子進行過載,返回指定索引的節點的資料的引用。v

oidreverse()

是將整個鍊錶進行反轉的操作,要求不開闢多餘的空間。

資料結構 二 單向鍊錶 雙向鍊錶

資料結構 一 資料結構基本概念 基於陣列實現線性表 資料結構 二 單向鍊錶 雙向鍊錶 雙鏈表 一 基本概念 單鏈表由乙個個節點組成 public class mysinglelistnode 二 介面 public inte ce mylist 三 功能實現public class mysingle...

php實現資料結構 單向鍊錶

什麼是單向鍊錶 鍊錶是以鏈式儲存資料的結構,其不需要連續的儲存空間,鍊錶中的資料以節點來表示,每個節點由元素 儲存資料 和指標 指向後繼節點 組成。單向鍊錶 也叫單鏈表 是鍊錶中最簡單的一種形式,每個節點只包含乙個元素和乙個指標。它有乙個表頭,並且除了最後乙個節點外,所有節點都有其後繼節點。它的儲存...

資料結構 單向鍊錶(java實現)

public class node 為節點追加節點 當前節點 node currentnode this while true 賦值當前節點 currentnode nextnode 把需要追回的節點追加為找到的節點的下乙個節點 currentnode.next node return this 刪...