Variasi Linked List



Pada blog kali ini, saya akan menjelaskan beberapa varian dari linked list. Namun sebelumnya, alangkah lebih baik lagi apabila kita mengulas kembali secara cepat tentang linked list biasa.

Review tentang Linked List

Illustrasi gambar tentang linked list:

Linked list adalah suatu tipe data struktur yang menggunakan alamat memori untuk menunjukkan data selanjutnya. Linked list ini hanya bersifat satu arah saja alias irreversibel. Oleh karena itu, ia tidak dapat kembali ke data sebelumnya. 

Isi dari linked list:
- Pointer ke data selanjutnya
- Kumpulan isi data suatu node, baik itu merupakan kumpulan dari array, char, int, string, maupun data-data lainnya

Contoh node dari linked list dalam bahasa C maupun C++:
struct NodeMahasiswa{
    char nama[10];
    int umur;
    char NIM[12];
    struct Node* next;
}

Karena di sini kita bermain dengan memori, maka untuk menandakan bahwa data tersebut di suatu node adalah data terakhir, maka alamat untuk ke data selanjutnya ditandakan dengan null.

Operasi linked list antara lain:
- Insertion
- Search
- Deletion

Nah, karena kita sudah mengulas kembali materi linked list, maka kita bisa berbicara tentang varian dari linked list tersebut. Berikut penjelasannya.

Double linked list
Double linked list kurang lebih hampir sama dengan linked list pada umumnya. Namun, Ia memiliki satu tambahan pointer lagi, yaitu previous (referensi yang menunjuk ke alamat sebelumnya). Jadi sekarang dia memiliki dua pointer, yaitu previous dan next.

Untuk lebih jelasnya, perhatikan contoh gambar berikut:

Tidak seperti linked list biasa, jika kita sudah maju ke alamat berikutnya, maka kita tidak bisa kembali lagi ke alamat sebelumnya (bersifat satu arah saja, yaitu ke depan). Namun, berkat previous pointer ini, kita bisa bergerak dua arah, yaitu ke alamat selanjutnya dan sebelumnya. Jadi, kita bisa melihat data sebelumnya yang sudah kita lalui.

Circular Linked List
Circular linked list juga hampir sama dengan linked list biasa, namun ia memiliki 1 ciri khas, yaitu ia tidak memiliki pointer yang menandakan data yang kosong (null). Akibatnya, kita bisa balik lagi ke data pertama yang kita sudah lihat sebelumnya.

Circular linked list bisa digambarkan seperti berikut:


Pada gambar di atas, linked list tersebut tidak memiliki pointer yang menunjukkan ke data yang kosong (null). Pada saat kita melakukan beberapa kali looping untuk menelusuri data yang ada, kita pasti akan menemukan data yang sama. Hal ini disebabkan karena pointer next yang berada di ujung linked list tidak menunjukkan null, namun ia kembali lagi ke data awal.

Circular double linked list
Circular double linked list merupakan gabungan dari kedua ciri khas fungsi circular dan double linked list di atas.

Ciri-cirinya adalah:
·        Ia bisa menunjuk ke data sebelumnya
·        Ia bisa balik lagi ke data awal.
·        Tidak memiliki pointer yang menunjuk ke data null

Pada akhirnya, circular double linked list membentuk gambar berikut:



Sebagai penutup...

Saya akan menyajikan contoh kode dalam bahasa C untuk double linked list, yaitu berupa operasi searching, insertion, dan deletion. Jika Anda mau, Anda bisa memodifikasi sedikit dari kode di bawah sehingga operasi-operasi tersebut juga bisa dilakukan di ketiga varian di atas.

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

struct Node{
int data;
struct Node* next;
struct Node* prev;
} typedef Node;

Node* addNode(int data){
Node* node = (Node*) malloc(sizeof(Node));
node->data = data;
node->next = NULL;
node->prev = NULL;
return node;
};

Node* head = NULL;
Node* tail = NULL;

void addNodeFromTail(Node* node){
if (head == NULL){
head = node;
tail = node;
}
else{
tail->next = node;
node->prev = tail;
tail = tail->next;
}
}

void addNodeFromHead(Node* node){
if (head == NULL){
head = node;
tail = node;
}
else{
head->prev = node;
node->next = head;
head = head->prev;
}
}

void addNodeFromMiddle(int index, Node* node){
if (head == NULL){
printf("Currently, the data is empty. We will automatically add this to index 1!\n\n");
head = node;
tail = node;
}
else{
int currentIndex = 1;
Node* temp = head;
while (index != currentIndex){
temp = temp->next;
currentIndex++;
}
node->next = temp;
node->prev = temp->prev;
temp->prev->next = node;
temp->prev = node;
}
}

void scanDataFromHead(){
Node* temp = head;
printf("Previewing from head: ");
while (temp != NULL){
printf("%i ", temp->data);
temp = temp->next;
}
}

void scanDataFromTail(){
Node* temp = tail;
printf("Previewing from tail: ");
while (temp != NULL){
printf("%i ", temp->data);
temp = temp->prev;
}
}

void deleteDataFromHead(){
head = head->next;
free(head->prev);
head->prev = NULL;
}

void deleteDataFromTail(){
tail = tail->prev;
free(tail->next);
tail->next = NULL;
}

void deleteDataFromMiddle(int index){
Node* temp = head;
int counterIndex = 1;
while (counterIndex != index){
temp = temp->next;
counterIndex++;
}
temp->prev->next = temp->next;
temp->next->prev = temp->prev;
temp->prev = NULL;
temp->next = NULL;
free(temp);
}

int main(){
int size = 0;
int i = 0;
int number = 0;
char mode;
printf("============ A Double linked list simulator ============\n");
printf("How many data to be inserted? ");
scanf("%i", &size);
getchar();
printf("Format: integer [space] mode\n");
printf("Middle insertion: integer [space] M [space] index\n");
for (i = 0; i < size;){
printf("Data %i: ", i+1);
scanf("%i %c", &number, &mode);
if (mode == 'T'){
addNodeFromTail(addNode(number));
i++;
}
else if (mode == 'H'){
addNodeFromHead(addNode(number));
i++;
}
else if (mode == 'M'){
int index = 0;
scanf("%i", &index);
addNodeFromMiddle(index, addNode(number));
i++;
}
else{
printf("Type T(tail), H(head) or M(middle) to insert the data!\n");
}
getchar();
}
scanDataFromHead();
printf("\n");
scanDataFromTail();
printf("\n\nHow many data you'd like to delete? ");
int numberDeletedData = 0;
scanf("%i", &numberDeletedData);
getchar();
printf("Format: mode\n");
printf("Middle deletion: M [space] index location data\n");
for (i = 0; i < numberDeletedData;){
printf("Operation %i : ", i+1);
scanf("%c", &mode);
if (mode == 'T'){
deleteDataFromTail();
i++;
}
else if (mode == 'H'){
deleteDataFromHead();
i++;
}
else if (mode == 'M'){
int index = 0;
scanf("%i", &index);
deleteDataFromMiddle(index);
i++;
}
else{
printf("Type T(tail), H(head) or M(middle) to delete the data!\n");
}
getchar();
}
scanDataFromHead();
printf("\n");
scanDataFromTail();
return 0;
}

Sample input (contoh masukan):
6
30 T
10 H
100 H 
200 T
500 M 3
1000 M 2
3
T
H
M 2

Demikianlah blog saya tentang circular, double, dan circular double linked list. Terima kasih karena telah mengunjungi blog saya dan semoga bermanfaat!

Nama pembuat: Anthony Kevin Oktavius

Comments

Popular posts from this blog

Heap

AVL Tree

Binary Tree dan Hash Table