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);
}