//CircList.h
#ifndef CIRCLIST_H
#define CIRCLIST_H
class ListNode{
friend class CircList;
public:
// ListNode* next() const{ return link; }
// int get_data() const { return data; }
ListNode(int d=0,ListNode* n=0):data(d),link(n){}
private:
int data;
ListNode* link;
};
class CircList{
public:
CircList();
CircList(int value);
~CircList();
bool insert(int x); // 头插法
bool search(int x); // 查找值为x的元素,如果找到,返回true,将current指向当前元素
//找不到返回false
int length() const; // 返回元素个数
bool is_empty() const;// 查看当前链表是否为空
ListNode* get_current_ptr() const;//获得当前元素的指针
int get_current_pos() const;//取得当前元素的位置
int get_current_data() const; //取得当前元素的值
int get_first_data() const;//取得第1个元素的值
int get_last_data() const;//取得最后一个元素的值
void firster(); //将当前指针指向第一个
bool move_next(); //将当前指针指向下一个
bool move_prior(); //将当前指针指向前一个
bool remove(); //删除当前结点,current指向下一个元素
bool remove(int x); // 删除位置值为x的元素,如果删除 current指向的元素
//,那么current 指向下一个元素
bool set_current_ptr(ListNode*);//更改当前元素的指针
void print() const; //打印出所有元素的值
// bool remove(int pos); //删除某个个位置的结点
private:
ListNode *first,*current,*last;
int len;//循环链表的长度
};
#endif
//CircList.cpp
#include "CircList.h"
#include <iostream>
using std::cout;
using std::endl;
//Constructor
CircList::CircList()
{
first = current = last =0;
len =0;
}
CircList::CircList(int x)
{
first = current = last = new ListNode(x);
last->link = first;
len = 1;
}
//
CircList::~CircList()
{
if(len != 0){
firster();
ListNode* pre = current;
while(current != last)
{
current = current->link;
delete pre;
pre = current;
}
delete last;
}
}
void CircList::firster()
{
current = first;
}
int CircList::get_current_data() const
{
return current->data;
}
ListNode* CircList::get_current_ptr() const
{
return current;
}
int CircList::get_current_pos() const
{
int pos = 1;
ListNode* temp = first;
while(temp!=current)
{
pos++;
temp = temp->link;
}
return pos;
}
int CircList::get_first_data() const
{
return first->data;
}
int CircList::get_last_data() const
{
return last->data;
}
bool CircList::insert(int x)
{
ListNode* p = new ListNode(x);
p->link = first;
first = p;
last->link = first;
len++;
return true;
}
inline bool CircList::is_empty() const
{
return first == 0;
}
int CircList::length() const
{
return len;
}
bool CircList::move_next()
{
current = current->link;
return true;
}
bool CircList::move_prior()
{
ListNode* temp = first;
while(temp->link != current)
temp = temp->link;
current = temp;
return true;
}
bool CircList::remove()
{
if(!is_empty()){
ListNode* next = current->link;
if(current == last){
move_prior();
current->link = first;
delete last;
last = current;
}
else if(current == first){
first = current->link;
last->link = first;
delete current;
}
else{
ListNode* pre;
move_prior();
pre = current;//现在的current实际上是前一个
move_next();//恢复到当前位置
pre->link = current->link;
delete current;
}
len--;
if(len == 0)
first = last = current = 0;//当循环链表为空时,将三个指针置空
else
current = next;//current指向删除元素的下一个元素
return true;
}
else
return false;
}
bool CircList::remove(int x)
{
ListNode *pre,*del;
del = first;
while(del->data != x)
{
pre =del;
del = del->link;
}
if(del == first){
first = del->link;
delete del;
}
else if(del == last){
pre->link = first;
delete last;
last = pre;
}
else{
pre->link = del->link;
delete del;
}
len--;
return true;
}
bool CircList::set_current_ptr(ListNode* p)
{
current = p;
return true;
}
bool CircList::search(int x)
{
ListNode* temp = first;
while(temp->data!=x && temp!=last)
{
temp = temp->link;
}
if(temp==last && last->data==x){
current = last;
return true;
}
else if(temp==last && last->data!=x){
return false;
}
else{
current = temp;
return true;
}
}
void CircList::print() const
{
ListNode* move = first;
while(move != last)
{
cout<<move->data<<" ";
move = move->link;
}
cout<<last->data<<endl;
}
//main.cpp
#include "CircList.h"
#include <iostream>
using std::cout;
using std::endl;
int main(int argc,char** argv)
{
CircList list(1);
list.insert(2);
list.insert(3);
list.insert(4);
list.insert(5);
list.insert(6);
list.insert(7);
list.insert(8);
list.print();
int len = list.length();
cout<<len<<endl;
list.firster();
list.remove();
list.print();
list.move_next();
list.remove();
list.print();
list.move_prior();
list.remove();
list.print();
list.remove(5);
list.print();
len = list.length();
cout<<len<<endl;
cout<<list.is_empty()<<endl;
return 0;
}