#include
using namespace std;
struct node {
int val;
node * next;
node * prev;
};
struct DLL {
node *head;
void init() {
head = NULL;
}
void insertBegin(int x) {
node * new_node = new node;
new_node->val = x;
new_node->next = NULL;
new_node->prev = NULL;
if(head == NULL) {
head = new_node;
}
else {
new_node->next = head;
head->prev = new_node;
head = new_node;
}
}
void insertEnd(int x) {
node * new_node = new node;
new_node->val = x;
new_node->next = NULL;
new_node->prev = NULL;
if(head == NULL) {
head = new_node;
}
else {
node *tmp = head;
while(tmp->next != NULL) {
tmp = tmp->next;
}
tmp->next = new_node;
new_node->prev = tmp;
}
}
void insertAfterNode(int x, node *tmp) {
if(tmp->next == NULL) {
insertEnd(x);
}
else {
node *new_node = new node;
new_node->val = x;
new_node->next = tmp->next;
tmp->next->prev = new_node;
new_node->prev = tmp;
tmp->next = new_node;
}
}
void insertBefore(int x, node *tmp) {
if(tmp->prev == NULL) {
insertBegin(x);
}
else {
node *new_node = new node;
new_node->val = x;
new_node->prev = tmp->prev;
tmp->prev->next = new_node;
tmp->prev = new_node;
new_node->next = tmp;
}
}
void deleteBegin() {
if(head != NULL) {
if(head->next == NULL) {
delete head;
head = NULL;
}
else {
node *tmp = head;
head = head->next;
head->prev = NULL;
delete tmp;
}
}
}
void deleteEnd() {
if(head != NULL) {
if(head->next == NULL) {
delete head;
head = NULL;
}
else {
node *tmp = head;
while(tmp->next != NULL) {
tmp = tmp->next;
}
tmp->prev->next = NULL;
tmp->prev = NULL;
delete tmp;
}
}
}
void deleteAll() {
while(head != NULL) {
deleteBegin();
}
}
void print() {
node * tmp = head, *last_node;
while(tmp != NULL) {
cout << tmp->val << " <--> ";
last_node = tmp;
tmp = tmp->next;
}
cout << endl;
while(last_node != NULL) {
cout << last_node->val << " <--> ";
last_node = last_node->prev;
}
cout << endl;
}
};
int main() {
DLL dll;
dll.init();
dll.insertBegin(1);
dll.insertBegin(2);
dll.insertEnd(3);
dll.insertEnd(4);
dll.insertEnd(5);
node *tmp = dll.head;
tmp=tmp->next;
dll.insertAfterNode(6, tmp);
// dll.print();
tmp = dll.head;
tmp=tmp->next->next;
dll.insertBefore(7, tmp);
dll.print();
return 0;
}