list.h
#pragma once
#include<iostream>
#include<assert.h>
using namespace std;
namespace List
{
template<class T>
struct ListNode
{
ListNode<T>* _next;
ListNode<T>* _prev;
T _data;
ListNode(const T& data = T())
:_next(nullptr)
, _prev(nullptr)
, _data(data)
{
}
};
template<class T, class Ref, class Ptr>
struct ListIterator
{
typedef ListNode<T> Node;
Node* _node;
typedef ListIterator<T, Ref, Ptr> Self;
ListIterator(Node* node)
:_node(node)
{
}
Ref operator*()
{
return _node->_data;
}
Self operator++()
{
_node = _node->_next; // 修改 _node 指针
return *this;
}
Ptr operator->()
{
return &_node->_data;
}
bool operator!=(const Self& it)
{
return _node != it._node;
}
bool operator==(const Self& it)
{
return _node == it._node;
}
};
template<class T>
class list
{
typedef ListNode<T> Node;
public:
typedef ListIterator<T, T&, T*> iterator;
typedef ListIterator<T, const T&, const T*> const_iterator;
list()
{
_head = new Node();
_head->_next = _head;
_head->_prev = _head;
}
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);
}
void push_back(const T& x)
{
Node* newnode = new Node();
newnode->_data = x;
Node* prev = _head->_prev;
prev->_next = newnode;
newnode->_next =_head;
newnode->_prev = prev;
_head->_prev = newnode;
}
void pop_back()
{
Node* prev = _head->_prev;
prev->_prev->_next = _head;
_head->_prev = prev->_prev;
delete prev;
}
void pop_front()
{
Node* next = _head->_next;
_head->_next = next->_next;
next->_next->_prev = _head;
delete next;
}
void push_front(const T& x)
{
Node* newnode = new Node(x);
Node* next = _head->_next;
_head->_next=newnode;
newnode->_next = next;
newnode->_prev = _head;
next->_prev = newnode;
}
iterator insert(iterator pos, const T& x)
{
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* newnode = new Node(x);
prev->_next = newnode;
newnode->_prev = prev;
newnode->_next = cur;
cur->_prev = newnode;
return iterator(newnode);
}
iterator erase(iterator pos)
{
assert(pos != end());
Node* cur = pos._node;
Node* prev = cur->_prev;
Node* next = cur->_next;
prev->_next = next;
next->_prev = prev;
delete cur;
return iterator(next);
}
iterator find(iterator pos1, iterator pos2, T x)
{
while (pos1 != pos2)
{
if (pos1._node->_data == x)
{
return pos1;
}
++pos1;
}
return end();
}
private:
Node* _head;
};
};
测试代码
#include"mylist.h"
using namespace List;
void list_test1(list<int> lt)
{
//增删查
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.pop_back();
lt.pop_front();
lt.push_front(10);
}
void list_test2()
{
//迭代器测试
list<int> lt;
lt.insert(lt.end(), 1);
lt.insert(lt.end(), 2);
lt.insert(lt.end(), 3);
lt.insert(lt.end(), 4);
list<int>::iterator it = lt.begin();
while (it != lt.end())
{
*it += 10;
++it;
}
for (auto e : lt)
{
cout << e << ' ';
}
// 查找数据
it = lt.begin();//上面已经++为end()了,原来的迭代器不再指向begin()
list<int>::iterator it2 = lt.find(it, lt.end(), 12);
if (it2 != lt.end()) {
cout << "找到的数据为" << *it2 << endl; // 使用 *it2 来访问数据
}
else {
cout << "没有找到数据" << endl;
}
}
int main()
{
list<int> lt;
list_test2();
return 0;
}