#include<iostream>
#include<stdlib.h>
template<class T>
class List {
struct Node//雙向結點宣告
{
T data;
Node* prev, * next;
Node(const T& d = T(), Node* p = NULL, Node* n = NULL) :data(d), prev(p), next(n) {}
};
Node* head;//頭結點指標
Node* tail;//尾結點指標
int size;//資料結點個數
void Init()//初始化函式
{
size = 0; head = new Node; tail = new Node; head->next = tail; tail->prev = head;
}
public:
class const_iterator {
protected:
Node* current;
T& retrieve()const { return current->data; }
const_iterator(Node* p) :current(p) {}//轉換建構式
friend class List<T>;
public:
const_iterator() :current(NULL) {}
const T& operator*()const { return retrieve(); }//return current->data;
const_iterator& operator++()//前++
{
current = current->next;
return*this;
}
const_iterator operator++(int)//后++
{
const_iterator old = *this;//old=current;
++(*this);//current=current->next;
return old;
}
const_iterator& operator--()//前--
{
current = current->prev;
return*this;
}
const_iterator operator--(int)//后--
{
const_iterator old = *this;//old=current;
--(*this);//current=current->next;
return old;
}
bool operator==(const const_iterator* rhs)const
{
return current == rhs.current;
}
bool operator!=(const const_iterator& rhs)const
{
return current != rhs.current;
}
};
class iterator: public const_iterator
{
protected:
Node* current;
T& retrieve()const { return current->data; }
iterator(Node* p) :const_iterator(p) {}
friend class List<T>;
public:
iterator() {}
T& operator*() { return retrieve(); }
const T& operator*()const { return const_iterator::operator*(); }
iterator& operator++()//前++
{
current = current->next;
return *this;
}
iterator operator++(int)//后++
{
iterator old = *this;//old=current;
++(*this);//current=current->next;
return old;
}
iterator& operator--()//前--
{
current = current->prev;
return*this;
}
iterator operator--(int)//后--
{
iterator old = *this//old=current;
--(*this);//current=current->next;
return old;
}
};
List() { Init(); }//默認建構式。生成空表
List(const List<T>& l) { Init(); operator=(l); }//復制建構式
~List() { Clear(); delete head; delete tail; }//解構式
const List& operator=(const List& l);//復制賦值運算子函式
iterator Begin() { return iterator(head->next); }
const_iterator Begin()const { return const_iterator(head->next); }
iterator End() { return iterator(tail); }
const_iterator End()const { return const_iterator(tail); }
T& Front() { return*Begin(); }//回傳首元素的參考
const T& Front()const { return*Begin(); }//回傳首元素的常量型參考
T& Back() { return*--End(); }//回傳尾元素的參考
const T& Back()const { return *--End(); }//回傳尾元素的常量型參考
void Push_front(const T& item) { Insert(Begin(), item); }//首插
void Push_back(const T& item) { Insert(End(), item); }//尾插
void Pop_front() { Erase(Begin()); }//洗掉資料首結點
void Pop_back() { Erase(--End()); }//洗掉資料尾結點
iterator Erase(iterator itr);//洗掉指示器位置上的結點
iterator Insert(iterator itr, const T& item);//在指示器位置上插入item
int Size()const { return size; }//取資料結點個數
bool Empty()const { return size == 0; }//判空函式
void Clear() { while (!Empty())Pop_front(); }//清表。結果為空表
};
template<class T>//復制賦值成員運算子函式的實作
const List<T>& List<T>::operator=(const List<T>& l) {
Clear();//清為空表
for (const_iterator itr = l.Begin(); itr != l.End(); ++itr)//把表l的結點逐個復制
Push_back(*itr);
return*this;
}
template<class T>
typename List<T>::iterator
List<T>::Erase(iterator itr)
{
Node* p = itr.current;
iterator re(p->next);
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
size--;
return re;
}
template<class T>
typename List<T>::iterator
List<T>::Insert(iterator itr,const T&item)
{
Node* p = itr.current;
p->prev->next = new Node(item, p->prev, p);
p->prev = p->prev->next;
size++;
return iterator(p->prev);
}
指出來的位置是標紅的地方。。。求大佬指教
uj5u.com熱心網友回復:
沒有初始化p->prevuj5u.com熱心網友回復:
咋改呢大哥轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/44252.html
標籤:C++ 語言
