Tujuan
Setelah menyelesaikan modul ini, anda diharapkan dapat :
1. Memahami konsep double linked list dan mampu mengimplementasikannya ke bahasa C.
2. Mampu melakukan operasi add dan delete pada double linked list.
Dasar teori
Salah satu kelemahan single linked list adalah pointer (penunjuk) hanya dapat bergerak satu arah saja, maju/mundur, atau kanan/kiri sehingga pencarian data pada single linked list hanya dapat bergerak dalam satu arah saja. Untuk mengatasi kelemahan tersebut, dapat menggunakan metode double linked list. Linked list ini dikenal dengan nama Linked list berpointer Ganda atau Double Linked List.
Double linked list adalah suatu senarai/list berkait dimana setiap node (elemen) mempunyai 2 penunjuk yaitu satu penunjuk ke node(elemen) pendahulunya (predesesor) dan satu penunjuk ke node (elemen) penerusnya (suksesor).
Tambah di awal (addFirst)
Operasi ini berguna untuk menambahkan elemen baru di posisi pertama. Langkah pertama untuk penambahan data adalah pembuatan elemen baru dan pengisian nilai infonya. Pointer yang menunjuk ke data tersebut dipanggil dengan nama baru. Kondisi di setelah ada pembuatan elemen baru tersebut adalah :
Ada 2 kondisi yang harus diperhatikan dalam penambahan data di awal yaitu : a. Ketika linked list masih kosong
Kalau kondisi linked list masih kosong, maka elemen baru akan menjadi awal dan akhir linked list.
Perhatikan gambar di bawah ini :
• Kondisi sebelum disisipkan
• Kondisi setelah operasi penambahan
Operasi penambahan awal ketika linked list masih kosong adalah dengan mengisikan alamat pointer baru ke pointer awal dan pointer akhir. Lihat gambar di bawah ini.
b. Ketika linked list sudah mempunyai data
Kondisi linked list ketika sudah mempunyai data elemen dan elemen yang baru telah dibuat, dapat dilihat di gambar di bawah ini.
Proses penambahan data di awal linked list adalah :
• Hubungkan baru à kanan agar menunjuk ke awal
• Pindahkan pointer awal ke pointer baru
Tambah di akhir (AddLast)
Operasi ini berguna untuk menambahkan elemen baru di posisi akhir. Langkah pertama untuk penambahan data adalah pembuatan elemen baru dan pengisian nilai infonya. Pointer yang menunjuk ke data tersebut dipanggil dengan nama baru. Kondisi di setelah ada pembuatan elemen baru tersebut adalah :
Ada 2 kondisi yang harus diperhatikan dalam penambahan data di akhir yaitu : a. Ketika linked list masih kosong
Kalau kondisi linked list masih kosong, maka elemen baru akan menjadi awal dan akhir linked list.
Perhatikan gambar di bawah ini :
• Kondisi sebelum penambahan
Operasi penambahan awal ketika linked list masih kosong adalah dengan mengisikan alamat pointer baru ke pointer awal dan pointer akhir. Lihat gambar di bawah ini.
b. Ketika linked list sudah mempunyai data
Kondisi linked list ketika sudah mempunyai data elemen dan elemen yang baru telah dibuat, dapat dilihat di gambar di bawah ini.
Proses penambahan data di akhir linked list adalah :
• Hubungkan akhir à kanan agar menunjuk ke pointer baru
• Hubungkan baruà kiri agar menunjuk ke posisi pointer akhir
Hapus data awal (DeleteFisrt)
Operasi ini berguna untuk menghapus data pada posisi pertama. Ada 3 keadaan yang mungkin terjadi ketika akan melakukan proses hapus yaitu :
a. Kondisi linked list masih kosong
Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked list masih kosong.
b. Kondisi linked list hanya memiliki 1 data
Langkah yang perlu dilakukan ketika ingin melakukan proses penghapusan linked list yang memiliki hanya 1 data adalah dengan langsung menghapus data dari memori dan kemudian pointer awal dan akhir di-NULL-kan. Untuk lebih jelas perhatikan urutan penghapusannya di bawah ini :
• Kondisi data sebelum dihapus
• Proses penghapusan yaitu dengan menghilangkan data dari memori dengan perintah free(awal) atau free(akhir).
Kemudian pointer awal dan akhir diisi dengan NULL.
c. Kondisi linked list memiliki data lebih dari 1 buah
Untuk operasi penghapusan data di posisi pertama pada double linked list yang mempunyai data lebih dari 1 buah adalah :
• Simpan pointer yang akan dihapus (awal) ke suatu pointer lain yang diberi nama pointer bantu.
• Pindahkan pointer awal ke data berikutnya (bantu àkanan atau awal à kanan).
• Field kiri dari awal yang baru (awal kiri) di-NULL-kan.
• Langkah terakhir adalah hapus elemen yang ditunjuk pointer bantu.
• Setelah data dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini.
Hapus data terakhir
Operasi ini berguna untuk menghapus data pada posisi terakhir. Ada 3 keadaan yang mungkin terjadi ketika akan melakukan proses hapus yaitu :
a. Kondisi linked list masih kosong
Jika kondisi ini terjadi, maka proses penghapusan data tidak bisa dilakukan karena linked list masih kosong.
Langkah yang perlu dilakukan ketika ingin melakukan proses penghapusan linked list yang memiliki hanya 1 data adalah dengan langsung menghapus data dari memori dan kemudian pointer awal dan akhir di-NULL-kan. Untuk lebih jelas perhatikan urutan penghapusannya di bawah ini :
• Kondisi data sebelum dihapus
• Proses penghapusan yaitu dengan menghilangkan data dari memori dengan perintah free(awal) atau free(akhir).
Kemudian pointer awal dan akhir diisi dengan NULL.
c. Kondisi linked list memiliki data lebih dari 1 buah
Untuk operasi penghapusan data di posisi terakhir pada double linked list yang mempunyai data lebih dari 1 buah adalah :
• Simpan pointer yang akan dihapus (akhir) ke suatu pointer lain yang diberi nama pointer bantu.
• Pindahkan pointer akhir ke data sebelumnya (bantu à kiri atau akhir àkiri).
• Langkah terakhir adalah hapus elemen yang ditunjuk pointer bantu.
• Setelah data dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini.
Tools yang digunakan
1. PC
2. Dev-C++ / Turbo C++ 4.5
Prototipe dan Primitif/Algoritma
/** filename: DoubleLinkList.h **/ #ifndef DoubleLinkList_H
#define DoubleLinkList_H
#include <stdlib.h> #include "boolean.h" #define Nil NULL
#define Info(P) (P)->info #define Next(P) (P)->next #define Prev(P) (P)->prev #define First(L) ((L).First) typedef int infotype;
typedef struct telmtlist *address; typedef struct telmtlist
{
infotype info; address next;
address prev; }ElmtList; typedef struct { address First; }List; boolean ListEmpty(List L);
/* Mengirim TRUE jika list kosong */ void CreateList(List *L);
/* Membentuk sebuah list kosong */ address Alokasi(infotype X);
/* Menghasilkan address alokasi sebuah elemen */ void Dealokasi(address P);
/* Melakukan dealokasi/pengembalian address P */ address Search(List L, infotype X);
/* Menghasilkan address yang mengandung infotype X, jika tidak ada menghasilkan Nil */
void AddFirst(List *L, infotype X);
/* Menambahkan elemen X pada elemen pertama List */ void AddLast(List *L, infotype X);
/* Menambahkan elemen X pada elemen terakhir List */ void DelFirst(List *L, infotype *X);
/* Menghapus elemen pertama List */ void DelLast(List *L, infotype *X); /* Menghapus elemen terakhir List */ #endif
Praktik
1. Buat file boolean.h.
2. Ketik prototipe/primitif di atas dan simpan dengan nama DoubleLinkList.h. 3. Buat file .c yang berisi implementasi dari file .h.
4. Buat file main driver-nya.
Evaluasi dan Pertanyaan
1. Tambahkan proses tambah data di tengah ! 2. Tambahkan proses hapus data tengah !
Referensi
Kernighan, Brian W and Dennis M. Ritchie. (1988). The C Programming Languange. New Delhi : Prentice Hall of India
Liem, Inggriani. (2007). Diktat Algoritma dan Pemrograman Prosedural. Teknik Informatika ITB
Sjukani, Moh. (2007). Algoritma (Algoritma dan Struktur Data 1) dengan C, C++, dan Java. Jakarta : Mitra Wacana Media