C 模版類的單向迴圈鏈式線性表

2021-07-04 00:18:27 字數 3155 閱讀 3702

基於之前做的單向鏈式線性表改進下,實現了迴圈鍊錶,相對應單向鍊錶,迴圈鍊錶將尾節點的指標域指向頭節點,加入迴圈,可以讓我們在查詢某乙個index的節點時,可以先判斷一下位置和鍊錶長度的關係,如果index處於鍊錶的前半部分,我們可以從頭節點遍歷查詢,如果處於後半部分,我們可以從尾節點往前查詢,當然此時我們需要使用雙向鍊錶。雙向鍊錶的操作,下次給出吧!迴圈鍊錶給了我們一種思路,如果我們在乙個資料塊中,加入乙個或一些標誌節點,我們可以判斷我們需要的操作是在哪個區間,可以實現提高工作效率!

**中過載了加號運算子,實現兩個鍊錶的相加。其實我們還可以有更多的操作,但是很多操作都是基於我們的插入刪除操作的!所以我們在做資料結構分析的時候,我們要注意到插入和刪除的通用性!

#pragma once

#include using namespace std;

templateclass circlelist

node(eletype data)

}; circlelist();

~circlelist();

bool getelem(eletype& e, int index = 1)const;//得到list中第index個元素,把元素的_data賦給e;

bool insertelem(const eletype e, int index = 1);//在list的第index個位置插入乙個節點,節點的資料為e

bool deleteelem(eletype& e, int index = 1);//在list的第index個位置刪除乙個節點,刪除節點的資料賦給e

bool inserthead(const eletype& e);//在頭部插入資料

bool inserttail(const eletype& e);//在尾部插入資料

bool clear();//清空list

void showlist()const;//顯示list的所有元素的資料

circlelist* operator+(circlelist& addlist);//過載運算子

private:

bool empty()const;//判斷list是否為空

circlelist* addlist(circlelist& addlist);//加上addlist的資料,相當於把addlist的資料從尾部插入到原list中

//在list中查詢第index個位置的節點,把該節點的位址賦給n,此處需傳入指標的引用,才能保證n可以被修改,不然只能保證*n可以被修改,也就是n指向的節點可以被修改

bool find(int index, node*& n)const;

bool checkindex(int index)const;//檢查list是否為空,index是否合法

node* head;//頭指標

node* tail;//尾指標

int length;

};

#include "circlelist.h"

#include using namespace std;

templatebool circlelist::checkindex(int index) const

if (index<1 || index>length)

return true;

}templatebool circlelist::find(int index, node*& n)const//index [1,length];

n = temp;

return true;

} return false;

}templatevoid circlelist::showlist() const

else

cout << endl; }}

templatebool circlelist::clear()

else

return true; }}

templatebool circlelist::deleteelem(eletype& e, int index = 1)

else

else

}e = temp->_data;

delete temp;

--length;

return true;

} return false;

} return false;

}templatebool circlelist::insertelem(const eletype e, int index)

if (index == 1)

if (index == length + 1)

node *temp = nullptr;

if (find(index - 1, temp))

return false;

}templatebool circlelist::getelem(eletype& e, int index) const

return false;

}templatecirclelist::~circlelist()

templatecirclelist::circlelist() :length(0), head(nullptr), tail(nullptr)

templatebool circlelist::empty() const

templatebool circlelist::inserttail(const eletype& e)

templatebool circlelist::inserthead(const eletype& e)

templatecirclelist* circlelist::addlist(circlelist& addlist)

node* temp = addlist.head;

for (int i = 1; i <= addlist.length;++i)

return this;

} else

else

return this;

} }}templatecirclelist* circlelist::operator+(circlelist& addlist)

#include "circlelist.cpp"

int main()

線性表之鏈式儲存 單向迴圈鍊錶

單向迴圈線性表 也是通過結點的形式在儲存器中進行儲存,結點包括資料域和指標域,邏輯上相鄰的兩個結點在物理上不一定相鄰,單向迴圈鏈式儲存的線性表,定義了乙個唯一的頭結點,頭結點的資料域是儲存資料的,指標域next指標指向下乙個結點,也就是開始結點,定義了乙個尾結點,尾結點的next指向頭結點,資料域是...

線性表3 單向迴圈鍊錶

下面介紹鏈式儲存結構的單向迴圈鍊錶。迴圈鍊錶是另一種形式的鏈式儲存結構。其特點是表中最後乙個結點的指標域指向頭結點,整個鍊錶形成乙個環。由此,從表中任一結點出發均可找到表中其他結點。描述 資料域 指標域 typedef int datatype typedef struct node slinkli...

線性表的鏈式表示 迴圈單鏈表(C )

迴圈單鏈表和單鏈表的區別在於,表中的最後乙個結點的指標不是null,而改為指向頭結點,從而整個鍊錶形成乙個環。迴圈單鏈表可以從表中任意乙個結點開始遍歷整個鍊錶。不僅可以設定頭指標,還可設定尾指標,對於表頭與表尾進行操作都只需要o 1 的時間複雜度 迴圈單鏈表中結點型別的描述如下 typedef st...