Summary
Linked List
Linked List adalah struktur data yang terdiri dari urutan record data dimana setiap record memiliki field yang menyimpan alamat/referensi dari record selanjutnya (dalam urutan). Elemen data yang dihubungkan dengan link pada Linked List disebut Node. Biasanya didalam suatu linked list, terdapat istilah head dan tail.- Head adalah elemen yang berada pada posisi pertama dalam suatu linked list
- Tail adalah elemen yang berada pada posisi terakhir dalam suatu linked list
- Single Linked List
- Double Linked List
- Circular Linked List
- Multiple Linked List
- Doubly Linked List
- Circular Doubly Linked List
Single Linked List
Linked List merupakan kumpulan dari banyak data, yang disebut sebagai
nodes, dimana setiap node akan menunjuk pada node lain melalui
pointer. Linked List bisa juga disebut kumpulan data linear.
Linked List yang memiliki satu penghubung dengan node lain, disebut single linked list.
Dalam Linked List pasti terdapat node yang bernama head dan tail. Head
yang dimaksud disini adalah penunjuk untuk menunjukkan dimana letak data
pertama dan tail menunjukkan dimana letak data terakhir.
Sebuah linked list, dikatakan kosong jika tidak memiliki head yang menandakan bahwa node tersebut kosong.
1. Push (Memasukkan data)
2. Pop (Menghapus data dari Node)
1. Push
Push merupakan operasi pada linked list untuk menginsert suatu data pada node, push bisa saja dilakukan pada head, tail, ataupun index.
Contoh push adalah sebagai berikut:
Jika terdapat node yang berisi angka 7, 6, 9, 3, 5 , NULL
Kemudian pushHead(4) maka hasilnya akan menjadi 4, 7, 6, 9, 3, 5, NULL
Sama halnya jika melakukan pushTail(10) hasilnya akan menjadi 4, 7, 6, 9, 3, 5, 10, NULL
Untuk contoh kode pushHead bisa dilihat dibawah ini
public void pushHead(int n){ // int n ini merupakan data yang akan dimasukkan pada linked list
struct Data* curr = (struct Data*)malloc(sizeof(Data));
curr->isi = n;
if(head==NULL) head = tail = curr; // Jika belum terdapat head
else{
curr->next = head;
head = curr;
}
}
curr->isi = n;
if(head==NULL) head = tail = curr; // Jika belum terdapat head
else{
curr->next = head;
head = curr;
}
}
2. Pop
Pop merupakan kebalikan dari push, dimana fungsi pop adalah mendelete
suatu data dalam linked list dan melepaskanny agar memory dapat dipakai
kembali. Pop biasa digunakan untuk mendelete head, tail ataupun suatu
index.
Contoh pop:
terdapat suatu data 1, 5, 6, 7, 8, 9, NULL
terdapat suatu data 1, 5, 6, 7, 8, 9, NULL
Kemudian popHead() maka hasilnya akan menjadi 5, 6, 7, 8, 9, NULL
Jika popTail() maka hasilnya akan menjadi 5, 6, 7, 8, NULL
Untuk contoh kode dari popHead bisa dilihat dibawah ini
void popHead(){
struct Data* curr = head;
head = head->next; // merubah head ke angka selanjutnya dikarenakan angka pada head akan dilepas
free(curr);
}
struct Data* curr = head;
head = head->next; // merubah head ke angka selanjutnya dikarenakan angka pada head akan dilepas
free(curr);
}
Double Linked List
Double Linked List adalah salah satu contoh lain implementasi linked list selain single linked list. Sesuai namanya, Double artinya blok data yang kita miliki akan memiliki 2 penunjuk kiri dan kanan untuk menentukan data sebelum/sesudahnya. Berbeda dengan single linked list yang hanya mempunyai satu penunjuk, double linked list mempunyai 2 penunjuk kiri dan kanan untuk menentukan urutan datanya.Circular Linked List
Circular Linked List merupakan suatu linked list dimana tail (node terakhir) menunjuk ke head (node pertama). Jadi tidak ada pointer yang menunjuk NULL.Ada 2 jenis Circular Linked List, yaitu :
- Circular Single Linked List
- Circular Double Linked List
Circular Single Linked List
Single Linked List Circular adalah Single Linked List yang pointer nextnya menunjuk pada dirinya sendiri. Jika Single Linked List tersebut terdiri dari beberapa node, maka pointer next pada node terakhir akan menunjuk ke node terdepannya.
Circular Double Linked List
Double Linked List adalah linked list dengan node yang memiliki data dan dua buah reference link (biasanya disebut next dan prev) yang menunjuk ke node sebelum dan node sesudahnya.
Hash Table and Binary Tree
Ketika kita diberikan data yang sangat banyak, kita harus membutuhkan suatu data structure yang cepat untuk melakukan banyak hal (insert, delete,dan search). Seharusnya kita mempunyai kunci(key) untuk dapat mengakses data tersebut, agar ketika kita mencari, kita hanya tinggal memakai key tersebut, sehingga waktu yang diperlukan untuk mencari data lebih efisien, karena sudah mendekati dimana lokasi data tersebut dibanginkan jika kita mencari data secara linear(satu per satu). Ada beberapa cara untuk mengimplementasi cara penggunaan key ini, contoh nya seperti, hash table, balanced binary search tree(bst) dan doubly linked list.Hash Table
Untuk sekarang, saya akan menjelaskan tentang hash table. Hash table merupakan method tercepat yang dapat digunakan insert,delete dan search dibandingkan bst dan double linked list.
Di dalam hash table terdapat suatu function bernama hash function, hash function adalah function untuk menempatkan index dari suatu key dalam suatu array.
Ada banyak cara hash function seperti, salah satu contohnya division method, division method adalah salah satucara pada hash function dimana kita akan menaruh suatu index pada array h dimana
h(k) = k%m , k disini merupakan key dan m merupakan panjang arraynya.
dibawah ini merupakan contoh dari division method:
untuk contoh disamping, terdapat key 1276, maka index dari key tersebut akan disimpan dalam array ke - [6]
Namun, apa yang terjadi jika dalam array tersebut telah terdapat data yang telah disimpan? ini disebut hash collision. Ada banyak cara untuk mengatasi hash collisin ini, contohnya seperti open addressing dan closed addressing.
Open Addressing
suatu cara yang digunakan untuk mencari tempat kosong setelah tempat key tersebut terisi.
Contoh penggunaan open addressing pada bahasa C
Closed Addressing
cara yang digunakan untuk menempatkan suat data secara linked list.
Contoh penggunaan closed addressing
Binary Tree
Tree Concept
Tree adalah sebuah struktur data yang memiliki bentuk sebuah pohon, yang terdiri dari serangkaian node (simpul) berisi data yang saling berhubungan.Binary tree
Binary Tree adalah sebuah pohon yang menyimpan data, keunikan binary tree adalah mensortir semua data yang dimasukkan. Sebuah binary search tree memiliki root dan cabang left serta right pada setiap nodenya.
dalam binary tree, kita dapat melakukan insert.
Contoh dari insert dalam binary tree: mencari dari parent dimana lokasi yang tepat untuk memasukkan nilai, dan jika ditemukan bahwa parentnya tersebut NULL, masukkan ke dalam parent
Berikut adalah contoh code di C jika kita ingin memasukkan data sesuai gambar diatas
Binary Search Tree
Binary Search Tree adalah tree yang terurut. Binary Search Tree sering disebut dengan Sorted Binary Tree yang berfungsi untuk menyimpan informasi nama atau bilangan yang disimpan di dalam memory. Implemetasi binary search tree ini biasanya data akan dibagi menjadi dua dengan mencari titik tengah seagai patokannya. Binary tree terdiri dari anak satu pertama yang disebut dengan istilah root. Root tersebut memiliki anak(rootbaru) kiri dan anak kanan. Data disimpan setelah root disimpan berdasarkan nilai perbandingan dengan root tersebut. Pengurutan dengan metode in-order. Data yang telah tersusun dalam struktur data BST dapat dicari dengan mudah dan memiliki rata-rata kompleksitas sebesar O(log n), namun membutuhkan waktu sebesar O(n) pada worstcase dimana BST berbentuk seperti linked list.
Contoh implementasi code C insert,delete dalam bst.
/*
#include <stdio.h>
#include <stdlib.h>
struct Node{
int value;
Node *left,*right;
}*root,*curr;
Node *createNode(int val){
curr = (Node*) malloc(sizeof(Node));
curr->value = val;
curr->left = curr->right = NULL;
return curr;
}
Node *insertNode(Node *parent,int value){
if(!parent)
return createNode(value);
else if(parent->value == value)
return parent;
else if(parent->value > value)
parent->left = insertNode(parent->left,value);
else
parent->right = insertNode(parent->right,value);
}
Node *removeNode(Node *parent,int value){
if(!parent)
return parent;
else if(parent->value > value)
parent->left = removeNode(parent->left,value);
else if(root->value < value)
parent->left = removeNode(parent->left,value);
else if(parent->value == value){
if(parent->left == NULL || parent->right == NULL){
Node *temp = parent->left != NULL ? parent->left : parent->right;
if(temp)
*parent = *temp;
else{
temp = parent;
parent = NULL;
}
free(temp);
}
else{
Node *temp = parent->left;
while(temp->right)
temp = temp->right;
parent->left=removeNode(parent->left,temp->value);
}
return parent;
}
}
void print(Node *parent){
if(parent){
print(parent->left);
printf("%d ",parent->value);
print(parent->right);
}
}
int main(){
root = insertNode(root,20);
root = insertNode(root,5);
root = insertNode(root,14);
root = insertNode(root,3);
root = insertNode(root,16);
root = insertNode(root,22);
root = insertNode(root,19);
root = removeNode(root,3);
//print in order
print(root);
}
*/
Dan untuk tugas membuat aplikasi dengan konsep double linked list terdapat dalam web :
https://linkedlisttugasmingguan.blogspot.com/2020/04/code-example-for-double-linked-list.html
Demikian rangkuman mengenai hal hal apa saja yang saya pelajari sampai saat ini, Terima Kasih.
Tidak ada komentar:
Posting Komentar