CCCPaste

Untitled

#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;
}