diff --git a/circular.c b/circular.c
new file mode 100644
index 0000000000000000000000000000000000000000..b56249cc19ef8858a8c21a4716d146bbffe9d157
--- /dev/null
+++ b/circular.c
@@ -0,0 +1,291 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+typedef struct CircularLinkedList {
+    int data;
+    struct CircularLinkedList* next;
+} Circular;
+
+Circular* start = NULL;
+
+Circular* create_cll(Circular* start) {
+
+    int data; 
+    printf("Masukkan data: "); scanf("%d", &data);
+
+    Circular* ptr;
+
+    while(data != -1) {
+        Circular* new = (Circular*) malloc(sizeof(Circular));
+
+        new->data = data;
+        new->next = start;
+
+        if(start == NULL) {
+            
+            start = new;
+            start->next = start;
+            ptr = start;
+        }
+        else {
+            ptr->next = new;
+            ptr = ptr->next;
+        }
+
+        printf("Masukkan data: "); scanf("%d", &data);
+    }
+
+    return start;
+}
+
+Circular* display(Circular* start) {
+    
+    Circular* ptr = start;
+    if(ptr == NULL) {
+        printf("Tidak ada data yang dapat ditampilkan\n");
+        return start;
+    }
+
+    bool first = true;
+    int counter = 1;
+    while(ptr != start || first == true) {
+        first = false;
+        printf("Data ke-%d adalah: %d\n", counter, ptr->data);
+        ++counter;
+        first = false;
+        ptr = ptr->next;
+    }
+
+    return start;
+}
+
+Circular* insert_beg(Circular* start) {
+    Circular* new = (Circular*) malloc(sizeof(Circular));
+    int data;
+    printf("Masukkan data: "); scanf("%d", &data);
+    new->data = data;
+    new->next = start;
+    
+    // bila tidak ada data
+    if(start == NULL) {
+        printf("Data kosong, data terbaru akan dimasukkan ke node pertama\n");
+        start = new;
+        start->next = start;
+        return start;
+    }
+
+    
+    Circular* ptr = start;
+
+    // bila hanya ada satu data
+    if(ptr->next == start) {
+        ptr->next = new;
+        return start;
+    }
+
+    while(ptr->next != start) {
+        ptr = ptr->next;
+    }
+
+    ptr->next = new;
+    start = new;
+    return start;
+}
+
+Circular* insert_end(Circular* start) {
+    int data;
+    printf("Masukkan data: "); scanf("%d", &data);
+    
+    Circular* new = (Circular*) malloc(sizeof(Circular));
+    new->data = data;
+    new->next = start;
+
+    // jika tidak ada data
+    if(start == NULL) {
+        printf("Data kosong, data terbaru akan dimasukkan ke node pertama\n");
+        start = new;
+        start->next = start;
+        return start;
+    }
+
+    Circular* ptr = start;
+
+    while(ptr->next != start) {
+        ptr = ptr->next;
+    }
+    ptr->next = new;
+    return start;
+}
+
+Circular* delete_beg(Circular* start) {
+    
+    // jika tidak ada data
+    if(start == NULL) {
+        printf("Tidak ada data untuk dihapus\n");
+        return start;
+    }
+
+    // jika hanya ada satu data
+    if(start->next == start) {
+        free(start);
+        start = NULL;
+        return start;
+    }
+
+    Circular* ptr = start;
+    
+    while(ptr->next != start) {
+        ptr = ptr->next;
+    }
+    
+    start = start->next;
+    free(ptr->next);
+    ptr->next = start;
+    return start;
+}
+
+Circular* delete_end(Circular* start) {
+    
+    // jika tidak ada data
+    if(start == NULL) {
+        printf("Tidak ada data untuk dihapus\n");
+        return start;
+    }
+
+    // jika hanya ada satu data
+    if(start->next == start) {
+        free(start);
+        start = NULL;
+        return start;
+    }
+
+    Circular* ptr = start;
+    while(ptr->next->next != start) {
+        ptr= ptr->next;
+    }
+
+    free(ptr->next);
+    ptr->next = start;
+
+}
+
+Circular* delete_node(Circular* start) {
+
+    // jika tidak ada data
+    if(start == NULL) {
+        printf("Tidak ada data untuk dihapus\n");
+        return start;
+    }
+
+    display(start);
+    printf("Delete node ke berapa ? ");
+    int urutan; scanf("%d", &urutan);
+
+    // hanya ada satu
+    if(urutan == 1 && start->next == start) {
+        free(start);
+        start = NULL;
+        return start;
+    }
+
+    Circular* ptr = start;
+    int counter = 1;
+
+    if(urutan == 1) {
+        while(ptr->next != start) {
+            ptr = ptr->next;
+        }
+        start = start->next;
+
+        free(ptr->next);
+        ptr->next = start;
+        return start;
+    }
+
+    while(counter < urutan-1) {
+        ptr = ptr->next;
+        ++counter;
+    }
+    
+    Circular* tmp = ptr->next->next;
+    free(ptr->next);
+    ptr->next = tmp;
+
+    return start;
+}
+
+Circular* delete_list(Circular* start) {
+    if(start == NULL) {
+        printf("Tidak ada data yang dapat dihapus\n");
+        return start;
+    }
+
+    Circular* ptr = start->next;
+    Circular* pre_ptr = NULL;
+    while(ptr != start) {
+        pre_ptr = ptr;
+        ptr = ptr->next;
+        free(pre_ptr);
+    }
+
+    free(start);
+    start = NULL;
+
+    return start;
+}
+
+int main() {
+    int option;
+    do {
+        printf("\nMain Menu\n");
+        printf("1. Create data\n");
+        printf("2. Display data\n");
+        printf("3. Add Data at the beginning\n");
+        printf("4. Add Data data at the end\n");
+        printf("5. Delete data at the beginning\n");
+        printf("6. Delete data at the end\n");
+        printf("7. Delete a data\n");
+        printf("8. Delete all data\n");
+        printf("9. Exit\n");
+        printf("Enter your option: "); scanf("%d", &option);
+
+        switch(option) {
+            case 1:
+                start = create_cll(start);
+                break;
+            case 2:
+                start = display(start);
+                break;
+
+            case 3:
+                start = insert_beg(start);
+                break;
+            
+            case 4:
+                start = insert_end(start);
+                break;
+
+            case 5:
+                start = delete_beg(start);
+                break;
+
+            case 6:
+                start = delete_end(start);
+                break;
+
+            case 7:
+                start = delete_node(start);
+                break;
+
+            case 8:
+                start = delete_list(start);
+                break;
+        }
+    } while( option !=9 );
+
+    printf("Program selesai\n");
+
+
+    return 0;
+}
\ No newline at end of file