基於之前做的單向鏈式線性表改進下,實現了迴圈鍊錶,相對應單向鍊錶,迴圈鍊錶將尾節點的指標域指向頭節點,加入迴圈,可以讓我們在查詢某乙個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...