大二下开始学数据结构与算法--07,单项循环链表的实现

自习所完成的任务

  1. 单向循环链表代码的实现和测验

任务

  1. 学课程到p28
  2. 复现相关代码

感悟

  1. 其实这个教程上的观念,跟我刚开始理解想的并不一样,我以为会是:头节点使实例化的节点的循环链表,但是,教程给的更像是存在头节点,但头节点没有实际意义的添加了尾节点单项循环链表(跟之前单向不循环链表相比,更像是只多了一尾节点)。
#include
#include
#include
using namespace std;

//存在头节点的单项循环链表的实现
class CircleClink
{
private:
	struct Node
	{
		Node(int val=0):date_(val),next_(nullptr){}
		int date_;
		Node*next_;
	};

	Node *head_;//指向头节点
	Node*tail_;//指向末尾节点

public:
	CircleClink()
	{
		head_=new Node();
		head_->next_=head_;
		tail_=head_;
	}
	
	~CircleClink()
	{
		Node *p=head_->next_;
		while(p!=head_)
		{
			head_->next_=p->next_;
			delete p;
			p=head_->next_;
		}
		delete head_;
	}

public:
	//尾插法,O(1),常量时间
	void InsertTail(int val)
	{
		Node*node=new Node(val);
		node->next_=tail_->next_;
		tail_->next_=node;
		tail_=node;/*tail_指针的引进,固然使处理变得方便,但,也要时刻注意对新引进变量的状态更新,以免出错*/
	}

	//头插法,O(1),常量时间
	void InsertHead(int val)
	{
		Node *node=new Node(val);
		node->next_=head_->next_;
		head_->next_=node;
		//if(node->next_==head_)
		//{
		//	tail_=node;
		//}
		if(head_==tail_)//自己写的一会测试一下
		{
			tail_=node;
		}
		
	}
	//删除最先特定值节点
	void RemoveOne(int val)
	{
		Node *p=head_->next_;
		Node *q=head_;

		while(p!=head_)//为什么这样写?
		{
			if(p->date_==val)
			{
				if(p->next_==head_)
				{
					tail_=q;
				}
				q->next_=p->next_;
				delete p;
				p=q->next_;
				return ;
			}
			else/*这里很关键,当删除一个值后,应该进行下一次循环,如果直接进行else里面的语句的话,将会跳过新指向的点*/
			{
				q=p;
				p=p->next_;
			}
			
		}
	}

	//删除全部特定值节点
	void RemoveAll(int val)
	{
		Node *p=head_->next_;
		Node *q=head_;

		while(p!=head_)//为什么这样写?
		{
			if(p->date_==val)
			{
				if(p->next_==head_)//这里是我自己写的,一会测试一下?
				{
					tail_=q;
				}
				q->next_=p->next_;
				delete p;
				p=q->next_;
				/*if(q->next_==head_)
				{
					tail_=q;
				}*/
			}
			else
			{
				q=p;
				p=p->next_;
			}

		}
	}

	//查询
	bool Find(int val)
	{
		Node *p=head_->next_;
		while(p!=head_)
		{
			if(p->date_==val)
			{
				return true;
			}
		}
		return false;
	}


	//单项循环链表的展示
	void Show()
	{
		Node *p=head_->next_;
		while(p!=head_)
		{
			cout<date_<<" ";
			p=p->next_;
		}
	}
};


//main主函数
int main()
{
	CircleClink link;
	srand(time(0));
	for(int i=0;i<10;i++)
	{
		link.InsertHead(rand()%100);
		//link.InsertHead(1);
	}
	link.InsertHead(100);
	link.InsertTail(200);
	link.Show();
	cout<

你可能感兴趣的:(链表,数据结构)