Selasa, 09 Juni 2020

Rangkuman Data Structure

Rangkuman Data Structure selama 1 semester

Nama : Clarik Linadi

NIM :2301883901

Kelas : CB01

Lecturer : Ferdinand Ariandy Luwinda (D4522) dan Henry Chong (D4460)

 

Linked List

Linked List adalah struktur data yang terdiri dari urutan record data dimana setiap record memiliki field yang menyimpan alamat/referensi dari record selanjutnya (dalam urutan). Elemen data yang dihubungkan dengan link pada Linked List disebut Node. Biasanya didalam suatu linked list, terdapat istilah head dan tail.

  • Head adalah elemen yang berada pada posisi pertama dalam suatu linked list
  • Tail adalah elemen yang berada pada posisi terakhir dalam suatu linked list

Ada beberapa macam Linked List, yaitu :

  1. Single Linked List
  2. Double Linked List
  3. Circular Linked List
  4. Multiple Linked List
  5. Doubly Linked List
  6. Circular Doubly Linked List

Tetapi untuk sekarang saya akan menjelaskan tentang Circular Single Linked List, Doubly Linked List dan Circular Doubly Linked List.

Double Linked List

Double Linked List adalah salah satu contoh lain implementasi linked list selain single linked list. Sesuai namanya, Double artinya blok data yang kita miliki akan memiliki 2 penunjuk kiri dan kanan untuk menentukan data sebelum/sesudahnya. Berbeda dengan single linked list yang hanya mempunyai satu penunjuk, double linked list mempunyai 2 penunjuk kiri dan kanan untuk menentukan urutan datanya.

Circular Linked List

Circular Linked List merupakan suatu linked list dimana tail (node terakhir) menunjuk ke head (node pertama). Jadi tidak ada pointer yang menunjuk NULL.

Ada 2 jenis Circular Linked List, yaitu :

  1. Circular Single Linked List
  2. Circular Double Linked List

Circular Single Linked List

Single Linked List Circular adalah Single Linked List yang pointer nextnya menunjuk pada dirinya sendiri. Jika Single Linked List tersebut terdiri dari beberapa node,  maka pointer next pada node terakhir akan menunjuk ke node terdepannya.

Circular Double Linked List

Double Linked List adalah linked list dengan node yang memiliki data dan dua buah reference link (biasanya disebut next dan prev) yang menunjuk ke node sebelum dan node sesudahnya.



Linked List


Single Linked List

Linked List merupakan kumpulan dari banyak data, yang disebut sebagai nodes, dimana setiap node akan menunjuk pada node lain melalui pointer. Linked List bisa juga disebut kumpulan data linear.


Linked List yang memiliki satu penghubung dengan node lain, disebut single linked list.

Dalam Linked List pasti terdapat node yang bernama head dan tail. Head yang dimaksud disini adalah penunjuk untuk menunjukkan dimana letak data pertama dan tail menunjukkan dimana letak data terakhir. 


Sebuah linked list, dikatakan kosong jika tidak memiliki head yang menandakan bahwa node tersebut kosong.


Operasi pada single linked list:

1. Push (Memasukkan data)

2. Pop (Menghapus data dari Node)


1. Push

Push merupakan operasi pada linked list untuk menginsert suatu data pada node, push bisa saja dilakukan pada head, tail, ataupun index.


Contoh push adalah sebagai berikut:

Jika terdapat node yang berisi angka 7, 6, 9, 3, 5 , NULL

Kemudian pushHead(4) maka hasilnya akan menjadi 4, 7, 6, 9, 3, 5, NULL

Sama halnya jika melakukan pushTail(10) hasilnya akan menjadi 4, 7, 6, 9, 3, 5, 10, NULL


Untuk contoh kode pushHead bisa dilihat dibawah ini

public void pushHead(int n){ // int n ini merupakan data yang akan dimasukkan pada linked list

struct Data* curr = (struct Data*)malloc(sizeof(Data));

    curr->isi = n;

    if(head==NULL) head = tail = curr; // Jika belum terdapat head

    else{

        curr->next = head;

        head = curr;

    }

}


Hasil gambar untuk push head linked list


2. Pop

Pop merupakan kebalikan dari push, dimana fungsi pop adalah mendelete suatu data dalam linked list dan melepaskanny agar memory dapat dipakai kembali. Pop biasa digunakan untuk mendelete head, tail ataupun suatu index.


Contoh pop:

terdapat suatu data 1, 5, 6, 7, 8, 9, NULL

Kemudian popHead() maka hasilnya akan menjadi  5, 6, 7, 8, 9, NULL

Jika popTail() maka hasilnya akan menjadi  5, 6, 7, 8, NULL


Untuk contoh kode dari popHead bisa dilihat dibawah ini

 void popHead(){

    struct Data* curr = head;

    head = head->next; // merubah head ke angka selanjutnya dikarenakan angka pada head akan dilepas

    free(curr);

}


Hasil gambar untuk poplinked list


Kesimpulannya, jika ingin memproses suatu data sangat disarankan menggunakan konsep array dinamis untuk memakai Single Linked List ataupun Double Linked List di karenakan jika memakai array yang statis, penggunaan ruang memori yang sudah digunakan tidak dapat dihapus apabila nama variable array tersebut sudah tidak digunakan kembali dalam suatu program.




Hash Table and Binary Tree

Ketika kita diberikan data yang sangat banyak, kita harus membutuhkan suatu data structure yang cepat untuk melakukan banyak hal (insert, delete,dan search). Seharusnya kita mempunyai kunci(key) untuk dapat mengakses data tersebut, agar ketika kita mencari, kita hanya tinggal memakai key tersebut, sehingga waktu yang diperlukan untuk mencari data lebih efisien, karena sudah mendekati dimana lokasi data tersebut dibanginkan jika kita mencari data secara linear(satu per satu). Ada beberapa cara untuk mengimplementasi cara penggunaan key ini, contoh nya seperti, hash table, balanced binary search tree(bst) dan doubly linked list.


Hash Table


Untuk sekarang, saya akan menjelaskan tentang hash table. Hash table merupakan method tercepat yang dapat digunakan insert,delete dan search dibandingkan bst dan double linked list.


Di dalam hash table terdapat suatu function bernama hash function, hash function adalah function untuk menempatkan index dari suatu key dalam suatu array.


Ada banyak cara hash function seperti, salah satu contohnya division method, division method adalah salah satucara pada hash function dimana kita akan menaruh suatu index pada array h dimana

h(k) = k%m , k disini merupakan key dan m merupakan panjang arraynya.


dibawah ini merupakan contoh dari division method:



untuk contoh disamping, terdapat key 1276, maka index dari key tersebut akan disimpan dalam array ke - [6]





Namun, apa yang terjadi jika dalam array tersebut telah terdapat data yang telah disimpan? ini disebut hash collision. Ada banyak cara untuk mengatasi hash collisin ini, contohnya seperti open addressing dan closed addressing.


Open Addressing

suatu cara yang digunakan untuk mencari tempat kosong setelah tempat key tersebut terisi.






Contoh penggunaan open addressing pada bahasa C



Closed Addressing

cara yang digunakan untuk menempatkan suat data secara linked list.


Contoh penggunaan closed addressing



Binary Tree

Tree Concept

Tree adalah sebuah struktur data yang memiliki bentuk sebuah pohon, yang terdiri dari serangkaian node (simpul) berisi data yang saling berhubungan.



Binary tree

Binary Tree adalah sebuah pohon yang menyimpan data, keunikan binary tree adalah mensortir semua data yang dimasukkan. Sebuah binary search tree memiliki root dan cabang left serta right pada setiap nodenya.


Image result for binary tree



dalam binary tree, kita dapat melakukan insert.

Contoh dari insert dalam binary tree: mencari dari parent dimana lokasi yang tepat untuk memasukkan nilai, dan jika ditemukan bahwa parentnya tersebut NULL, masukkan ke dalam parent


Berikut adalah contoh code di C jika kita ingin memasukkan data sesuai gambar diatas



Demikian penjelasan saya mengenai Hash Table dan Binary Tree, terima kasi telah membaca

^ ^




Binary Tree

Binary tree adalah pohon dalam suatu struktur data yang berbentuk seperti pohon. Binary tree biasanya terdiri dari 2 anak dan binary tree tidak memiliki anak lebih dari 3 level dari root.

binary tree


Jika dilihat contoh diatas, angka 7 dan 5 berada pada level 1, angka 2,6, dan 9 berada pada level 2 dst.

Binary Search Tree


Binary Search Tree adalah tree yang terurut. Binary Search Tree sering disebut dengan Sorted Binary Tree yang berfungsi untuk menyimpan informasi nama atau bilangan yang disimpan di dalam memory. Implemetasi binary search tree ini biasanya data akan dibagi menjadi dua dengan mencari titik tengah seagai patokannya. Binary tree terdiri dari anak satu pertama yang disebut dengan istilah root. Root tersebut memiliki anak(rootbaru) kiri dan anak kanan. Data disimpan setelah root disimpan berdasarkan nilai perbandingan dengan root tersebut. Pengurutan dengan metode in-order. Data yang telah tersusun dalam struktur data BST dapat dicari dengan mudah dan memiliki rata-rata kompleksitas sebesar O(log n), namun membutuhkan waktu sebesar O(n) pada worstcase dimana BST berbentuk seperti linked list.


 Contoh implementasi code C insert,delete dalam bst.

/*

#include <stdio.h>

#include <stdlib.h>


struct Node{

int value;

Node *left,*right;

}*root,*curr;


Node *createNode(int val){

curr = (Node*) malloc(sizeof(Node));

curr->value = val;

curr->left = curr->right = NULL;

return curr;

}


Node *insertNode(Node *parent,int value){

if(!parent)

 return createNode(value);

else if(parent->value == value)

 return parent;

else if(parent->value > value)

 parent->left = insertNode(parent->left,value);

else

 parent->right = insertNode(parent->right,value);

}


Node *removeNode(Node *parent,int value){

if(!parent)

 return parent;

else if(parent->value > value)

 parent->left = removeNode(parent->left,value);

else if(root->value < value)

 parent->left = removeNode(parent->left,value);

else if(parent->value == value){

if(parent->left == NULL || parent->right == NULL){

 Node *temp = parent->left != NULL ? parent->left : parent->right;

if(temp)

 *parent = *temp;

else{

temp = parent;

parent = NULL;

}

free(temp);

}

else{

Node *temp = parent->left;

while(temp->right)

 temp = temp->right;

parent->left=removeNode(parent->left,temp->value);

}

return parent;

}

}


void print(Node *parent){

if(parent){

print(parent->left);

printf("%d ",parent->value);

print(parent->right);

}

}


int main(){

root = insertNode(root,20);

root = insertNode(root,5);

root = insertNode(root,14);

root = insertNode(root,3);

root = insertNode(root,16);

root = insertNode(root,22);

root = insertNode(root,19);


root = removeNode(root,3);

//print in order

print(root);

}

*/


Terima Kasih ^ ^



Summary

Linked List

Linked List adalah struktur data yang terdiri dari urutan record data dimana setiap record memiliki field yang menyimpan alamat/referensi dari record selanjutnya (dalam urutan). Elemen data yang dihubungkan dengan link pada Linked List disebut Node. Biasanya didalam suatu linked list, terdapat istilah head dan tail.

  • Head adalah elemen yang berada pada posisi pertama dalam suatu linked list
  • Tail adalah elemen yang berada pada posisi terakhir dalam suatu linked list

Ada beberapa macam Linked List, yaitu :

  1. Single Linked List
  2. Double Linked List
  3. Circular Linked List
  4. Multiple Linked List
  5. Doubly Linked List
  6. Circular Doubly Linked List

Single Linked List

Linked List merupakan kumpulan dari banyak data, yang disebut sebagai nodes, dimana setiap node akan menunjuk pada node lain melalui pointer. Linked List bisa juga disebut kumpulan data linear.

Linked List yang memiliki satu penghubung dengan node lain, disebut single linked list.

Dalam Linked List pasti terdapat node yang bernama head dan tail. Head yang dimaksud disini adalah penunjuk untuk menunjukkan dimana letak data pertama dan tail menunjukkan dimana letak data terakhir. 

Sebuah linked list, dikatakan kosong jika tidak memiliki head yang menandakan bahwa node tersebut kosong.

Operasi pada single linked list:

1. Push (Memasukkan data)

2. Pop (Menghapus data dari Node)


1. Push

Push merupakan operasi pada linked list untuk menginsert suatu data pada node, push bisa saja dilakukan pada head, tail, ataupun index.


Contoh push adalah sebagai berikut:

Jika terdapat node yang berisi angka 7, 6, 9, 3, 5 , NULL

Kemudian pushHead(4) maka hasilnya akan menjadi 4, 7, 6, 9, 3, 5, NULL

Sama halnya jika melakukan pushTail(10) hasilnya akan menjadi 4, 7, 6, 9, 3, 5, 10, NULL

Untuk contoh kode pushHead bisa dilihat dibawah ini

public void pushHead(int n){ // int n ini merupakan data yang akan dimasukkan pada linked list

struct Data* curr = (struct Data*)malloc(sizeof(Data));

    curr->isi = n;

    if(head==NULL) head = tail = curr; // Jika belum terdapat head

    else{

        curr->next = head;

        head = curr;

    }

}

Hasil gambar untuk push head linked list

2. Pop

Pop merupakan kebalikan dari push, dimana fungsi pop adalah mendelete suatu data dalam linked list dan melepaskanny agar memory dapat dipakai kembali. Pop biasa digunakan untuk mendelete head, tail ataupun suatu index.

Contoh pop:

terdapat suatu data 1, 5, 6, 7, 8, 9, NULL

Kemudian popHead() maka hasilnya akan menjadi  5, 6, 7, 8, 9, NULL

Jika popTail() maka hasilnya akan menjadi  5, 6, 7, 8, NULL

Untuk contoh kode dari popHead bisa dilihat dibawah ini

 void popHead(){

    struct Data* curr = head;

    head = head->next; // merubah head ke angka selanjutnya dikarenakan angka pada head akan dilepas

    free(curr);

}


Double Linked List

Double Linked List adalah salah satu contoh lain implementasi linked list selain single linked list. Sesuai namanya, Double artinya blok data yang kita miliki akan memiliki 2 penunjuk kiri dan kanan untuk menentukan data sebelum/sesudahnya. Berbeda dengan single linked list yang hanya mempunyai satu penunjuk, double linked list mempunyai 2 penunjuk kiri dan kanan untuk menentukan urutan datanya.



Circular Linked List

Circular Linked List merupakan suatu linked list dimana tail (node terakhir) menunjuk ke head (node pertama). Jadi tidak ada pointer yang menunjuk NULL.

Ada 2 jenis Circular Linked List, yaitu :

  1. Circular Single Linked List
  2. Circular Double Linked List

Circular Single Linked List



Single Linked List Circular adalah Single Linked List yang pointer nextnya menunjuk pada dirinya sendiri. Jika Single Linked List tersebut terdiri dari beberapa node,  maka pointer next pada node terakhir akan menunjuk ke node terdepannya.

Circular Double Linked List



Double Linked List adalah linked list dengan node yang memiliki data dan dua buah reference link (biasanya disebut next dan prev) yang menunjuk ke node sebelum dan node sesudahnya.


Hash Table and Binary Tree

Ketika kita diberikan data yang sangat banyak, kita harus membutuhkan suatu data structure yang cepat untuk melakukan banyak hal (insert, delete,dan search). Seharusnya kita mempunyai kunci(key) untuk dapat mengakses data tersebut, agar ketika kita mencari, kita hanya tinggal memakai key tersebut, sehingga waktu yang diperlukan untuk mencari data lebih efisien, karena sudah mendekati dimana lokasi data tersebut dibanginkan jika kita mencari data secara linear(satu per satu). Ada beberapa cara untuk mengimplementasi cara penggunaan key ini, contoh nya seperti, hash table, balanced binary search tree(bst) dan doubly linked list.


Hash Table


Untuk sekarang, saya akan menjelaskan tentang hash table. Hash table merupakan method tercepat yang dapat digunakan insert,delete dan search dibandingkan bst dan double linked list.


Di dalam hash table terdapat suatu function bernama hash function, hash function adalah function untuk menempatkan index dari suatu key dalam suatu array.


Ada banyak cara hash function seperti, salah satu contohnya division method, division method adalah salah satucara pada hash function dimana kita akan menaruh suatu index pada array h dimana

h(k) = k%m , k disini merupakan key dan m merupakan panjang arraynya.


dibawah ini merupakan contoh dari division method:



untuk contoh disamping, terdapat key 1276, maka index dari key tersebut akan disimpan dalam array ke - [6]





Namun, apa yang terjadi jika dalam array tersebut telah terdapat data yang telah disimpan? ini disebut hash collision. Ada banyak cara untuk mengatasi hash collisin ini, contohnya seperti open addressing dan closed addressing.


Open Addressing

suatu cara yang digunakan untuk mencari tempat kosong setelah tempat key tersebut terisi.






Contoh penggunaan open addressing pada bahasa C



Closed Addressing

cara yang digunakan untuk menempatkan suat data secara linked list.


Contoh penggunaan closed addressing



Binary Tree

Tree Concept

Tree adalah sebuah struktur data yang memiliki bentuk sebuah pohon, yang terdiri dari serangkaian node (simpul) berisi data yang saling berhubungan.



Binary tree

Binary Tree adalah sebuah pohon yang menyimpan data, keunikan binary tree adalah mensortir semua data yang dimasukkan. Sebuah binary search tree memiliki root dan cabang left serta right pada setiap nodenya.


Image result for binary tree



dalam binary tree, kita dapat melakukan insert.

Contoh dari insert dalam binary tree: mencari dari parent dimana lokasi yang tepat untuk memasukkan nilai, dan jika ditemukan bahwa parentnya tersebut NULL, masukkan ke dalam parent


Berikut adalah contoh code di C jika kita ingin memasukkan data sesuai gambar diatas






Binary Search Tree


Binary Search Tree adalah tree yang terurut. Binary Search Tree sering disebut dengan Sorted Binary Tree yang berfungsi untuk menyimpan informasi nama atau bilangan yang disimpan di dalam memory. Implemetasi binary search tree ini biasanya data akan dibagi menjadi dua dengan mencari titik tengah seagai patokannya. Binary tree terdiri dari anak satu pertama yang disebut dengan istilah root. Root tersebut memiliki anak(rootbaru) kiri dan anak kanan. Data disimpan setelah root disimpan berdasarkan nilai perbandingan dengan root tersebut. Pengurutan dengan metode in-order. Data yang telah tersusun dalam struktur data BST dapat dicari dengan mudah dan memiliki rata-rata kompleksitas sebesar O(log n), namun membutuhkan waktu sebesar O(n) pada worstcase dimana BST berbentuk seperti linked list.


 Contoh implementasi code C insert,delete dalam bst.

/*

#include <stdio.h>

#include <stdlib.h>


struct Node{

int value;

Node *left,*right;

}*root,*curr;


Node *createNode(int val){

curr = (Node*) malloc(sizeof(Node));

curr->value = val;

curr->left = curr->right = NULL;

return curr;

}


Node *insertNode(Node *parent,int value){

if(!parent)

 return createNode(value);

else if(parent->value == value)

 return parent;

else if(parent->value > value)

 parent->left = insertNode(parent->left,value);

else

 parent->right = insertNode(parent->right,value);

}


Node *removeNode(Node *parent,int value){

if(!parent)

 return parent;

else if(parent->value > value)

 parent->left = removeNode(parent->left,value);

else if(root->value < value)

 parent->left = removeNode(parent->left,value);

else if(parent->value == value){

if(parent->left == NULL || parent->right == NULL){

 Node *temp = parent->left != NULL ? parent->left : parent->right;

if(temp)

 *parent = *temp;

else{

temp = parent;

parent = NULL;

}

free(temp);

}

else{

Node *temp = parent->left;

while(temp->right)

 temp = temp->right;

parent->left=removeNode(parent->left,temp->value);

}

return parent;

}

}


void print(Node *parent){

if(parent){

print(parent->left);

printf("%d ",parent->value);

print(parent->right);

}

}


int main(){

root = insertNode(root,20);

root = insertNode(root,5);

root = insertNode(root,14);

root = insertNode(root,3);

root = insertNode(root,16);

root = insertNode(root,22);

root = insertNode(root,19);


root = removeNode(root,3);

//print in order

print(root);

}

*/



Dan untuk tugas membuat aplikasi dengan konsep double linked list terdapat dalam web :


https://linkedlisttugasmingguan.blogspot.com/2020/04/code-example-for-double-linked-list.html


Demikian rangkuman mengenai hal hal apa saja yang saya pelajari sampai saat ini, Terima Kasih.




Code example for Double Linked List

Dreammer's Market

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

struct List{
    char name[50];
    int qty;
    int price;
    List *next,*prev;
}*head,*tail,*curr,*temp;

List *createNode(const char name[], int qty){
    List *temp = (List*)malloc(sizeof(List));
    strcpy(temp->name,name);
    temp->qty = qty;
    temp->next = temp->prev = NULL;
    return temp;
}

void enter(){
    puts("\nPress any key to continue...");
    getchar();
}

void cls(){
    for(int i=0;i<30;i++)
        puts("");
}

void deleteList(char name[]){
    if(!head){
        puts("Your cart is empty");
        return;
    }
    curr = head;
    while(curr){
        if(strcmp(curr->name,name)==0)
            break;
        if(strcmp(curr->name,name)>0){
            puts("Not Found");
            return;
        }
        curr = curr->next;
    }
    if(!curr)
        printf("Not Found");
    else if(curr == head && !curr->next)
        head = NULL;
    else if(curr == head){
        head->next->prev = NULL;
        head = curr->next;
    }
    else if(curr == tail){
        curr->prev->next = NULL;
        tail = curr->prev;
    }  
    else{
        curr->next->prev = curr->prev;
        curr->prev->next = curr->next;
    }
    free(curr);
}

void edit(char name[], int change){
    if(!head){
        puts("Your cart is empty");
        return;
    }
    curr = head;
    while(curr){
        if(strcmp(curr->name,name)==0)
            break;
        if(strcmp(curr->name,name)>0){
            puts("Not Found");
            return;
        }
        curr = curr->next;
    }
    if(!curr)
        printf("Not found");
    else
        curr->qty = change;
}

bool search(char name[]){
    if(!head)
        return false;
    curr = head;
    while(curr){
        if(strcmp(curr->name,name)==0)
            return true;
        if(strcmp(curr->name,name)>0)
            return false;
        curr = curr->next;
    }
    return false;
}

void pushPriority(char name[], int qty){
    curr = createNode(name,qty);
    curr->price = rand() % 89999 + 10000;
    if(!head)
        head = tail = curr;
    else{
        temp = head;
        while(temp->next){
            if(strcmp(temp->next->name,curr->name)>0)
                break;
            temp = temp->next;
        }
        if(temp==tail){
            temp->next = curr;
            curr->prev = temp;
            tail = curr;
        }
        else{
            curr->prev = temp;
            curr->next = temp->next;
            temp->next->prev = curr;
            temp->next = curr;
        }
    }
    head->prev = NULL;
    tail->next = NULL;
}

void checkOut(){
    if(!head){
        puts("Your cart is empty");
        enter();
        return;
    }
    curr = head;
    int count = 0;
    int total = 0;
    puts("=====================================================================================");
    puts("=                               Dreammers Market Bill's                             =");
    puts("=====================================================================================");
    puts("= No  =             Item Name               =  Qty   =   Price    =       Total     =");
    puts("=====================================================================================");
    while(curr){
        printf("= %3d = %-35s = %6d = Rp.%7d = Rp. %11d =\n",++count,curr->name,curr->qty,curr->price, curr->qty*curr->price);
        total += curr->qty*curr->price;
        curr = curr->next;
    }
    puts("=====================================================================================");
    printf("=-----------------------------Discount----------------------------= Rp. %11d =\n", -total);
    puts("=====================================================================================");
    printf("=------------------------------Total------------------------------=       Free      =\n");
    puts("= ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~Kindness is Free ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ =        ^^       =");
    puts("=====================================================================================");
  
    enter();
}

void deleteCart(){
    char name[50];
    int quantity;
    char strquantity[50];
    do{
        printf("Input item name you want to delete>> ");
        scanf("%[^\n]", name);getchar();
    }while(strlen(name)<1);
  
    curr = head;
    while(curr){
        if(strcmp(curr->name,name)==0)
            break;
        curr = curr->next;
    }
    if(!curr){
        puts("Not Found");
        enter();
        return;
    }
  
    char confirm[10];
    printf("%-15s: %s\n", "Item Name",curr->name);
    printf("%-15s: %d\n", "Quantity",curr->qty);
    printf("%-15s: %d\n\n", "Price", curr->price);
    puts("Do you still want to delete this item from cart? [Yes|No] case sensitive");
    do{
        printf(">> ");
        scanf("%[^\n]", confirm);getchar();
    }while(!(strcmp(confirm,"Yes")==0 || strcmp(confirm,"No")==0));
    if(strcmp(confirm,"No")==0)
        return;
    deleteList(name);
    puts("Succesfully deleted");
    enter();
}

void editCart(){
    char name[50];
    int quantity;
    char strquantity[50];
    do{
        printf("Input item name you want to edit>> ");
        scanf("%[^\n]", name);getchar();
    }while(strlen(name)<1);
  
    curr = head;
    while(curr){
        if(strcmp(curr->name,name)==0)
            break;
        curr = curr->next;
    }
    if(!curr){
        puts("Not Found");
        enter();
        return;
    }
    bool error;
    printf("%-15s: %s\n", "Item Name",curr->name);
    printf("%-15s: %d\n", "Quantity",curr->qty);
    printf("%-15s: %d\n\n", "Price", curr->price);
  
    do{
        error = false;
        printf("Edit Quantity [0 to cancel] >> ");
        scanf("%[^\n]", strquantity);getchar();
        for(int i=0;strquantity[i]!='\0';i++){
            if(strquantity[i]>=48 && strquantity[i]<=57)
                continue;
            else{
                error = true;
                break;
            }
        }
    }while(error);
    if(quantity)
        return;
    quantity = atoi(strquantity);
    edit(curr->name, quantity);
    puts("Succesfully Update Your Cart");
    enter();
}

void addCart(){
    char name[50];
    int quantity;
    char strquantity[50];
    do{
        printf("Input item name >> ");
        scanf("%[^\n]", name);getchar();
    }while(strlen(name)<1);
  
    if(search(name)){
        puts("\n\nYour item already exist!");
        enter();
        return;
    }
  
    bool error;
    do{
        error = false;
        printf("Input %s quantity >> ", name);
        scanf("%[^\n]", strquantity);getchar();
        for(int i=0;strquantity[i]!='\0';i++){
            if(strquantity[i]>=48 && strquantity[i]<=57)
                continue;
            else{
                error = true;
                break;
            }
        }
    }while(error);
    quantity = atoi(strquantity);
//    printf("%d", quantity);
    pushPriority(name,quantity);
}

void viewCart(){
    if(!head){
        puts("Your cart is empty");
        enter();
        return;
    }
    curr = head;
    int count = 0;
    puts("===================================================================");
    puts("=                                Cart                             =");
    puts("===================================================================");
    puts("= No  =             Item Name               =  Qty   =   Price    =");
    puts("===================================================================");
    while(curr){
        printf("= %3d = %-35s = %6d = Rp.%7d =\n",++count,curr->name,curr->qty,curr->price);
        curr = curr->next;
    }
    puts("===================================================================");
    enter();
}

void mainMenu(){
    int input=0;
    do{
        cls();
        puts("Welcome to Dreammers Market!!");
        puts("");
        puts("Choose what to do:");
        puts("1. View Cart");
        puts("2. Add New Item to Cart");
        puts("3. Edit Quantity Item on Cart");
        puts("4. Delete Item on Cart");
        puts("5. CheckOut");
        puts("6. Exit");
        scanf("%d", &input);getchar();
        switch(input){
            case 1:
                viewCart();
                break;
            case 2:
                addCart();
                break;
            case 3:
                editCart();
                break;
            case 4:
                deleteCart();
                break;
            case 5:
                checkOut();
                break;
        }
    }while(input!=6);
    puts("\n\nThank you for coming!!");
}

int main(){
    mainMenu();
    return 0;
}

 

AVL TREE

AVL Tree adalah Binary Search Tree yang memiliki perbedaan level maksimal 1 antara subtree kiri dan subtree kanan. AVL Tree digunakan untuk menyeimbangkan BST, dengan AVL Tree waktu pencarian dan bentuk tree dipersingkat dan disederhanakan.


Berikut merupakan contoh dari AVL Tree



AVL Trees in Python - Akshay Kumar - Medium

Angka 0 menandakan tidak memiliki perbedaan level antara subtree kiri dan subtree kanan

Angka 1 menandakan memiliki perbedaan 1 level yaitu berada pada subtree kanan (subtree kiri < subtree kanan)

Angka -1 menandakan memiliki perbedaan 1 level yaitu berada pada subtree kiri(subtree kanan < subtree kiri)

Penambahan node pada AVL tree (Insert)


Untuk menjaga BST tetap seimbang, setiap dilakukan penyisipan node, dilakukan pemeriksaan node baru. Jika tidak seimbang, maka akan dilakukan proses penyeimbangan yaitu Single Rotation dan Double Rotation.

Single Rotation

Single Rotation dilakukan bila kondisi AVL Tree waktu akan ditambahkan, searah left-left / right-right



Double Rotation


Double Rotation dilakukan bila kondisi AVL Tree berlawan arah, left-right atau right-left.

Rotasi pertama

Rotasi kedua





Penambahan node pada AVL tree (Delete)


Tidak hanya dapat melakukan insert, tetapi ada operasi lainnya bernama delete, proses delete ini dilakukan sama seperti BST yaitu node yang dihapus digantikan oleh node terbesar pada subtree kiri atau yang terkecil pada subtree kanan. Setelah dilakukan penghapusan, dicek kembali apakah tree sudah seimbang atau belum, jika tidak seimbang, maka akan dilakukan proses penyeimbangan dengan menggunakan single rotation atau double rotation.


Delete node 60


Pada node 55 tidak seimbang maka akan dilakukan single rotation


Pada node 50, tree menjadi tidak seimbang, maka dilakukan double rotation


Hasil akhir setelah dilakukan double rotation




Demikian penjelasan saya mengenai AVL Tree.




Heap

Heap adalah sebuah objek array yang divisualisasikan sebagai complete binary tree. Bentuk Heap adalah complete Binary Tree yang mengartikan bahwa semua level diisi kecuali level terakhir.


Jenis Heap :

1. Min Heap

Setiap elemen memiliki nilai yang lebih kecil daripada node childnya. Angka terbesar dalam min heap terdapat pada salah satu node leaf (Node di level terakhir).

2. Max Heap

Kebalikan dari min Heap, setiap elemen memiliki nilai yang lebih besar daripada node childnya. Angka terkecil dalam min heap terdapat pada salah satu node leaf (Node di level terakhir).

3. Min Max Heap 

Gabungan dari min dan max heap dimana masing" level akan berganti ganti antara min heap dan maxheap.


Operasi dalam heap (Min dan Max Heap)


INSERT

untuk menambahkan suatu elemen, kita dapat melakukan operasi up-heap(heapify-up) untuk mengembalikan sifat heap dengan syarat:

  1. Tambahkan elemen pada level bawah heap.

  2. Bandingkan elemen yg baru ditambahkan dengan parentnya, jika mereka berada di urutan yang benar, berhenti.

  3. Jika tidak, swap elemen dengan parent dan kembali ke langkah sebelumnya.


Contoh insert pada maxheap :


1Menambahkan angka 15 pada (X).


Dikarenakan angka 15 lebih besar dibandingkan parentnya (8) maka tuker angka 15 dengan 8

2Menukar 15 dan 8


Disini angka 15 masi melanggar syarat karena lebih besar daripada parentnya maka, tukar angka 15 dengan 11



3Menukar angka 15 dengan 11


Jadilah max-heap yang benar.


REMOVE

untuk operasi remove dapat digunakan cara down-heap (heapify-down).

dengan cara mengganti root heap dengan elemen terakhir pada level terakhir. Kemudian cek apakah heapnya sesuai dengan tidak dengan syarat min atau max heap. Jika tidak sesuai, swap dengan salah satu childerennya. (Jika dalam min heap, swap dengann children yg lebih kecil, dan pada maxheap, sebaliknya swap dengan children yg lebih besar). Terus lakukan sampai sesuai dengan syarat


Contoh Remove 4 pada max heap


Valid Tree


Kemudian tree di remove sehingga angka 11 dikeluarkan

4Menghapus root kemudian menukar dengan node paling akhir yaitu 4

Angka 4 sudah melanggar syarat dikarenakan lebih kecil dari child, sehingga tukar dengan child yang lebih besar (angka 8)

5

Jadilah Heap yang sudah lengkap dan sesuai dengan syarat.


Insert (Min-Max Heap)


Jika suatu terjadi penambahan data (insert) maka proses yang dilakukan akan dipengaruhi oleh level data tersebut.

Ketika data baru berada di level min, maka bandingkan dengan parentnya. Jika parent memiliki nilai yang lebih kecil,  dan upheapmax dari parentnya. Jika tidak, upheapmin dari posisi new node. Uphead pada minmax heap tidak membandingkan dengan parent, tetapi grandparent (parent dari parent)


Contoh penerapan jika insert pada level max

Angka 1 dimasukan, sehingga 1 merupakan new Node. Angka 1 berada pada level max, maka jika 1<10 swap.

Angka 1 dan 10 di swap.

Kemudian dari posisi 1 di upheapmin, karena 1<2 maka 1 dan 2 di swap.

Min max heap telah terpenuhi



Contoh penerapan pada level min



Angka 85 baru dimasukkan, dan angka 85 berada level min, sehingga bandingkan dengan parentnya (80). dan 85 > 80 mala swap. Kemudian 85 di upheapmax, tetapi karena 85<90, maka 85 tetap diposisinya.

Jadilah Min-max heap yang sesuai dengan syarat.




Remove(Min-maxHeap)

Remove pada min max heap ada 2 jenis yaitu remove min dan remove max. Jika min, maka root langsung dihapus, jika delete max, maka angka max dari children root akan dihapus. Jika pada delete min dimulai dari level 1, delete max dimulai dari level 2 dan dicari nilai yang paling besar untuk di remove.


Contoh dari remove min-maxheap, delete min



Angka 1 di remove, tukar dengan 80.

Angka 80 dibandingkan dengan grand childnya, yaitu 4,8,3,2. Dikarenakan angka 2 merupakan angka paling kecil. maka swap.

Kemudian cek angka 80 dengan childnya. karena 10 merupakan yang terkecil, maka swap.


 Jadilah minmax heap yang sesuai dengan syarat.



Tries

Tries adalah struktur data yang meiliki bentuk seperti pohon, biasanya menyimpan data berupa string. Tries diambil dari Retrieval, karena Tries dapat menemukan sebuah kata tunggal dengan menggunakan huruf awal. 

Trie | (Insert and Search) - GeeksforGeeks



Demikian penjelasan mengenai Heap dan Tries . Terima kasi ^ ^





Demikian mengenai rangkuman yang saya buat selama 1 semester. Terima Kasih