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

typedef struct Numbers {
    int number;
    struct Numbers *next;
} Numbers;

/**
 * unshift
 * Memasukkan node baru dari depan
*/
void unshift(int value);

/**
 * push
 * Memasukkan node baru dari belakang
*/
void push(int value);

/**
 * before
 * Memasukkan node baru sebelum node tertentu
*/
void before(int key,int value);

/**
 * before
 * Memasukkan node baru sesudah node tertentu
 * 
 * 
*/
void after(int key,int value);

void pop();
void shift();
void removeAt(int key);

/**
 * HEAD
 * Pointer awal untuk semua node
 */
Numbers *HEAD = NULL;

int main() {
    push(2);
    push(3);
    unshift(1);
    push(4);
    push(7);
    after(4, 5);
    push(8);
    before(7, 6);
    push(9);
    after(9, 10);
    removeAt(5);
    pop();
    shift();

    Numbers *copyHead = HEAD;

    while (copyHead != NULL) {
        printf("%d\n", copyHead->number);
        copyHead = copyHead->next;
    }

    return 0;
}

void unshift(int value) {
    Numbers *newNode = (Numbers*) malloc(sizeof(Numbers));
    newNode->number = value;
    newNode->next = HEAD;

    HEAD = newNode;
}

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

    Numbers *currentNode = HEAD;

    if (currentNode != NULL) {
        // mengiterasi seluruh node hingga bertemu node yang next nya bernilai null
        while (currentNode->next != NULL) {
            currentNode = currentNode->next;
        }

        // lalu menambahkannya pada node yang next nya bernilai null
        currentNode->next = newNode;
    } else {
        // jika node masih kosong
        HEAD = newNode;
    }
}

void before(int key, int value) {
    Numbers *newNode = (Numbers*) malloc(sizeof(Numbers));
    newNode->number = value;
    newNode->next = NULL;

    // untuk menampung node yang sekarang diiterasi
    Numbers *currentNode = HEAD;

    if (currentNode != NULL) {
        // untuk menampung node yang terakhir diiterasi
        Numbers *lastNode = NULL;

        while (currentNode != NULL) {
            // jika menemukan key nya...
            if (currentNode->number == key) {
                // next pada note baru akan berisi alamat node yang sekarang diiterasi
                newNode->next = currentNode;
                // lalu next pada node yang terakhir diiterasi, diisi dengan node yang baru tadi
                lastNode->next = newNode;

                // selesai, langsung keluar
                return;
            }

            // jika belum menemukan key nya...
            // node yang di terasi sekarang, akan disimpan pada variabel lastNode
            lastNode = currentNode;
            // lalu node yang akan di terasi, akan disimpan pada variabel currentNode
            currentNode = currentNode->next;
        }

        // jika tidak menemukan key, node baru akan disimpan pada list paling awal
        // next pada node baru berisi alamat HEAD
        newNode->next = HEAD;
        // lalu HEAD akan berisi node baru
        HEAD = newNode;
    } else {
        // jika node masih kosong
        HEAD = newNode;
    }
}

void after(int key, int value) {
    Numbers *newNode = (Numbers*) malloc(sizeof(Numbers));
    newNode->number = value;
    newNode->next = NULL;

    // untuk menampung node yang sekarang diiterasi
    Numbers *currentNode = HEAD;

    if (currentNode != NULL) {
        // menampung node yang akan diiterasi
        Numbers *nextNode = currentNode->next;

        while (nextNode != NULL) {
            // jika menemukan key nya...
            if (currentNode->number == key) {
                // next pada node yang sekarang diiterasi, diisi dengan node yang baru
                currentNode->next = newNode;
                // lalu next pada node yang baru, akan diisi dengan node yang akan diterasi
                newNode->next = nextNode;

                // selesai, langsung keluar
                return;
            }

            // jika belum menemukan key nya...
            // next dari node yang di iterasi saat ini akan disimpan pada variabel currentNode
            currentNode = currentNode->next;
            // currentNode telah berisi node yang akan diiterasi, lalu isi next nya akan disimpan pada variabel nextNode
            nextNode = currentNode->next;
            // dengan begini, nextNode 1 langkah lebih depan
        }

        // jika tidak menemukan key nya, node baru akan disimpan pada list paling akhir
        currentNode->next = newNode;
    } else {
        // jika node masih kosong
        HEAD = newNode;
    }
}

void pop() {
    Numbers *currentNode = HEAD;

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

    free(currentNode->next);
    currentNode->next = NULL;
}

void shift() {
    Numbers *currentNode = HEAD;
    HEAD = currentNode->next;

    free(currentNode);
}

void removeAt(int key) {
    Numbers *currentNode = HEAD;
    Numbers *lastNode = NULL;

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

            free(currentNode);

            return;
        }

        lastNode = currentNode;
        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: