Sunday, April 5, 2020

Review Linked List

Review Linked List
Linked List
Linked List merupakan koleksi linear dari data, yang disebut sebagai nodes, dimana setiap node akan menunjuk pada node lain melalui sebuah pointer.

Insertion
Insertion pada linked list memiliki arti memasukan atau menambah data ke dalam linked list. Biasanya disebut dengan push.
More Info: https://linkedlistads.blogspot.com/2020/03/insertsion-deletion-at-linked-list.html

Deletion
Deletion pada linked list memiliki arti menghapus data dari linked list. Biasanya disebut dengan pop.
More Info: https://linkedlistads.blogspot.com/2020/03/insertsion-deletion-at-linked-list.html

Circular Singly Linked List
Circular Singly Linked List adalah singly linked list yang pada node terakhirnya mempunyai sebuah pointer yang menunjuk ke node pertama sehingga jika digambarkan akan membentuk sebuah siklus.
Circular Singly Linked List

More Info: https://linkedlistads.blogspot.com/2020/03/about-linked-list.html

Doubly Linked List
Doubly Linked List adalah linked list yang pada setiap nodenya memiliki sebuah pointer tambahan yang menunjuk ke node sebelumnya (previous node).
dll
Doubly Linked List

More Info: https://linkedlistads.blogspot.com/2020/03/about-linked-list.html


Circular Doubly Linked List
Circular Doubly Linked List adalah doubly linked list yang pada node pertama dan terakhirnya mempunyai pointer tambahan. Pointer tambahan pada node pertama akan menunjuk ke node terakhir, sedangkan pointer tambahan pada node terakhir akan menunjuk ke node pertama.
Circular doubly linked list
Circular Doubly Linked List
More Info: https://linkedlistads.blogspot.com/2020/03/about-linked-list.html


Stack
Stack adalah tumpukan dimana ia memiliki sistem Last In First Out (LIFO). Contohnya seperti tumpukan buku, dimana jika kita memiliki tumpukan buku maka buku yang teratas akan diambil terlebih dahulu sedangkan yang pertama kali di letakan adalah buku yang paling bawah.
stack

Queue
Queue adalah antrian dimana ia memiliki sistem First In First Out (FIFO). Contohnya seperti antrian tiket kereta, dimana orang yang mengantri duluan akan mendapatkan tiketnya duluan.


Hashing
Hashing adalah teknik untuk mengubah atau mengconvert sebuah string karakters ke suatu key yang lebih singkat nilainya yang merepresentasikan string originalnya.
Hashing digunakan untuk mengambil items dari database karena lebih cepat untuk menemukan item menggunakan key atau kunci yang lebih pendek atau singkat.
Teknik Hashing ini sangat sering digunakan dalam bilang security, selain itu teknik ini juga digunakan oleh Teknologi Block Chain yang sangat populer sekarang ini. Block Chain digambarkan sebagai sebuah block yang menyimpan data, hash, dan hash of previous block. Ketiga tersebut diproteksi dengan menggunakan hash.
More Info: https://linkedlistads.blogspot.com/2020/03/hash-table-binary-tree-at-data-structure.html

Hash Table
Hash Table adalah tabel dalam bentuk array dimana kita menyimpan string original. Index pada tabel adalah key yang di hash.
Hash Function
More Info: https://linkedlistads.blogspot.com/2020/03/hash-table-binary-tree-at-data-structure.html

Binary Tree
Binary Tree adalah pohon yang memiliki paling banyak 2 anak (children).
What is a Binary Tree
Bahasa - bahasa dalam Tree:
                tree
                ----
level 0 -->       j    <-- root
                /   \
level 1 -->    f      k  <-- f & k adalah children dari j
             /   \      \
level 2--> a      h      z    <-- leaves  | a & h adalah children dari f
More Info: https://linkedlistads.blogspot.com/2020/03/hash-table-binary-tree-at-data-structure.html
Binary Search Tree (BST)
Binary search tree adalah sebuah binary tree data structure yang berlandaskan node.
Binary search tree memiliki keuntungan yakni searching dan sortingnya cepat, dan juga deletion dan insertionnya mudah.
Binary search tree memiliki beberapa sifat yakni:
1. Anak pada bagian kiri dari node x lebih kecil daripada x.
2. Anak pada bagian kanan dari node x lebih besar daripada x.
3. Anak dari node x juga termasuk binary search tree.
200px-Binary_search_tree.svg
Binary search tree memiliki 3 operation basic yakni:
- Searching
- Insertion
- Deletion
More Info: https://linkedlistads.blogspot.com/2020/03/binary-search-tree.html
Berikut ini adalah salah satu contoh penggunaan Linked List:
----Dreamer's Market----
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//---L!L---
struct data {
 char nama[20];
 int qty;
 int price;
 struct data*next, *prev;
} *head, *tail, *curr;

void front_push(char nama[], int qty, int price) {
 curr = (struct data*)malloc(sizeof(struct data));
 strcpy(curr->nama, nama);
 curr->qty = qty;
 curr->price = price;
 if (head == NULL) {
  head = tail = curr;
 } else {
  curr->next = head;
  head->prev = curr;
  head = curr;
 }
 tail->next = NULL;
 head->prev = NULL;
}

void back_push(char nama[], int qty, int price) {
 curr = (struct data*)malloc(sizeof(struct data));
 strcpy(curr->nama, nama);
 curr->qty = qty;
 curr->price = price;
 if (head == NULL) {
  head = tail = curr;
 } else {
  tail->next = curr;
  curr->prev = tail;
  tail = curr;
 }
 tail->next = NULL;
 head->prev = NULL;
}
bool push(char nama[], int qty, int price) {
 curr = head;
 while (curr != NULL) {
  if (strcmp(curr->nama, nama) == 0) return false;
  curr = curr->next;
 }
 curr = (struct data*)malloc(sizeof(struct data));
 strcpy(curr->nama, nama);
 curr->qty = qty;
 curr->price = price;
 if (head == NULL) {
  head = tail = curr;
 } else if (strcmp(curr->nama, head->nama) < 0) {
  front_push(nama, qty, price);
 } else if (strcmp(curr->nama, tail->nama) > 0) {
  back_push(nama, qty, price);
 } else {
  struct data *temp;
  temp = head;
  while (strcmp(temp->next->nama, curr->nama) < 0 ){
   if (temp->next == NULL) break;
   temp = temp->next;
  }
  curr->next = temp->next;
  temp->next->prev = curr;
  temp->next = curr;
  curr->prev = temp;
 }
 return true;
}

void front_pop() {
 curr = head;
 head = head->next;
 free(curr);
 head->prev = NULL;
}

void back_pop() {
 curr = tail;
 tail = tail->prev;
 free(curr);
 tail->next = NULL;
}

void pop(int at, int max) {
 if (at == 1) front_pop();
 else if (at == max) back_pop();
 else {
  struct data *temp = head;
  for (int i = 0; i < at-2; i++) {
   temp = temp->next;
  }
  curr = temp->next;
  temp->next = curr->next;
  curr->next->prev = temp;
  free(curr);
 }
}
//---!!!---
void add_item() {
 getchar();
 while (true) {
  system("cls");
  char item[20];
  int qty;
  printf("Input your item name: ");
  scanf("%[^\n]", item);
  getchar();
  printf("Input your item quantity: ");
  scanf("%d", &qty);
  if (qty < 1) {
   printf("Quantity must larger than 0!", qty);
   getchar();
   continue;
  }
  int price = rand() % 100001;
  bool cond = push(item, qty, price);
  if (cond) {
   return;
  } else {
   printf("Item already exist!");
   getchar();
  }
 }
}

void edit_item() {
 while (true) {
  system("cls");
  curr = head;
  int i = 0;
  int in;
  printf("|---------------------------------------|\n");
  printf("| Num. |      Item Name      | Quantity |\n");
  while (curr != NULL) {
   i++;
   printf("| %-4d | %-19s | %-8d |\n", i, curr->nama, curr->qty);
   curr = curr->next;
  }
  printf("|---------------------------------------|\n");
  printf("Enter Item Number to edit >> ");
  scanf("%d", &in);
  if (in <= i && in > 0) {
   curr = head;
   for (int j = 0; j < in-1; j++) {
    curr = curr->next;
   }
   getchar();
   while (true) {
    char nama[20];
    int qty;
    int price = curr->price;
    system("cls");
    printf("Old Name: %s\n", curr->nama);
    printf("Input New Name: ");
    scanf("%[^\n]", nama);
    struct data *temp = head;
    bool cond = true;
    getchar();
    while (temp != NULL) {
     if (strcmp(temp->nama, nama) == 0) {
      printf("Name Already Exist!");
      cond = false;
      getchar();
      break;
     }
     temp = temp->next;
    }
    if (cond == false) continue;
    printf("Old Quantity: %d\n", curr->qty);
    printf("Input New Quantity: ");
    scanf("%d", &qty);
    if (qty < 1) {
     printf("Quantity must larger than 0!", qty);
     getchar();
     continue;
    }
    printf("---Saved!---");
    strcpy(curr->nama, nama);
    curr->qty = qty;
    getchar();
    return;
   }
  }
 }
}

void remove_item() {
 while (true) {
  system("cls");
  curr = head;
  int i = 0;
  int in;
  printf("|---------------------------------------|\n");
  printf("| Num. |      Item Name      | Quantity |\n");
  while (curr != NULL) {
   i++;
   printf("| %-4d | %-19s | %-8d |\n", i, curr->nama, curr->qty);
   curr = curr->next;
  }
  printf("|---------------------------------------|\n");
  printf("Enter Item Number to Remove >> ");
  scanf("%d", &in);
  if (in <= i && in > 0) {
   pop(in, i);
   printf("---Remove Success!---");
   return;
  }
 }
}

void checkout() {
 curr = head;
 int i = 0;
 int total = 0;
 printf("|-----------------------------------------------------------------|\n");
 printf("| Num. |      Item Name      | Quantity |  Price  |   Sub Price   |\n");
 while (curr != NULL) {
  i++;
  printf("| %-4d | %-19s | %-8d | %-7d | %-13d |\n", i, curr->nama, curr->qty, curr->price, curr->price*curr->qty);
  total += curr->price*curr->qty;
  curr = curr->next;
 }
 printf("|-----------------------------------------------------------------|\n");
 printf("| Total Price : Rp.%-46d |\n", total);
 printf("| Kindness is Free! :)                                            |\n");
 printf("|-----------------------------------------------------------------|\n");
 getchar();
 getchar();
 system("cls");
 
}

void menu() {
 int in;
 do {
 system("cls");
  printf("---Dreamer's Market---\n");
  printf("1. Add Item\n");
  printf("2. Edit Item\n");
  printf("3. Remove Item\n");
  printf("4. Checkout\n");
  printf("0. Exit\n");
  printf(">> ");
  scanf("%d", &in);
  if (in == 1) add_item();
  else if (in == 2) edit_item();
  else if (in == 3) remove_item();
  else if (in == 4) checkout();
 } while (in != 0);
}

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