資料結構 筆記:迴圈連結串列的實現
阿新 • • 發佈:2018-11-10
什麼事迴圈連結串列?
-概念上
·任意資料元素都有一個前驅和一個後繼
·所有的資料元素的關係構成一個邏輯上的環
-實現上
·迴圈連結串列是一種特殊的單鏈表
·尾結點的指標域儲存了首結點的地址
迴圈連結串列的實現思路
-通過模板定義CircleList類,繼承自LinkList類
-定義內部函式last_to_first(),用於將單鏈表首尾相連
-特殊處理:首元素的插入操作和刪除操作
-重新實現:清空操作和遍歷操作
迴圈連結串列的實現要點
-插入位置為0時:
·頭結點和尾結點均指向新結點
·新結點成為首結點插入連結串列
-刪除位置為0時:
·頭結點和尾結點指向位置為1的結點
·安全銷燬首結點
template <typename T> class CircleList : public LinkList<T> { protected: typedef typename LinkList<T>::Node Node; int mod(int i) const { return (this->m_length == 0) ? 0 : (i% this->length()); } Node* last() const { return this->position(this->m_length-1)->next; } void last_to_first() const { last()->next = this->m_header.next; } public: bool insert(const T& e) { return insert(this->m_length,e); } bool insert(int i,const T& e) { bool ret = true; i = i % (this->m_length + 1); ret = LinkList<T>::insert(i,e); if(ret && (i == 0)) { last_to_first(); } return ret; } bool remove(int i) { bool ret = true; i = mod(i); if(i == 0) { Node* toDel = this->m_header.next; if(toDel != NULL) { this->m_header.next = toDel->next; this->m_length--; if(this->m_length > 0) { last_to_first(); if(this->m_current == toDel) { this->m_current = toDel->next; } } else { this->m_header.next = NULL; this->m_current = NULL; } this->destroy(toDel); } else { ret = false; } } else { ret = LinkList<T>::remove(i); } return ret; } bool set(int i,const T& e) { return LinkList<T>::set(mod(i),e); } bool get(int i)const { return LinkList<T>::get(mod(i)); } bool get(int i,const T& e)const { return LinkList<T>::get(mod(i),e); } int find(const T& e) const { int ret = -1; Node* slider = this->m_header.next; for(int i =0;i<this->m_length;i++) { if(slider->value == e) { ret = i; break; } slider = slider->next; } return ret; } void clear() { while(this->m_length > 1) { remove(1); } if(this->m_length == 1) { Node* toDel = this->m_header.next; this->m_header.next = NULL; this->m_length = 0; this->m_current = NULL; this->destroy(toDel); } } bool move(int i,int step) { return LinkList<T>::move(mod(i),step); } bool end() { return (this->m_length == 0) || (this->m_current == NULL); } ~CircleList() { clear(); } };
總結:
-迴圈連結串列是一種特殊的單鏈表
-尾結點的指標域儲存了首結點的地址
-特殊處理首元素的插入操作和刪除操作
-重新實現清空操作和遍歷操作
·