Monday, April 6, 2020

Rangkuman


Data Structure
Data structure merupakan menata data-data yang ada agar mudah diakses atau diolah. Cara mengolah data dapat dilakukan dengan berbagai macam cara contohnya seperti linked list, binary search tree, dan hash table.

Linked list merupakan sebuah list dari sebuah data dimana data-data tersebut terhubung. Linked list menggunakan konsep pointer yang membuat sebuah linked list menjadi lebih fleksibel karena data dapat ditambah secara terus menerus tanpa harus mengubah size dari suatu array. Linked list memiliki berbagai macam pengembangan yaitu single linked list, double linked list, circular linked list. Single linked list merupakan sebuah data yang terhubung dengan data yang selanjutnya. Double linked list memiliki konsep yang sama dengan single linked list namun double linked list dapat mengakses data yang sebelumnya dan sesudahnya. Circular linked list memiliki konsep yang sama dengan linked list lainnya namun circular linked list tidak memiliki pointer yang menunjuk ke NULL. Penggunaan dari single linked list, double linked list, dan circular linked list memilki tujuan yang berbeda-beda sesuai kegunaannya. Jika ingin menggunakan program yang ringan namun dalam bentuk linked list silahkan gunakan single linked list karena pointer yang diatur cuman satu dan lebih menghemat memori dan pengembangan dari single linked list adalah stack dan queue. Double linked list digunakan jika ingin memudahkan dalam pemasukan dan penghapusan data akan tetapi double linked list lebih banyak menggunakan resource karena menggunakan pointer lebih banyak dari pada single linked list.

Binary search tree merupakan penerapan dari single linked list namun memilki dua pointer yang menunjuk ke kiri dan ke kanan. Binary search tree sangat sering digunakan untuk mencari sebuah data karena kecepatan dari binary search tree adalah O(logn) atau setara dengan binary search. Didalam sebuah binary tree tidak terdapat data yang sama karena dalam binary search tree hanya mencari jika data itu ada atau tidak.

Hash table merupakan proses untuk mengakses sebuah data dalam sebuah array dengan kecepatan O(1) yaitu dengan kecepatan konstan. Proses dari hash table dalam mencari data dalam sebuah array dengan kecepatan O(1) adalah dengan menyimpan data dalam aray tersebut dengan berbagai perhitungan sehingga mendapatkan posisi dimana data itu akan berada. Namun proses ini dapat menyebabkan sebuah data menyatu dalam satu array atau disebut dengan collision. Cara yang dapat dilakukan untuk mengatasi collision ini dapat menggunakan linked list agar dapat mencegah terjadi nya collision namun dapat menyebabkan hash table menjadi lebih lambat. Sehingga semakin complex perhitungan terhadap hash table tersebut maka kemungkinan untuk terjadinya collision akan menipis karena sebuah data tidak akan masuk dalam satu array yang sama.

Stack dan queue merupakan pengembangan dari konsep single linked list. Stack and queue memilki perbedaan yang sangat tipis. Dalam sebuah stack, jika ingin menghapus sebuah data maka kita akan menghapus data yang paling atas. Begitu juga sebaliknya, pada queue jika ingin menghapus sebuah data dalam queue maka akan menghapus data yang paling bawah.  



Code untuk dreammers market:

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


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

void input(char name[], int quan){
srand(time(0));
struct Data *curr = (struct Data*) malloc(sizeof(Data));
strcpy(curr->nama,name);
curr->qty = quan;
curr->next = NULL;
curr->prev = NULL;
curr->harga = (rand() % (100000 - 30000 + 1)) + 30000;
if(!head){
head = tail = curr;
}
else{
curr->next = head;
head->prev = curr;
head = curr;
}
}

struct Data edit(char name[]){
struct Data *curr = head;
if(!head) return *curr;
else{
while(strcmp(curr->nama,name) != 0){
curr = curr->next;
}
return *curr;
}
}

bool search(char name[]){
struct Data *curr = head;
if(!head) return true;
else if(strcmp(name,head->nama) == 0) return false;
else{
while(strcmp(name,curr->nama) != 0 && curr != NULL){
if(curr->next == NULL){
return true;
}
curr = curr->next;
}
return false;
}
}

bool hapus(char name[]){

if(!head) return false;
else if(head == tail){
if(strcmp(name,head->nama) == 0){
free(head);
return true;
}
else if(strcmp(name,head->nama) != 0){
return false;
}
}
else{
if(strcmp(name,head->nama) == 0){
struct Data *curr = head;
head = head->next;
head->prev = NULL;
free(curr);
curr->next = NULL;
return true;
}
else if(strcmp(name,tail->nama) == 0){
struct Data *curr = tail;
tail = tail->prev;
tail->next = NULL;
free(curr);
curr->prev = NULL;
return true;
}
else{
struct Data *curr = head;
while(strcmp(curr->nama,name) != 0){
if(curr->next == NULL) return false;
curr = curr->next;
}
curr->prev->next = curr->next;
curr->next->prev = curr->prev;
curr->next = NULL;
curr->prev = NULL;
free(curr);
return true;
}
}
}

int check_out(char name[]){
if(!head) return 0;
else if(head == tail){
if(strcmp(name,head->nama) == 0){
return head->harga * head->qty;
}
else if(strcmp(name,head->nama) != 0){
return 0;
}
}
else{
if(strcmp(name,head->nama) == 0){
return head->harga * head->qty;
}
else if(strcmp(name,tail->nama) == 0){
return tail->harga * tail->qty;
}
else{
struct Data *curr = head;
while(strcmp(curr->nama,name) != 0){
if(curr->next == NULL) return 0;
curr = curr->next;
}
return curr->harga * curr->qty;
}
}
}

int main(){
int menu;

do{
printf("1. Input barang\n");
printf("2. Edit barang\n");
printf("3. Hapus barang\n");
printf("4. Check Out\n");
printf("0. Exit\n");
printf("Pilihan: ");
scanf("%d",&menu);
if(menu == 1){
char name[100];
int quan;
do{
printf("Masukkan nama barang : ");
scanf("%s",name);
if(search(name) == false) printf("Nama barang sudah ada\n");
}while(search(name) == false);

do{
printf("\nMasukkan jumlah barang: ");
scanf("%d",&quan);
if(quan == 0) printf("Jumlah barang harus lebih dari 0\n");
}while(quan == 0);

printf("\n\nData anda sudah dimasukkan\n\n");
input(name,quan);
}
else if(menu == 2){
char name[100];
int edit_barang;
printf("Tolong input nama barang yang ingin kami edit : ");
scanf("%s",name);
struct Data temp = edit(name);
printf("Nama: %s\n",temp.nama);
printf("Jumlah barang: %d\n",temp.qty);
printf("Harga: %d\n\n",temp.harga);

printf("Silahkan edit barang anda (tanda \'-\' untuk kurang): ");
scanf("%d",&edit_barang);


printf("\n\nNama: %s\n",temp.nama);
printf("Jumlah barang: %d\n",temp.qty + edit_barang);
printf("Harga: %d\n",temp.harga);
}
else if(menu == 3){
char name[100];

printf("Masukkan nama barang yang ingin di hapus: ");
scanf("%s",name);

if(hapus(name) == false) printf("Barang tidak ada\n\n");
else printf("Barang sudah dihapus\n\n");

}
else if(menu == 4){
char name[100];
printf("Masukkan barang yang anda ingin check-out: ");
scanf("%s", name);
if(check_out(name) == 0) printf("Barang tidak ditemukan\n\n");
else{
printf(" Total harga barang = %d (free)\n", check_out(name));
int beli;
printf("Beli:\n1. Ya\n2. Tidak\n");
printf("Pilihan: ");
scanf("%d",&beli);
if(beli == 1) {
hapus(name);
printf("Kindness is free\n\n");
}
}
}
}while(menu != 0);
}

No comments:

Post a Comment