#include <iostream>
template <class T>
struct Node
{
T data;
Node *pre;
Node *next;
};
template <class T>
class DoubleList
{
public:
DoubleList();
~DoubleList();
public:
int doublelink_Insert(DoubleList* ptr, int position, T merber);
int doublelink_Erase(DoubleList * ptr, int position);
void doublelink_Shows(DoubleList *ptr, int num);
private:
Node<T> * root;
public:
int length;
};
template<class T>
DoubleList<T>::DoubleList()
{
root = new Node<T>;
root->pre = NULL;
root->next = NULL;
}
template<class T>
DoubleList<T>::~DoubleList()
{
}
template<class T>
int DoubleList<T>::doublelink_Insert(DoubleList * ptr, int position, T merber)
{
Node<T> * node = new Node<T>;
node->data = merber;
if (ptr->length == 0)
{
root->next = node;
node->pre = node;
node->next = node;
ptr->length++;
return 0;
}
else
{
if (position == 0)
{
node->pre = root->next->pre;
node->next = root->next;
root->next->pre->next = node;
root->next->pre = node;
root->next = node;
ptr->length++;
return 0;
}
else
{
Node<T>* currnet = root->next;
for (int i = 0; i < position; i++)
{
currnet = currnet->next;
}
node->next = currnet;
node->pre = currnet->pre;
currnet->pre->next = node;
currnet->pre = node;
ptr->length++;
return 0;
}
}
}
template<class T>
int DoubleList<T>::doublelink_Erase(DoubleList * ptr, int position)
{
if (ptr->length == 0)
{
std::cout << " 已经删除完 "<< std::endl;
}
else
{
if (ptr->length == 1)
{
ptr->root->next = NULL;
ptr->length--;
}
else
{
Node<T> *deleteNode = root->next;
for (int i = 0; i < position; i++)
{
deleteNode = deleteNode->next;
}
deleteNode->pre->next = deleteNode->next;
deleteNode->next->pre = deleteNode->pre;
delete deleteNode;
ptr->length--;
}
}
return 0;
}
template<class T>
void DoubleList<T>::doublelink_Shows(DoubleList * ptr, int num)
{
Node<T> *current = root->next;
for (int i = 0; i < num; i++)
{
std::cout << current->data << " ";
current = current->next;
}
std::cout << std::endl;
}
int main()
{
DoubleList<int>* doublelink_ptr = new DoubleList<int>;
for (int i = 0; i< 10; i++)
{
doublelink_ptr->doublelink_Insert(doublelink_ptr, 0, i);
}
doublelink_ptr->doublelink_Shows(doublelink_ptr, 20);
doublelink_ptr->doublelink_Erase(doublelink_ptr, 2);
doublelink_ptr->doublelink_Shows(doublelink_ptr, 20);
return 0;
}