【C++篇】list模拟实现

实现接口:

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

  2. operator=重载

  3. 实现迭代器

  4. push_back()

  5. push_front()

  6. erase()

  7. insert()

  8. 头尾删

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

    namespace liu
    {
    //定义list节点
    template
    struct list_node
    {
    T _data;
    list_node* _prev;
    list_node* _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;
     }

    }

相关推荐
Scott9999HH6 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_841495647 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
Yana.nice7 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
fqbqrr7 小时前
2607C++,soui与安卓
c++·soui
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海7 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
2601_960567969 小时前
电商套图自动化效率的工程量化分析——从逐张生成到批量套图的架构演进
运维·架构·自动化
吳所畏惧10 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh