循环链表

//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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值