#include <iostream>
using namespace std;
class Node{
public:
Node *next;
Node *previous;
int element;
Node(int element,Node *next,Node *previous){
this->element=element;
this->next=next;
this->previous=previous;
}
};
class LinkedList{
public:
LinkedList();
~LinkedList(){};
void addFirst(int);
void addLast(int);
void add(int index, int element);
int getFirst();
int getLast();
int get(int);
int removeFirst();
int removeLast();
int remove(int);
void iterate();
private:
Node *header;
int size;
};
LinkedList::LinkedList()
{
header = new Node(0, NULL, NULL);
header->next = header;
header->previous = header;
size = 0;
}
void LinkedList::addFirst(int i)
{
header->next = new Node(i, header->next, header);
header->next->next->previous = header->next;
++size;
}
void LinkedList::addLast(int i)
{
header->previous=new Node(i,header,header->previous);
header->previous->previous->next=header->previous;
++size;
}
void LinkedList::add(int index, int element)
{
if(index > size || index < 0)
{
cout << "Exception in add(): Index out of bound." << '\n';
return;
}
Node *entry;
entry=header->next;
for(int i=0;i<index;i++)
{
entry=entry->next;
}
entry->previous->next=new Node(element,entry,entry->previous);
entry->previous=entry->previous->next;
++size;
}
int LinkedList::getFirst()
{
if(!size)
{
cout << "Exception in getFirst(): List is empty." << endl;
}
return header->next->element;
}
int LinkedList::getLast()
{
if(!size)
{
cout<<"Exception in getFirst(): List is empty."<<endl;
}
return header->previous->element;
}
int LinkedList::removeFirst()
{
int remove=header->next->element;
header->next=header->next->next;
header->next->previous=header;
--size;
return remove;
}
int LinkedList::removeLast()
{
int remove=header->previous->element;
header->previous=header->previous->previous;
header->previous->next=header;
--size;
return remove;
}
int LinkedList::remove(int index)
{
if(index > size || index < 0)
{
cout << "Exception in add(): Index out of bound." << '\n';
return 0;
}
Node *entry;
entry=header->next;
for(int i=0;i<index;i++)
{
entry=entry->next;
}
int remove=entry->element;
entry->previous->next=entry->next;
entry->next->previous=entry->previous;
--size;
return remove;
}
/*
* 用来输出所有元素的迭代方法。
*/
void LinkedList::iterate()
{
if(!size) {
cout << "Exception in iterate(): List is empty." << '\n';
return;
}
for(Node *entry = header->next; entry != header; entry = entry->next)
cout << entry->element << " ";
cout << '\n';
}
int main()
{
LinkedList myList;
myList.addFirst(3);
myList.addFirst(5);
myList.addFirst(7);
myList.iterate();
myList.addLast(9);
myList.removeFirst();
myList.iterate();
myList.removeLast();
myList.add(1,8);
myList.iterate();
myList.remove(1);
myList.iterate();
}