数据结构--环状链表

本文介绍了环状链表这一特殊的链表形式,它将循环判断条件由NULL改为first,插入操作需注意越界循环。同时,文章提供了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环状链表是链表的特殊形式其区别在于将循环中的判断条件NULL更换成first
而insert()等查函数根据实际情况考虑是否有越界循环情况
其他大部分相同
代码如下

#include<iostream>
using namespace std;
template<class T>
struct LinkNode
{
	T data;
	LinkNode<T>* link;
	LinkNode(LinkNode<T>* ptr = NULL) { link = ptr; }
	LinkNode(T item, LinkNode<T>* ptr = NULL) { link = ptr; data = item; }
};
template<class T>
class CircleList
{
private:
	LinkNode<T>* first;
public:
	CircleList() { first = new LinkNode<T>; first->link = first; }
	CircleList(CircleList<T>& L);
	~CircleList();
	int Length()const;
	bool isEmpty()const;
	CircleList<T>* getHead()const { return first; }
	CircleList<T>* Search(T x)const;
	T getData(int i)const;
	void setData(int i, T x);
	bool insert(int i, T x);
	bool remove(int i, T& x);
	void input();
	void output();
};
template<class T>
bool CircleList<T>::isEmpty()const
{
	return first->link == first;
}
template<class T>
CircleList<T>::CircleList(CircleList<T>& L)
{
	LinkNode<T>* p = first->link;
	LinkNode<T>* q = L.getHead()->link;
	while (q != first)
	{
		LinkNode<T>* r = new LinkNode<T>(q->data);
		p->link = r;
		p = p->link;
		q = q->link;
	}
	p->link = first;
}
template<class T>
CircleList<T>::~CircleList()
{
	LinkNode<T>* p = first->link;
	while (p != first)
	{
		LinkNode<T>* q = p;
		p = p->link;
		delete q;
	}
	delete p;
}
template<class T>
int CircleList<T>::Length()const
{
	int count = 0;
	LinkNode<T>* p = first->link;
	while (p != first)
	{
		count++;
		p = p->link;
	}
	return count;
}
template<class T>
CircleList<T>* CircleList<T>::Search(T x)const
{
	LinkNode<T>* p = first->link;
	while (p != first)
	{
		if (p->data == x)
		{
			return p;
		}
		p = p->link;
	}
	return NULL;
}
template<class T>
T CircleList<T>::getData(int i)const
{
	int count = 0;
	LinkNode<T>* p = first->link;
	while (1)
	{
		if(p!=first)
		count++;
		if (count == i)
		{
			return p->data;
		}
		p = p->link;
	}
	return count;
}
template<class T>
void CircleList<T>::setData(int i, T x)
{
	int count = 0;
	LinkNode<T>* p = first->link;
	while (p != first)
	{
		count++;
		if (count == i)
		{
			p->data = x;
		}
		p = p->link;
	}
}
template<class T>
bool CircleList<T>::insert(int i, T x)
{
	if (i <= 0 || i >= Length() + 1)
	{
		return false;
	}
	int count = 0;
	LinkNode<T>* p = first->link;
	while (p != first)
	{	count++;
		if (count == i-1)
		{
			break;
		}
		
		p = p->link;
	}
	LinkNode<T>* q = new LinkNode<T>(x);
	q->link = p->link;
	p->link = q;
	return true;

}
template<class T>
bool CircleList<T>::remove(int i,T&x)
{
	if (i <= 0 || i >= Length()||isEmpty())
	{
		return false;
	}
	int count = 0;
	LinkNode<T>* p = first->link;
	while (p != first)
	{
		count++;
		if (count == i - 1)
		{
			break;
		}
		
		p = p->link;
	}
	LinkNode<T>* q = p->link;
	x = p->data;
	p->link = q->link;
	delete q;
	return true;
}
template<class T>
void CircleList<T>::input()
{
	int count = 0;
	cout << "请输入链表初始大小" << endl;
	while (count <= 0)
	   cin >> count;
	cout << "请输入每一个值" << endl;
	LinkNode<T>* p = first;
	while (count--)
	{
		T temp; cin >> temp;
		LinkNode<T>* q = new LinkNode<T>(temp);
		p->link = q;
		p = p->link;
	}
	p->link = first;
}
template<class T>
void CircleList<T>::output()
{
	LinkNode<T>* p = first->link;
	while (p != first)
	{
		cout << p->data << " ";
		p = p->link;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值