代码模板实现双向链表的去重拼接合并排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码模板实现双向链表的去重拼接合并排序相关的知识,希望对你有一定的参考价值。

/*
	模板实现双向链表的去重、拼接、合并、排序
*/
#pragma once
#include<iostream>
template <class T>
struct Node
{
	T _data;
	Node<T> *_next;
	Node<T> *prev;
};
template <class T>
class SeqList
{
public:
	SeqList()
		:_head(NULL),
		_tail(NULL)
	{

	}
	SeqList(const SeqList & l)
	{

	}
	SeqList& operator = (const SeqList & l)
	{

	}
	~SeqList()
	{
		_Clear();
	}
	void PushBack(const T &x)
	{
		Node<T>* tmp = new Node<T>;
		InitNode(tmp, x);
		if (_head == NULL)
		{
			_head = _tail = tmp;
		}
		else
		{
			_tail->_next = tmp;
			tmp->prev = _tail;
			_tail = _tail->_next;
		}
	}
	void Unique()//去重
	{
		Node<T>*cur = _head;
		while (cur)
		{
			Node<T>*tmp = cur->_next;
			while (tmp)
			{
				Node<T>*DelTmp = tmp;

				if (cur->_data == tmp->_data)
				{
					if (tmp->_next)
					{
						cur->_next = tmp->_next;
						tmp->_next->prev = cur;
					}
					else
					{
						cur->_next = NULL;
					}
					tmp = tmp->_next;
					DelTmp->_next = NULL;
					DelTmp->prev = NULL;
					delete DelTmp;

				}
				else
					tmp = tmp->_next;
			}
			cur = cur->_next;
		}
	}
	void Sort()//排序
	{
		Node<T>*Cur = _head;
		while (Cur)
		{
			Node<T>*CurNext = Cur->_next;
			while (CurNext)
			{
				if (Cur->_data > CurNext->_data)
				{
					swap(Cur->_data, CurNext->_data);
				}
				CurNext = CurNext->_next;
			}
			Cur = Cur->_next;
		}
	}
	void Splice(Node<T>*pos, Node<T>*begin, size_t size)//拼接
	{
		Node<T>*end = begin;
		while (--size)
		{
			end = end->_next;
		}
		if (end->_next)
		{
			end->_next->prev = NULL;
		}
		end->_next = pos->_next;
		begin->prev = pos;
		if (pos->_next)
		{
			pos->_next->prev = end;
		}
		pos->_next = begin;
	}
	void Splice(Node<T>*pos, SeqList &l)
	{
		Node<T>*begin = l.Gethead();
		Node<T>*end = l.Gettail();
		end->_next = pos->_next;
		begin->prev = pos;
		if (pos->_next)
		{
			pos->_next->prev = end;
		}
		pos->_next = begin;
	}
	void Merge(SeqList &l)//合并
	{
		Splice(_tail, l);
		Sort();
		l._head = NULL;
		l._tail = NULL;
	}
	void InitNode(Node<T>*_node,const T &x)
	{
		_node->prev = NULL;
		_node->_next = NULL;
		_node->_data = x;
	}
	Node<T>* Gettail()
	{
		return _tail;
	}
	Node<T>*Gethead()
	{
		return _head;
	}
protected:
	void _Clear()
	{
		Node<T>*cur = _head;
		while (cur)
		{
			Node<T>*tmp = cur;
			cur = cur->_next;
			tmp->prev = NULL;
			tmp->_next = NULL;
			delete tmp;
		}
	}
	Node<T> *_head;
	Node<T> *_tail;
};

电脑没电了,如有不足希望批评指正,如有疑问也可以提问。

本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1751104

以上是关于代码模板实现双向链表的去重拼接合并排序的主要内容,如果未能解决你的问题,请参考以下文章

双向链表的原理与实现

数据结构c语言篇 《二》带头双向循环链表实现以及链表相关面试题(下)

数据结构c语言篇 《二》带头双向循环链表实现以及链表相关面试题(下)

双向链表排序c语言程序设计

双向链表排序c语言程序设计

双向链表的实现(双向链表与单向链表的简单区别联系和实现)