【数据结构】 双循环链表空间逆置

要求:建立双循环列表:
逆置前,正向输出:
头结点地址 每个结点地址 每个结点值
逆置后,正向输出
头结点地址 每个结点地址 每个结点值

代码:
双向链表:

template<typename T>
struct  Node
{
	T data;
	Node* next;
	Node* prior;
};

双循环列表:

template<typename T>
class CircleList
{
public:
	CircleList();
	~CircleList();
	int getlength()const;
	void push(T  element);
	void pop();
	void deleteelement(int index);
	void insert(int index, T element);
	T& operator[](int index);
	void print();
	void transfrom();
private:
	Node<T>* head;
	int length;
};

用到的主要函数:print(打印结点地址与值)与transform(逆置函数)

void print()
	{
		cout << "头结点地址:" << head << endl;
		Node<T>* p = head;
		if (length > 0)
		{
			for (int i = 1; i <= length;i++)
			{
				p = p->next;
				cout << "第" << i << "个结点的地址:" << p << ",结点数值:" << p->data << endl;
		    }
	    }
	}
	void transfrom()
	{
		Node<T>* s = head;
		for (int i = 0; i <= length; i++)
		{
			Node<T>* p = s->prior;
			Node<T>* n = s->next;
			s->prior = n;
			s->next = p;
			s = s->prior;
		}
	}

main函数:

CircleList<int> list;
	for (int i = 1; i <=10; i++)
	{
		list.push(i);
	}
	list.print();
	list.transfrom();
	list.print();
	return 0;

全部源代码:

#include<iostream>
#include<cstdlib>
using namespace std;
template<typename T>
struct  Node
{
	T data;
	Node* next;
	Node* prior;
};
template<typename T>
class CircleList
{

public:
	CircleList():length(0)
	{
		head = new Node<T>;
		head->next = head;
		head->prior = head;
	}
	~CircleList()
	{
		while (length)  pop();
		delete head;
	}
	int getlength()const { return length; }
	void push(T  element)
	{
		Node<T>* s = new Node<T>;
		s->data = element;
		head->prior->next = s;
		s->prior = head->prior;
		s->next = head;
		head->prior = s;
		length++;
	}
	void pop()
	{
		Node<T>*s = new Node<T>;
		s = head->prior;
		s->next = head;
		head->prior = s->prior;
		delete s;
		length--;
	}
	void deleteelement(int index)
	{
		if (index <= 0 || index > length)
		{
			cout << "输入错误,抛出" << endl;
			exit(8);
		}
		int i = 0;
		Node<T>*p = head;
		while (i != index )
		{
			p = p->next;
			i++;
		}
		Node<T>* s = new Node<T>;
		s = p;
		s->prior->next = s->next;
		s->next->prior = s->prior;
		delete s;
		length--;
	}
	void insert(int index, T element)
	{
		if (index > length || index <= 0)
		{
			cout << "输入错误,抛出" << endl;
			exit(8);
		}
		int i = 0;
		Node<T>*p = head;
		while (i != index - 1 && p != NULL)
		{
			p = p->next;
			i++;
		}
		Node<T>* s = new Node<T>;
		s->data = element;
		s->next = p->next;
		s->prior = p;
		p->next = s;
		s->next->prior = s;
		length++;
	}
	T& operator[](int index)
	{
		if (index <= 0 || index > length)
		{
			cout << "输入错误,抛出" << endl;
			exit(8);
		}
		int i = 0;
		Node<T>* p = head;
		while (i != index)
		{
			p = p->next;
			i++;
		}
		return p->data;
	}
	void print()
	{
		cout << "头结点地址:" << head << endl;
		Node<T>* p = head;
		if (length > 0)
		{
			for (int i = 1; i <= length;i++)
			{
				p = p->next;
				cout << "第" << i << "个结点的地址:" << p << ",结点数值:" << p->data << endl;
		    }
	    }
	}
	void transfrom()
	{
		Node<T>* s = head;
		for (int i = 0; i <= length; i++)
		{
			Node<T>* p = s->prior;
			Node<T>* n = s->next;
			s->prior = n;
			s->next = p;
			s = s->prior;
		}
	}

private:
	Node<T>* head;
	int length;
};
int main()
{
	CircleList<int> list;
	for (int i = 1; i <=10; i++)
	{
		list.push(i);
	}
	list.print();
	list.transfrom();
	list.print();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/RealCoder/article/details/106105721
今日推荐