【STL】模拟STL中的List轮

54 篇文章 0 订阅
3 篇文章 0 订阅

直接进入正题:

先来看看list轮是个什么东西


每一个节点都一个prev指针和一个next指针,除了第一个节点没有内容,但它的prev指针指向最后一个节点,最后一个元素的next指针指向第一个元节点

首先看看STL库中的list 接口:(本文全部用类模版实现)

要实现这么多的函数,这里只是实现基本的函数

定义节点结构

template<class T>
struct _ListNode
{
	_ListNode<T>* _prev;
	_ListNode<T>* _next;
	T _data;
	_ListNode(const T& x)
		:_prev(NULL)
		,_next(NULL)
		,_data(x)
	{
	}
};
模拟迭代器功能

template<class T,class Ref,class Ptr>
struct _ListIterator
{
	typedef _ListNode<T> Node;
	typedef _ListIterator<T,Ref,Ptr> Self;
	_ListIterator(Node* node)
		:_node(node)
	{}
	_ListIterator()
	{}
	Ref operator*()
	{
		return _node->_data;
	}
	/*Ref operator->()
	{
		return *this;
	}*/
	bool operator==(const Self& s)
	{

		return _node==s._node;
	}
	bool operator!=(const Self& s)
	{
		return _node!=s._node;
	}
	Self& operator++()//后置++,返回++之后的值
	{

		_node=_node->_next;
		return *this;
	}
	Self& operator++(int)//前置++,返回++之前的值
	{
		Self tmp(_node);
		_node=_node->_next;
		return tmp;
	}
	Self& operator--()//后置--,返回--后的值
	{
		_node=_node->_prev;
		return *this;
	}
	Self& operator--(int)//前置--,返回--前的值
	{
		Self tmp(_node);
		_node=_node->_prev;
		return tmp;
	}
	Node* _node;
};
模拟list取名MyList

template<class T>
class MyList
{
	typedef _ListNode<T> Node;
public:
	typedef _ListIterator<T,T&,T*> Iterator;
	typedef _ListIterator<T,const T&,const T*> ConstIterator;
	Node* BuyNode(const T& x)
	{

		Node* node=new Node(x);
		return node;
	}
	MyList()
	{
	_Head=BuyNode(T());
	_Head->_next=_Head;
	_Head->_prev=_Head;
	}
	void PushBack(const T& x)
	{
		Insert(End(),x);
	}
	void PushFront(const T& x)
	{

		Insert(Begin(),x);
	}
	void PopFront()
	{
	Earse(Begin());
	}
	void Insert(Iterator Pos,const T&x)
	{
		Node* cur=Pos._node;
		Node* prev=cur->_prev;
		Node* tmp=BuyNode(x);
		tmp->_next=cur;
		cur->_prev=tmp;
		prev->_next=tmp;
		tmp->_prev=prev;


	}
	void Earse(Iterator Pos)
	{

		assert(Pos!=End());
		Node* cur=Pos._node;
		Node* prev=cur->_prev;
		Node* next=cur->_next;
		next->_prev=prev;
		prev->_next=next;

	}
	Node* Find(const T& x)
	{
		Node* cur=_Head;
		while(cur)
		{
			if(cur->_data==x)

				break;

			cur=cur->_next;

		}
		return cur;
	}
<pre name="code" class="cpp">Iterator Begin()
{
return Iterator(_Head->_next);
}
Iterator End()
{
return Iterator(_Head);
}
Node* _Head;
};


 
 测试函数 

#include <iostream>
#include<cstdlib>
#include<ctime>
#include "MyList.h"
using namespace std;
void ListTest()
{

<pre name="code" class="cpp">	MyList<int> l;
	l.PushBack(1);
	l.PushBack(2);
	l.PushBack(3);
	l.PushBack(4);
	l.PushBack(5);
	l.Earse(l.Find(3));
	l.PushFront(7);
	l.PushFront(8);
	l.PushFront(9);
	l.PopFront();
	MyList<int>::Iterator iter=l.Begin();
	while (iter!=l.End())
	{
		cout<<*iter<<" ";
		++iter;
	}
	cout<<endl;
<pre name="code" class="cpp">}
int main()
{
long start,end;
start=clock();
ListTest();
end=clock();
cout<<end-start<<endl;
system("pause");
return 0;
}
 由于我的编译器太卡,所以用了一个clock()测试程序运行时间,但是没有什么卵用,测试1秒,出个程序至少30秒,这他吗就尴尬了 

哈哈哈哈哈哈




好的,我可以给您讲解一下如何模拟STLlist类。 List是一个双向链表,我们可以通过自己实现节点类和链表类来模拟这个数据结构。 首先,我们需要定义一个节点类,包含前驱节点指针、后继节点指针、以及存储数据的成员变量。代码如下: ``` template <typename T> class ListNode { public: T data; ListNode* prev; ListNode* next; ListNode(T data) : data(data), prev(nullptr), next(nullptr) {} }; ``` 接着,我们定义链表类,包含头节点指针和尾节点指针,以及一些常用的操作方法,如插入、删除、查找等。代码如下: ``` template <typename T> class List { public: List() : head(nullptr), tail(nullptr), size(0) {} ~List() { clear(); } void insert(T data) { ListNode<T>* node = new ListNode<T>(data); if (head == nullptr) { head = node; tail = node; } else { tail->next = node; node->prev = tail; tail = node; } size++; } void remove(T data) { ListNode<T>* node = head; while (node != nullptr) { if (node->data == data) { if (node == head) { head = node->next; if (head != nullptr) { head->prev = nullptr; } } else if (node == tail) { tail = node->prev; if (tail != nullptr) { tail->next = nullptr; } } else { node->prev->next = node->next; node->next->prev = node->prev; } delete node; size--; return; } node = node->next; } } ListNode<T>* find(T data) { ListNode<T>* node = head; while (node != nullptr) { if (node->data == data) { return node; } node = node->next; } return nullptr; } void clear() { ListNode<T>* node = head; while (node != nullptr) { ListNode<T>* next = node->next; delete node; node = next; } head = nullptr; tail = nullptr; size = 0; } int getSize() const { return size; } private: ListNode<T>* head; ListNode<T>* tail; int size; }; ``` 这样,我们就实现了一个简单的模拟STLlist类。您可以通过调用insert、remove、find等方法来操作链表的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值