/**
 * Run code pada text editor masing masing agar lebih jelas outputnya
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct Number {
    int number;

    struct Number *prev;
    struct Number *next;
} Number;

Number *HEAD = NULL;

void insertBeginning(int value);
void insertEnd(int value);
void insertBefore(int key, int value);
void insertAfter(int key, int value);
void deleteBeginning();
void deleteEnd();
void deleteAt(int key);

void main() {
    // Agar mudah dipahami, hapus satu satu tanda komentar pada kode dibawah dan run bertahap
    // insertEnd(1);
    // insertEnd(2);
    // insertEnd(4);
    // insertBefore(1, 0);
    // insertAfter(2, 3);
    // deleteBeginning();
    // deleteEnd();
    // deleteAt(2);

    Number *HEAD_copy = HEAD;
    while (HEAD_copy != NULL) {
        printf("---------------------------------\n");
        if (HEAD_copy->prev != NULL)
            printf("\033[33m< \033[1;33mprevious\033[0;33m node address: \033[4;33m%p\033[m\n", HEAD_copy->prev);
        else
            printf("\033[33m< \033[1;33mprevious\033[0;33m node address: \033[4;33m%s\033[m\n", HEAD_copy->prev);

        printf("\033[34m* \033[1;34mcurrent\033[0;34m node address: \033[4;34m%p\033[m\n", HEAD_copy);
        printf("\033[30m* current node value: %d\n\033[m", HEAD_copy->number);

        if (HEAD_copy->next != NULL)
            printf("\033[32m> \033[1;32mnext\033[0;32m node address: \033[4;32m%p\033[m\n", HEAD_copy->next);
        else
            printf("\033[32m> \033[1;32mnext\033[0;32m node address: \033[4;32m%s\033[m\n", HEAD_copy->next);

        HEAD_copy = HEAD_copy->next;
    }

    printf("---------------------------------\n");
}

void insertBeginning(int value) {
    Number *newNode = (Number*) malloc(sizeof(Number));
    newNode->number = value;
    newNode->prev = NULL;

    if (HEAD != NULL) {
        HEAD->prev = newNode;
        newNode->next = HEAD;
    } else
        newNode->next = NULL;

    HEAD = newNode;
}

void insertEnd(int value) {
    Number *newNode = (Number*) malloc(sizeof(Number));
    newNode->number = value;
    newNode->next = NULL;

    if (HEAD != NULL) {
        Number *currentNode = HEAD;

        while (currentNode->next != NULL)
            currentNode = currentNode->next;

        currentNode->next = newNode;
        newNode->prev = currentNode;
    } else {
        newNode->prev = NULL;
        HEAD = newNode;
    }
}

void insertBefore(int key, int value) {
    Number *newNode = (Number*) malloc(sizeof(Number));
    newNode->number = value;

    if (HEAD != NULL) {
        Number *currentNode = HEAD;

        while (currentNode != NULL) {
            if (currentNode->number == key) {
                if (currentNode->prev != NULL)
                    currentNode->prev->next = newNode;
                else
                    HEAD = newNode;

                newNode->prev = currentNode->prev;
                newNode->next = currentNode;
                currentNode->prev = newNode;

                return;
            }

            currentNode = currentNode->next;
        }
    } else {
        newNode->prev = NULL;
        newNode->next = NULL;
        HEAD = newNode;
    }
}

void insertAfter(int key, int value) {
    Number *newNode = (Number*) malloc(sizeof(Number));
    newNode->number = value;

    if (HEAD != NULL) {
        Number *currentNode = HEAD;

        while (currentNode != NULL) {
            if (currentNode->number == key) {
                newNode->next = currentNode->next;
                newNode->prev = currentNode;

                if (currentNode->next != NULL)
                    currentNode->next->prev = newNode;

                currentNode->next = newNode;

                return;
            }

            currentNode = currentNode->next;
        }
    } else {
        newNode->prev = NULL;
        newNode->next = NULL;
        HEAD = newNode;
    }
}

void deleteBeginning() {
    if (HEAD != NULL) {
        Number *firstNode = HEAD;
        HEAD = HEAD->next;
        HEAD->prev = NULL;

        free(firstNode);
    }
}

void deleteEnd() {
    if (HEAD != NULL) {
        Number *currentNode = HEAD;

        while (currentNode->next != NULL)
            currentNode = currentNode->next;
        
        currentNode->prev->next = NULL;
        free(currentNode);
    }
}

void deleteAt(int key) {
    if (HEAD != NULL) {
        Number *currentNode = HEAD;

        while (currentNode != NULL) {
            if (currentNode->number == key) {
                if (currentNode->next == NULL) {
                    currentNode->prev->next = NULL;
                } else if (currentNode->prev == NULL) {
                    currentNode->next->prev = NULL;
                    HEAD = currentNode->next;
                } else {
                    currentNode->prev->next = currentNode->next;
                    currentNode->next->prev = currentNode->prev;
                }

                free(currentNode);
                return;
            }

            currentNode = currentNode->next;
        }
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: