【C++篇】list模拟实现

实现接口:

  1. list的无参构造、n个val构造、拷贝构造

  2. operator=重载

  3. 实现迭代器

  4. push_back()

  5. push_front()

  6. erase()

  7. insert()

  8. 头尾删

    #pragma once
    #include<iostream>
    #include<assert.h>
    using namespace std;

    namespace liu
    {
    //定义list节点
    template<class T>
    struct list_node
    {
    T _data;
    list_node<T>* _prev;
    list_node<T>* _next;

    复制代码
     	list_node(const T& x=T())
     		:_data(x)
     		,_prev(nullptr)
     		,_next(nullptr)
     	{}
     };
    
     template<class T,class Ref,class Ptr>
     struct list_iterator
     {
     	typedef list_node<T>Node;
     	typedef list_iterator<T, Ref, Ptr>Self;
     	Node* _node;
    
     	list_iterator(Node* node)
     		:_node(node)
     	{}
    
     	Ref operator*()
     	{
     		return _node->_data;
     	}
     	
     	Ptr operator->()
     	{
     		return &_node->_data;
     	}
    
     	Self& operator++()
     	{
     		_node = _node->_next;
     		return *this;
     	}
    
     	Self& operator--()
     	{
     		_node = _node->_prev;
     		return *this;
     	}
    
     	bool operator!=(const Self& s)
     	{
     		return _node != s._node;
     	}
    
     	bool operator==(const Self& s)
     	{
     		return _node == s._node;
     	}
     };
    
    
    
     template<class T>
     class list
     {
     	//链表存储链表节点
     	typedef list_node<T> Node;
     public:
     	//实现接口
     	typedef list_iterator<T, T&,  T*>iterator;
     	typedef list_iterator<T, const T&, const T*> const_iterator;
     	void empty_init()
     	{
     		_head = new Node();
     		_head->_prev = _head;
     		_head->_next = _head;
     	}
    
     	list()//无参构造
     	{
     		empty_init();
     	}
    
     	list(size_t n,const T& val=T())//n个val
     	{
     		empty_init();
     		for (int i=0;i<n;i++)
     		{
     			push_back(val);
     		}
     	}
    
     	list(const list<T>& i1)
     	{
     		empty_init();
     		for(auto& x:i1)
     		{
     			push_back(x);
     		}
     	}
    
     	~list()
     	{
     		clear();
    
     		delete _head;
     		_head = nullptr;
     	}
    
     	void clear()
     	{
     		auto it = begin();
     		while (it!=end())
     		{
     			it=erase(it);
     		}
     	}
    
     	iterator begin()
     	{
     		return iterator(_head->_next);
     	}
    
     	const_iterator begin()const
     	{
     		return const_iterator(_head->_next);
     	}
    
     	iterator end()
     	{
     		return iterator(_head);
     	}
    
     	const_iterator end()const
     	{
     		return const_iterator(_head);
     	}
    
    
     	iterator insert(iterator pos,const T&val)
     	{
     		
    
     		Node* new_node = new Node(val);
     		Node* cur = pos._node;
     		Node* prev = cur->_prev;
    
     		prev->_next = new_node;
     		new_node->_prev = prev;
    
     		cur->_prev = new_node;
     		new_node->_next = cur;
    
     		return iterator(new_node);
     	}
    
     	iterator erase(iterator pos)
     	{
     		assert(pos!=end());
    
     		Node* del = pos._node;
     		Node* prev = del->_prev;
     		Node* next = del->_next;
    
     		prev->_next = next;
     		next->_prev = prev;
     		delete del;
    
     		return iterator(next);
    
     	}
    
     	void pop_front()
     	{
     		erase(begin());
     	}
    
    
     	void pop_back()
     	{
     		erase(--end());
     	}
    
     	void swap(list<T>& i1)
     	{
     		std::swap(_head,i1._head);
     	}
    
     	
    
     	list<T>& operator=(list<T> il)
     	{
     		swap(il);
     		return *this;
     	}
    
     	void push_back(const T& x)
     	{
     		/*Node* new_node = new Node(x);
     		Node* tail = _head->_prev;
    
     		tail->_next = new_node;
     		new_node->_prev = tail;
    
     		new_node->_next = _head;
     		_head->_prev = new_node;*/
     		insert(end(),x);
     	}
    
     	void push_front(const T& x)
     	{
     		/*Node* new_node = new Node(x);
     		Node* prev = _head->_next;
    
     		_head->_next = new_node;
     		new_node->_prev = _head;
    
     		prev->_prev = new_node;
     		new_node->_next = prev;*/
     		insert(begin(), x);
     	}
     private:
     	Node* _head;//双端链表,哨兵位
     };
    
     template<class T>
     void swap(T&a,T& b)
     {
     	T c(a);
     	a = b;
     	b = c;
     }
     template<class T>
     void swap(list<T>& a, list<T>& b)
     {
     	a.swap(b);
     }
     
    
     void test1()
     {
     	/*liu::list<int>i1;
     	i1.push_back(1);
     	i1.push_back(2);
     	i1.push_back(3);
     	i1.push_back(4);
    
     	i1.push_front(5);
     	i1.push_front(6);
     	i1.push_front(7);
    
     	liu::list<int>::iterator it1 = i1.begin();
     	while (it1!=i1.end())
     	{
     		cout << *it1 << " ";
     		++it1;
     	}
     	cout << endl;
     	liu::list<int>::iterator it2 = i1.begin();
     	it2=i1.erase(it2);
     	while (it2 != i1.end())
     	{
     		cout << *it2 << " ";
     		++it2;
     	}*/
    
     	liu::list<int>i1(10,1);
     	liu::list<int>i2(10,2);
     	liu::swap(i1, i2);
    
     	for (auto x : i2)
     	{
     		cout << x << " ";
     	}
     	cout << endl;
    
     	for (auto x : i1)
     	{
     		cout << x << " ";
     	}
     	cout << endl;
     }

    }

相关推荐
小程要毕业1 小时前
pdf图片导出(Visio\Origin\PPT)
运维·服务器
Logan Lie1 小时前
Go 语言范围循环变量重用问题与 VSCode 调试解决方法
开发语言·vscode·golang
Despacito0o1 小时前
C++面向对象编程实战:继承与派生全解析
开发语言·c++
whoarethenext1 小时前
c/c++的opencv双边滤波
c语言·c++·opencv·双边滤波
清水白石0082 小时前
WebSockets 在实时通信中的应用与优化
开发语言·汇编·python·websockets
冷凝女子4 小时前
【QT】QString和QStringList去掉空格的方法总结
开发语言·qt
Logan Lie5 小时前
在 Ubuntu 终端中配置网络代理:优化 npm、apt等的下载速度
linux·ubuntu·npm·代理模式
网硕互联的小客服5 小时前
如何安全配置数据库(MySQL/PostgreSQL/MongoDB)
linux·运维·服务器·网络·windows
reduceanxiety6 小时前
机试 | vector/array Minimum Glutton C++
数据结构·c++·算法
TDengine (老段)7 小时前
TDengine 中集群维护
大数据·运维·数据库·时序数据库·tdengine·涛思数据·物联