Saturday, April 4, 2020

Rangkuman

array dan linked list bisa dibilang sama namun tak sama.
perbedaan array dan linked list adalah
array
  • kumupulan dari data
  • menyimpan datanya di memory yang beruurtan
  • bisa mengakses data mana saja secara langsung

linked list
  • kumpulan dari node
  • menyimpan node di memory yang secara acak
  • hanya bisa diakses secara berurutan


array dan linked list memiliki kelebihan dan kekurangan tersendiri.
contohnya adalah
kelebihan array
  • mudah digunakan
  • lebih cepat megakses data mana saja

kekurangan array
  • ukuran tidak dapat dirubah sehingga terkadang memakan banyak memory

kelebihan linked list
  • penggunaan memory sesuai banyaknya data yang ada sehingga irit
  • sistemnya fleksibel

kekurangan linked list
  • pengerjaan lebih komples

linked list terdapat banyak macam, beberapa contohnya adalah
  • circular linked list
  • double linked list

circular linked list dalam permasalahan yang berhubungan dengan head dan tail memang lebih cepat diselesaikan dan juga ia bisa ke node manapun.
namun apa bila tidak di coding dengan benar dapat terjadi infinite loop dan juga karena ia hanya satu arah, ia tidak bisa mundur sehingga jika ia harus mengelilingi list terlebih dahulu untuk mencapai sebuah node jika ia terletak disebelumnya.


linked list cara kerjanya adalah dengan cara menyimpan alamat satu sama lain bukan dengan menyimpan isi dari alamat tersebut.

setiap alamat akan mempunyai hubungan dengan alamat berikutnya sehingga mereka akan saling menyambung
Image result for linked listseperti di atas cara kerjanya data pertama jika di next maka dia akan ke data b karena setelah data a itu tersimpan alamat dari data b.

head akan selalu ada pada data pertama sedangkan pada ujung akan bernama tail dan dia tidak akan menunjuk kemana-mana maka panak tersebut dituliskan NULL.

pada linked list biasa dia tidak bisa bergerak mundur maka ia akan selalu bergerak dari head ke tail.

seperti berikut adalah codingnya


coding di atas adalah untuk memasukan data kedalam linked list

sedangkan dibawah ini adalah cara menghapus data paling atas dari linked list


double hampir sama dengan linked list biasa namun bedanya dia bisa mundur
cara kerjanya seperti di bawah ini
Image result for types of linked list



Hashing

Hashing merupakan Teknik untuk menyimpan dan mengambil keys dengan cara yang cepat.

Hashing menyimpan keysnya di array yang bernama hash table dan menggunakan function yang sudah ditentukan yaitu hash function.

Hashing terdapat 5 jenis:
  • Mid-square
  • Division (paling sering digunakan)
  • Folding
  • Digit Extraction
  • Rotating Hash
Mid square caranya adalah dengan mempangkatkan angka yang ingin disimpan yang kemudian akan diambil angka tengahnya.

Divison caranya adalah dengan memodulus angka yang ingin disimpan dengan ukuran dari size table yang diberikan/digunakan.

Folding caranya adalah dengan membagi setiap angka menjadi 2 bagian yang kemudian akan saling ditambahkan.

Digit extraction caranya adalah mengambil digit pada letak-letak terntetu yang sudah ditentukan sebelumnya dan angka tersebut kemudian akan menjadi hash addressnya.

Rotating hash caranya adalah menggunakan mid-square atau division terlebih dahulu buat dapet hash adressnya dan kemudian dibalik angkanya.

Hashing pada saat ini digunakan dalam blockchain, terutama dalam cryptocurrency. Hashing sangatlah penting dalam pengaturannya. Hash bagaikan backbone dalam cryptocurrency.
Hash membantu dalam menyimpan data yang sangat banyak dalam blockchain.

Collision

Collasion terjadi ketika ada string yang memiliki hash key yang sama contohnya seperti float dan floor dimana sama-sama berawalan f.

Collison bisa diatasi dengan 2 cara:
  • Linear probing
  • Chaining
Linear probing adalah mencari tempat kosong selanjutnya dan menaruhnya disana. Namun, cara ini sangatlah tidak efisien karena ketika string tersebut ingin dicari looping yang dilakukan akan banyak.

Chaining adalah meletakkan string tersebut sebagai linked list jadi apa bila floor terletak di hash key 5 maka ia linked list ke float jadi tidak membuang-buang waktu untuk mencarinya.

Tree

Tree merupakan struktur yang menunjukan hirarki antar non-linear data.
Node dalam tree tidak perlu disimpan secara berurut, ia dapat disimpan secara asal dan kemudian dihubungkan dengan pointer.

Konsep tree
  • Node yang paling diatas disebut root.
  • Line yang menghubungankan antara parent dan child disebut edge.
  • Node yang tidak memiliki children disebut leaf.
  • Node yang memiliki parent yang sama disebut sibling.
  • Degree of node mereupakan jumlah dari sub tree sebuah node.
  • Height/Depth merupakan maksimum degree dalam sebuah tree.
  • Jika ada line yang menghubungkan antara p dan q, maka p disebut ancestor dari  q, dan q adalah descendant dari p.

Binary tree

Konsep binary tree
  • Binary tree merupakan struktur data tree dimana setiap node maksimal memiliki 2 node.
  • Setiap 2 children tersebut biasanya dibedakan sebagai left child atau right child.
  • Node yang tidak memiliki children disebut leaf.

Tipe binary tree
  • Perfect binary tree
  • Complete binary tree
  • Skewed binary tree
  • Balanced binary tree

Perfect binary tree adalah dimana setiap level mempunyai height/depth yang sama.

Complete binary tree adalah binary tree yang setiap levelnya, kecuali yang terakhir terisi penuh dan semua node dipenuhkan pada sisi kiri tree. Semua perfect binary tree merupakan complete binary tree.

Skewed binary tree merupakan tree yang setiap nodenya maksimal memiliki 1 child.

Balanced binary tree merupakan tree dimana leaf yang satu tidak boleh lebih jauh levelnya dari leaf yang lain jadi harus seimbang.

Berikut adalah codingan untuk menu sebuah supermarket dengan double linked list


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

struct data{
char nama[100];
int harga;
int qty;
struct data *next;
struct data *prev;
}*head, *tail;

void push(char vnama[100], int vqty, int vharga){
struct data *node = (struct data*)malloc(sizeof(struct data));

strcpy(node->nama, vnama);
node->qty = vqty;
node->harga = vharga;

node->next = node->prev = NULL;

if(head == NULL){
head = tail = node;
}else if(strcmp(head->nama, vnama)>0){
node->next = head;
head->prev = node;
head = node;
}else if(strcmp(tail->nama, vnama)<0){
node->prev = tail;
tail->next = node;
tail = node;
}else{
struct data *curr = head;
while(strcmp(curr->next->nama, vnama)<0){
curr = curr->next;
}
curr->next->prev = node;
node->next = curr->next;
curr->next = node;
node->prev = curr;
}
}

void pop(char vnama[100]){
if(head != NULL){
if(head==tail && strcmp(head->nama,vnama)==0){
free(head);
head =tail = NULL;
}else if(strcmp(head->nama,vnama)==0){
head = head->next;
free(head->prev);
head->prev = NULL;
}else if(strcmp(tail->nama,vnama)==0){
tail = tail->prev;
free(tail->next);
tail->next = NULL;
}else{
data *node = head->next;
while(node!=tail && strcmp(node->nama, vnama)!=0){
node = node->next;
}
if(strcmp(node->nama, vnama)==0){
node->prev->next = node->next;
node->next->prev = node->prev;
free(node);
node = NULL;
}else{
printf("There is no data\n");
}
}
}else{
printf("There is no data\n");
}
}

void popall(){
while(head!=NULL){
if(head==tail){
free(head);
head =tail = NULL;
}else{
data *curr=head;
head=head->next;
free(curr);
}
}
}

void edit(char vnama[100], int vqty){
if(head != NULL){
data *node = head;
while(node!=NULL && strcmp(node->nama, vnama)!=0){
node = node->next;
}
if(strcmp(node->nama, vnama)==0){
node->qty = vqty;
}else{
printf("There is no data\n");
}
}else{
printf("There is no data\n");
}
}

void viewALL(){
int total=0;
if(head==NULL){
printf("No Items to Checkout\n");
}else{
data *node = head;
while(node!=NULL){
printf("%-15s  %-3d  Rp.%-5d  Rp.%d\n", node->nama, node->qty, node->harga, node->qty*node->harga);
total+=node->qty*node->harga;
node = node->next;
}
printf ("\nHere is Your Total Rp.%d\n", total);
}
}

void viewcart(){
if(head==NULL){
printf("\n");
}else{
data *node = head;
while(node!=NULL){
printf("%-15s  %-3d\n", node->nama, node->qty);
node = node->next;
}
}
}



int main(){
int menu;
char nama[100];
int qty, co;
int harga;
srand(time(0));
do{
printf("\nDREAMMERS MARKET\n");
printf("^^^^^^^^^^^^^^^^\n");

printf("\nCart:\n");
viewcart();

printf("\nMenu :\n");
printf("1. Add goods\n");
printf("2. Change qty\n");
printf("3. Delete goods\n");
printf("4. Checkout\n");

printf(">> Input choice : ");
scanf("%d", &menu);getchar();
printf("\n");
switch(menu){
case 1:

printf("Masukan Nama Barang: ");
scanf("%[^\n]", &nama);

printf("Masukan Qty[1-100]: ");
scanf("%d", &qty);

harga = (rand()%100)*1000;

push(nama,qty,harga);

printf("--- Add goods Success ---\n");
break;

case 2:
printf("Masukkan nama barang(pastikan namanya sama saat input): ");
scanf("%[^\n]", &nama);
printf("Masukan Qty[1-100]: ");
scanf("%d", &qty);
edit(nama,qty);
printf("--- Change goods qty Success ---\n");
break;

case 3:
printf("Masukkan nama barang(pastikan namanya sama saat input): ");
scanf("%[^\n]", &nama);
pop(nama);
printf("--- Delete goods Success ---\n");
break;

case 4:
printf("Here is your bill\n\n");
viewALL();
printf("\nDo you wish to pay?\n");
printf("1. Yes\n2. No\n");
printf(">> Input choice : ");
scanf("%d", &co);
if(co == 1){
printf("Kindness is free\n");
popall();
break;
}else{
printf("It's okay kindness is free\n");
popall();
break;
}

}

}while(menu!=4);

}