和陣列不同,鍊錶的資料結構內部多了乙個指標指標下乙個位置,使得在鍊錶中插入刪除特定位置的元素效率很高,**實現依舊分為三個部分,抽象類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 刪...