diff --git a/linkedList.c b/linkedList.c
new file mode 100644
index 0000000000000000000000000000000000000000..b1754280769f17bcf79739a614afdd181b0282b2
--- /dev/null
+++ b/linkedList.c
@@ -0,0 +1,370 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+typedef int INTEGER;
+
+typedef struct LinkedList {
+    int data;
+    struct LinkedList* next;
+} list;
+
+list* start = NULL;
+
+int countNode(list* start) {
+    list* ptr = start;
+    if(start == NULL) {
+        return 0;
+    }
+    
+    int counter = 1;
+    while(ptr != NULL) {
+        ptr = ptr->next;
+        ++counter;
+    }
+    return counter;
+}
+
+bool isValidNode(list* start, int urutan) {
+    if(urutan > countNode(start) || urutan <= 0) {
+        return false;
+    }
+    return true;
+}
+
+list* create_ll(list* node) {
+    int num;
+    list *ptr, *newNode;
+
+    printf("Masukkan -1 untuk selesai\n");
+    printf("Masukkan data: "); scanf("%d", &num);
+
+    while(num != -1) {
+        newNode = (list*) malloc(sizeof(list));
+        newNode->data = num;
+        newNode->next = NULL;
+        if(start == NULL) {
+            start = newNode;
+        }
+        else {
+            ptr = start;
+            while(ptr->next != NULL) {
+                ptr = ptr->next;
+            }
+            ptr->next = newNode;
+        }
+        printf("Masukkan data: "); scanf("%d", &num);
+    }
+    return start;
+}
+
+list* display(list* start) {
+    // if(start == NULL)
+    int counter=0;
+    list* ptr = start;
+
+    if(ptr == NULL) {
+        printf("Tidak ada data untuk ditampilkan\n");
+    }
+
+    while(ptr != NULL) {
+        printf("Data node ke-%d adalah: %d\n", counter+1, ptr->data);
+        ptr = ptr->next;
+        ++counter;
+    }
+    return start;
+}
+
+list* insert_beg(list* node) {
+    int data;
+    printf("Masukkan data: "); scanf("%d", &data);
+
+    if(node == NULL) {
+        node->data = data;
+        node->next = NULL;
+        return node;
+    }
+    
+    list* tmp = (list*) malloc(sizeof(list));
+    tmp->data = data;
+    tmp->next = node;
+    return tmp;
+}
+
+list* insert_end(list* start) {
+    int data;
+    printf("Masukkan data: "); scanf("%d", &data);
+
+    list* tmp = (list*) malloc(sizeof(list));
+    tmp->data = data;
+    tmp->next = NULL;
+
+    if(start == NULL) {
+        start = tmp;
+        return start;
+    }
+    
+
+    list* ptr = start;
+    while(ptr->next != NULL) {
+        ptr = ptr->next;
+    }
+    
+    
+    ptr->next = tmp;
+    return start;
+}
+
+list* insert_before(list* start) {
+    int data;
+    printf("Masukkan data: "); scanf("%d", &data);
+    list* tmp = (list*) malloc(sizeof(list));
+    tmp->data = data;
+    tmp->next = NULL;
+
+    if(start == NULL) {
+        printf("Karena data kosong, data terbaru akan dimasukkan ke node pertama\n");
+        start = tmp;
+        return start;
+    }
+    
+    list* ptr = start;
+    printf("\n");
+    display(start);
+    int urutan;
+    printf("Masukkan data sebelum data ke berapa? "); scanf("%d", &urutan);
+
+    if(!isValidNode(start, urutan)) {
+        printf("Tidak ada node tidak valid\n");
+        return start;
+    }
+
+    if(urutan == 1) {
+        tmp->next = start;
+        return tmp;
+    }
+
+    int counter = 1;
+    while(counter != urutan-1) {
+        ptr = ptr->next;
+        ++counter;
+    }
+
+    // simpan node sebelum node masuk
+    list* after = ptr->next;
+    ptr->next = tmp;
+    tmp->next = after;
+    return start;
+}
+
+list* insert_after(list* start) {
+    list* tmp = (list*) malloc(sizeof(list));
+    int data; 
+    printf("Masukkan data: "); scanf("%d", &data);
+    tmp->data = data;
+    tmp->next = NULL;
+
+    if(start == NULL) {
+        start = tmp;
+        return start;
+    }
+    
+    list* ptr = start;
+    display(start);
+    int urutan;
+    printf("Masukkan data setelah data ke berapa? "); scanf("%d", &urutan);
+
+    if(!isValidNode(start, urutan)) {
+        printf("Node tidak valid\n");
+        return start;
+    }
+
+    int counter = 1;
+    while(counter != urutan) {
+        ptr = ptr->next;
+        ++counter;
+    }
+
+    // simpan node sebelum node baru masuk
+    list* after = ptr->next;
+    ptr->next = tmp;
+    tmp->next = after;
+    return start;
+}
+
+list* delete_beg(list* start) {
+    if(start == NULL) {
+        return start;
+    }
+    
+    list* tmp = start;
+    start = start->next;
+    free(tmp);
+    tmp = NULL;
+    return start;
+
+}
+list* delete_end(list* start) {
+    list* ptr = start;
+
+    if(start == NULL) {
+        printf("Tidak ada data yang dapat dihapus\n");
+        return start;
+    }
+
+    while(ptr->next->next != NULL) {
+        ptr = ptr->next;
+    }
+    free(ptr->next);
+    ptr->next = NULL;
+
+    return start;
+}
+
+list* delete_node(list* start) {
+
+    if(start == NULL) {
+        printf("Tidak ada data yang bisa dihapus\n");
+        return start;
+    }
+
+    int urutan;
+    printf("Data ke berapa yang ingin dihapus ? "); scanf("%d", &urutan);
+
+    if(!isValidNode(start, urutan)) {
+        printf("Node tidak valid\n");
+        return start;
+    }
+
+    if(urutan == 1) {
+        free(start);
+        start = NULL;
+        return start;
+    }
+
+    
+    list* ptr = start;
+    int counter = 1;
+    while(counter != urutan-1) {
+        ptr = ptr->next;
+        ++counter;
+    }
+
+    list* tmp = ptr->next->next;
+    free(ptr->next);
+    ptr->next = tmp;
+    return start;
+
+}
+
+list* delete_list(list* start) {
+    list* ptr = start;
+    while(ptr != NULL) {
+        printf("%d\n", ptr->data);
+        list* tmp = ptr;
+        ptr = ptr->next;
+        free(tmp);
+        tmp = NULL;
+    }
+    start = NULL;
+    return start;
+}
+
+list* reverse_list(list* start) {
+    list* ptr = start;
+    list* tmp = NULL;
+    list* new_list = NULL;
+    while(ptr != NULL) {
+        tmp = ptr;
+        ptr = ptr->next;
+        tmp->next = new_list;
+        new_list = tmp;
+    }
+    return new_list;
+}
+
+list* sort_list(list* start) {
+    list* simpan = start;
+    
+    while(simpan->next != NULL) {
+        list* ptr = simpan->next;
+        while(ptr != NULL) {
+            if(simpan->data > ptr->data) {
+                int tmp = ptr->data;
+                ptr->data = simpan->data;
+                simpan->data = tmp;
+            }
+            ptr = ptr->next;
+        }
+        simpan = simpan->next;
+    }
+    return start;
+}
+
+int main() {
+    int option;
+    do {
+        printf("\n\nMain Menu\n");
+        printf("1. Create List\n");
+        printf("2. Display List\n");
+        printf("3. Add node at the beginning\n");
+        printf("4. Add node at the end\n");
+        printf("5. Add node before a given node\n");
+        printf("6. Add node after a given node\n");
+        printf("7. Delete node from the beginning\n");
+        printf("8. Delete node from the end\n");
+        printf("9. Delete a given node\n");
+        printf("10. Delete the entire list\n");
+        printf("11. Reverse list\n");
+        printf("12. Sort the list\n");
+        printf("13. EXIT: ");
+        printf("\n\nEnter your option: ");
+        scanf("%d", &option);
+        printf("\n\n");
+        switch (option)
+        {
+        case 1:
+            start = create_ll(start);
+            printf("Linked List Created");
+            break;
+        case 2:
+            start = display(start);
+            break;
+        case 3:
+            start = insert_beg(start);
+            break;
+        case 4:
+            start = insert_end(start);
+            break;
+        case 5:
+            start = insert_before(start);
+            break;
+        case 6:
+            start = insert_after(start);
+            break;
+        case 7:
+            start = delete_beg(start);
+            break;
+        case 8:
+            start = delete_end(start);
+            break;
+        case 9:
+            start = delete_node(start);
+            break;
+        case 10:
+            start = delete_list(start);
+            printf("Linked list Deleted\n");
+            break;
+        case 11:
+            start = reverse_list(start);
+            break;
+        case 12:
+            start = sort_list(start);
+            break;
+        }
+    } while(option != 13);
+    getchar();
+
+    return 0;
+}