c++实现单向循环链表

#include<iostream>
using namespace std;

template <class T>
class Node
{
public:
	T data;
	Node<T>* next;
};

template <class T>
class CLinkList
{
public:
	CLinkList();
	~CLinkList();
	int getLength() { return this->length; };
	void createList();
	void printList();
	void insert(int No, T data);
	bool isEmpty();
	Node<T>* getElem(int No);
	void Delete(int No);
	void printAll();
private:
	Node<T>* rear;
	int length;
};

template <class T>
CLinkList<T>::CLinkList()
{
	rear = new Node<T>;
	rear->next = rear;
	this->length = 0;
}

template <class T>
CLinkList<T>::~CLinkList()
{
	Node<T>* p = rear;
	for(int i=0;i<this->length+1;i++)//这里要比链表长度多析构一个,这个+1是头结点
	{
		rear = p;
		p = p->next;
		delete rear;
	}
}

template <class T>
void CLinkList<T>::createList()
{
	Node<T>* p = rear->next;//建立工作指针
	int length = 0;
	T data;
	cout << "输入新链表长度" << endl;
	cin >> length;
	this->length = length;
	for (int i = 0; i < length; i++)
	{
		Node<T>* temp = new Node<T>;
		cout << "输入第" << i + 1 << "个数据" << endl;
		cin >> data;
		temp->data = data;
		//这两步就不难了,让当前结点的指针域和工作指针的结点指针域相同
		//就是让工作结点指向当前结点
		//然后更新工作结点p。
		p->next = temp;
		p = temp;
	}
	Node<T>* pRear;
	pRear = p;//临时指针,让rear和p互换
	p = rear;//更新尾指针
	rear = pRear;
	rear->next = p;//让链表循环*/
	//cout << rear->data << endl;
	cout << "尾指针数据1:" << this->rear->data << endl;
};

template <class T>
void CLinkList<T>::printList()
{
	Node<T>* p = rear->next;
	for(int i=0;i<this->getLength();i++)
	{
		p = p->next;
		cout << p->data << "  ";
	}
	cout << endl;
}
template <class T>
void CLinkList<T>::insert(int No, T data)
{
	
	Node<T>* temp = new Node<T>;

	if (No < length-1 && No>0)
	{
		Node<T>* p = this->getElem(No);

		temp->data = p->data;
		p->data = data;
		temp->next = p->next;
		p->next = temp;
		this->length++;
		
	}

	else if (No == length)
	{
		Node<T>* p = rear;
		temp->data = data;
		temp->next = p->next;
		p->next = temp;
		rear = temp;
		this->length++;
		cout << "尾指针数据2:" << this->rear->data << endl;
	}
	else
	{
		cout << "输入错误" << endl;
		return;
	}
	
}

template <class T>
bool CLinkList<T>::isEmpty()
{
	if (rear->next = rear)
	{
		return true;
	}
	else
	{
		return false;
	}
}

template <class T>
Node<T>* CLinkList<T>::getElem(int No)
{
	if (No < this->length && No >= 0)
	{
		Node<T>* p = rear->next->next;//初始化工作指针让他指向首元结点
		int j = 0;
		while (No != j)
		{
			p = p->next;
			j++;
		}
		return p;
	}
	else
	{
		cout << "输入有误" << endl;
		return NULL;
	}
}


template <class T>
void CLinkList<T>::Delete(int No)
{
	Node<T>* p = this->getElem(No);
	Node<T>* priorP=p;
	for (int i = 0; i < this->getLength() ; i++)//利用循环的特点找到要删除的结点的前一个结点
	{
		priorP = priorP->next;
	}
	priorP->next = p->next;
	delete p;
	this->length--;

}
template <class T>
void CLinkList<T>::printAll()
{
	Node<T>* p = rear;
	for (int i = 0; i <= length; i++)
	{
		p = p->next;
		cout << p->data << "  " ;
	}
	cout<<endl;
}

int main()
{
	CLinkList<int> CL1;
	CL1.createList();
	CL1.printList();
	CL1.insert(1, 100);
	CL1.printList();
	CL1.printAll();
	//CL1.Delete(3);
	//CL1.printList();
	system("pause");
	return 0;
}

插入部分还有毛病,心情不好,回头再改。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值