Linked List pada umumnya adalah urutan data yang saling berhubungan seperti rantai. Pada umumnya linked list memiliki 2 elemen paling umum yaitu "Head" dan "Tail" dimana Head adalah elemen yang berada di posisi paling depan di sebuah linked list dan Tail adalah elemen di posisi terakhir. Terdapat beberapa jenis Linked List yaitu :
1. Single Linked List
Yaitu sebuah linked list yang memiliki head dan tail seperti biasa, dan setiap pointer menunjuk ke element berikutnya. Hanya saja element terakhir (Tail) pointernya akan menunjuk ke NULL.
Visualisasinya adalah sebagai berikut :
![]() |
| double linked list |
2. Double Linked List
Yaitu sebuah linked list yang setiap element, memiliki 2 pointer. 1 pointer untuk menunjuk ke arah element selanjutnya, dan 1 lagi pointer untuk menunjuk ke element sebelumnya. dan setiap Head dan Tail pada double linked list ini akan selalu memiliki 1 pointer yang mengarah ke NULL.
Berikut adalah visualisasinya :
3. Circular Linked List
Circular linked list adalah sebuah linked list yang tidak ada satupun pointer yang menunjuk ke arah NULL. Menagapa begitu? karena pada pointer si-Tail yang seharusnya menunjuk ke NULL, akan di arahkan ke Start sehingga akan terbentuk sebuah loop.
Visualisasinya adalah sebagai berikut :
METODE METODE PADA LINKED LIST
1. Push();
Push adalah
sebuah function yang berguna untuk memasukkan data kedalam sebuah linked list.
nah cara memasukkan data ini ada 2. yaitu push head dan push tail.
a. Push
head
Push head
adalah memasukkan data melalui depan sehingga data di belakangnya bergerak, dan
data yang dimasukkan menjadi didepan alias menjadi head dari linked list
tersebut. contohnya kita punya linked list berupa = {10 , 20 , 30}, maka jika
kita PushHead(60) linked list yang kita miliki akan menjadi = {60, 10, 20, 30}
dan yang menjadi head adalah '60'.
b. Push tail
Push tail
adalah kebalikan dari push head. Jika di push head kita memasukkan data
didepan, di push tail kita memasukkan data di belakang dan menjadikan data yang
baru masuk tersebut tail dari linked list yang kita punya. Contohnya kita punya
list = {10, 20, 30} dan jika kita PushTail(40) maka list kita akan menjadi =
{10, 20, 30, 40}.
2. pop();
pop adalah sebutan fungsi
untuk menghapus linked list yang kita miliki. pop juga mempunyai 2 jenis yaitu
pop head dan pop tail. cara kerjanya juga sama dengan push head dan push tail,
hanya saja pop ini bukan menambah melainkan menghapus.
STACK
adalah salah satu list
linear dalam struktur data yang digunakan untuk menyimpan dan mengambil data
dengan konsep LIFO (Last In First Out). Dalam prosesnya,
untuk memasukkan sebuah data ke dalam stack atau dengan kata lain ke bagian
atas dari sebuah tumpukan digunakan perintah push. Dan untuk memindahkan
data dari tempat tersebut digunakan perintah pop. Sedangkan dalam
penyajiannya, stack bisa memakai array atau linked list.
QUEUE (ANTRIAN)
Queue
merupakan suatu struktur data linear. Konsepnya hampir sama dengan Stack,
perbedaannya adalah operasi penambahan dan penghapusan pada ujung yang bebeda.
Penghapusan dilakukan pada bagian depan (front) dan penambahan berlaku pada
bagian belakang (Rear). Elemen-elemen di dalam antrian dapat bertipe integer,
real, record dalam bentuk sederhana atau terstruktur. Dan Sistem pada
pengaksesan pada Queue menggunakan sistem FIFO (First In First Out), artinya
elemen yang pertama masuk itu yang akan pertama dikeluarkan dari Queue.
Operasi-operasi pada Queue
1. Create Queue (Q) :
membuat antrian baru Q, dengan jumlah elemen kosong.
2. Make NullQ (Q) :
mengosongkan antrian Q, jika ada elemen maka semua elemen dihapus.
3. EnQueue : berfungsi
memasukkan data kedalam antrian.
4. DeqQueue : berfungsi
mengeluarkan data terdepan dari antrian.
5. Clear : Menghapus
seluruh Antrian
6. IsEmpty : memeriksa
apakah antrian kosong
7. IsFull : memeriksa
apakah antrian penuh.
Binary Search Tree
Sebuah Binary Search Tree atau BST singkatnya adalah suatu struktur data yang mendukung cepatnya pencarian, sorting atau peanataan beruntun dan juga masukan dan penghapusan data yang mudah. BST juga dikenal sebagai bentuk yang lebih berurutan dari Binary tree.
Pada BST terdapat juga
hal-hal demikian:
> Subtree
kiri dari suatu node biasanya hanya memiliki keys yang lebih sedikit dari
pada key pada nodenya
> Subtree kanan
dari suatu node biasanya memiliki keys yang lebih banyak atau lebih besar dari
pada key pada nodenya.
> Subtree kiri
dan kanan,masing-masing harus berbentuk BST dan tidak boleh ada node yang sama.
BST juga memiliki fungsi
seperti, find, insert dan remove.
Pada BST biasanya juga
disediakan dengan urutannya diantara keys agar dapat memudahkan operasi atau
fungsi pencarian seperti mencari nilai minimum dan nilai maksimum. jika tidak
ada urutan tersebut maka saat mencari akan dibutuhkan untuk setiap key dicari
untuk menemukan kunci yang diperlukan.
Contoh dari BST =
>>
A. Find
Dengan fungsi ini pertama
akan dibandingkan key dengan akar dari nodenya, jika key nya terdapat pada akar
yang sesuai maka, return akarnya. Jika key nya lebih kecil dari key akarnya,
maka kita bisa pindahkan ke subtree bagian kiri. Jika tidak berhasil maka
pencarian akan dilemparkan ke bagian sebelah kanan.
B. Insert
>> Dimulai dari awal
akarnya
>> Kedua, nilai yang
akan ditambahkan akan dibandingkan dengan bagian kiri subtree, dan jika
nialinya lebih besar dari bagian kiri subtree maka dimasukkan ke bagian kanan
>> Pengulangan akan
terus terjadi hingga terdapat node kosong untuk dimasukkan nilai baru secara
rekursif
C. Delete
>> Jika nilainya
terdapat di akhir node atau leaf, maka bisa langsung di delete nodenya.
>> Jika key atau
nilainya adalah sebuah node maka delete node tersebut dan sambungkan cabang
yang berhubungan dengan bagian sebelumnya.
>> Jika key atau
nilainya memiliki dua nak cabang maka cari anak paling kiri dari subtree kanan
atau juga anak paling kanan dari subtree kiri untuk menggantikannya dan
pengulangan terjadi secara rekursif hingga hasil telah didapatkan.
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
int choose = -1;
char itemName[105];
int qty = -1;
int oldStock, newStock;
char editItem[105];
char removeItem[105];
struct data{
char itemName[105];
int value, price;
struct data *next, *prev;
}*head = NULL, *tail = NULL, *curr;
void pushQueue(char x[], int value, int price){
data*temp = (struct data*) malloc(sizeof(struct data));
strcpy(temp->itemName,x);
temp->value = value;
temp->price = price;
temp->next = temp->prev = NULL;
if(head == NULL){
head = tail = temp;
}
else{
tail->next = temp;
temp->prev = tail;
tail = temp;
}
}
void printAll(){
curr = (struct data*) malloc(sizeof(struct data));
curr = head;
int i = 1;
while(curr != NULL){
printf ("%d. %-10s %-3d\n", i, curr->itemName, curr->value);
curr = curr->next;
i++;
}
}
void updateData(int lama, int baru){
curr = (struct data*) malloc(sizeof(struct data));
int pos = 0;
curr = head;
while(curr!=NULL){
pos++;
if(curr->value == lama){
curr->value = baru;
printf ("Successful!\n");
return;
}
if(curr->next!=NULL){
curr = curr->next;
}
else break;
}
}
int checkStock(int lama){
curr = (struct data*) malloc(sizeof(struct data));
curr = head;
int pos = 0;
if(head == NULL){
printf ("Item list is empty...\n"); getchar();
}
else{
while(curr!=NULL){
pos++;
if(curr->value == lama){
return 1;
}
if(curr->next!=NULL){
curr = curr->next;
}
else break;
}
}
return 0;
}
void deleteItem(char x[105]){
if(head == NULL){
printf ("Item list is empty...\n"); getchar();
}
else if(head == tail){
free(head);
head = tail = NULL;
}
else if(strcmp(x,head->itemName) == 0){
curr = head;
head = head->next;
free(curr);
}
else if(strcmp(x,tail->itemName) == 0){
curr = tail;
tail = tail->prev;
free(curr);
tail->next = NULL;
}
else{
curr = head;
while(curr != NULL && strcmp(x,curr->itemName) != 0){
curr = curr->next;
}
if(curr == NULL){
puts("No item found!\n");
}
else{
curr->next->prev = curr->prev;
curr->prev->next = curr->next;
free(curr);
}
}
}
void pilih1(){
int random = (rand() %(10000 + 1 - 1000)) + 1000;
do{
printf ("Input item name :");
scanf ("%[^\n]", itemName); getchar();
} while (strlen(itemName) < 5 || strlen(itemName) > 10);
do{
printf ("Input item stock :");
scanf ("%d", &qty); getchar();
}while(qty < 1);
pushQueue(itemName,qty, random);
}
void pilih2(){
curr = (struct data*) malloc(sizeof(struct data));
curr = head;
if(curr != NULL){
printAll();
printf ("Choose stock to edit: ");
scanf ("%d", &oldStock); getchar();
if(checkStock(oldStock) == 1){
printf ("Input new stock: ");
scanf ("%d", &newStock);
updateData(oldStock,newStock);
} else{
printf ("%d does not found!\n", oldStock); getchar();
}
}
else{
printf ("Item list is empty...\n"); getchar();
}
puts("");
}
void pilih3(){
curr = (struct data*) malloc(sizeof(struct data));
curr = head;
if(curr != NULL){
printAll();
printf ("Choose item to delete: ");
scanf ("%s", removeItem); getchar();
deleteItem(removeItem);
}
else{
printf ("Item list is empty...\n"); getchar();
}
}
void deleteList(struct data** head_ref) {
struct data* current = *head_ref;
struct data* next;
while (current != NULL)
{
next = current->next;
free(current);
current = next;
}
*head_ref = NULL;
}
void pilih4(){
curr = head;
if(curr == NULL){
printf ("Item list is empty!\n"); getchar();
}
else{
int i = 1;
int total = 0;
while(curr != NULL){
printf ("%d. %-10s %-3d Rp.%2d\n", i, curr->itemName, curr->value, curr->price);
total += (curr->value * curr->price);
curr = curr->next;
i++;
}
printf("Total = Rp.%d\n", total);
puts("Kindness is free!"); getchar();
}
deleteList(&head);
return;
}
int main(){
srand(time(NULL));
do{
system("toko");
printf ("Toko Jaya\n");
printf ("1. Add item\n");
printf ("2. Edit item\n");
printf ("3. Delete item\n");
printf ("4. CheckOut\n");
printf ("5. Exit\n");
printf ("Choose >>");
scanf ("%d", &choose); getchar();
system("toko");
switch(choose){
case 1:
pilih1();
break;
case 2:
pilih2();
break;
case 3:
pilih3();
break;
case 4:
pilih4();
break;
}
} while(choose != 5);
return 0;
}





Comments
Post a Comment