Daftar bertaut ganda - E

advertisement
Linked list
Linked List adalah struktur data yang berbeda dengan struktur data array. Linked list dapat
dibayangkan seperti rantai yang bersambung satu sama lainnya. Tiap-tiap rantai (node)
terhubung dengan pointer.
Gambar berikut memperlihatkan sebuah Linked List.
Sebelum kita membahas lebih jauh tentang Linked List, alangkah baiknya bila kita mengulang
sedikit tentang struct dan typedef. Struct atau structure dalam bahasa pemograman C/C++
digunakan untuk mendefinisikan tipe data yang memiliki anggota (member) bertipe tertentu.
Berikut contoh dan cara mendeklarasi sebuah struct:
struct tgl {
int hari;
int bulan;
int tahun;
}
struct tgl Tanggal;
Bila divisualisasikan kira-kira sebagai berikut:
Contoh di atas memperlihatkan bagaimana mendeklarasi sebuah struct dengan nama struct tgl
yang memiliki tiga member yaitu hari, bulan dan tahun yang bertipe int (integer). Kemudian,
sebuah variabel Tanggal dideklarasikan bertipe struct tgl. Untuk mempersingkat dan
menyederhanakan pendeklarasian sebuah struct, kata cadang typedef biasa digunakan.
Sesuai namanya, typedef digunakan untuk mendefinisikan sebuah tipe data menjadi suatu alias
tertentu. Perhatikan contoh berikut:
Dengan cara yang sama, pendeklarasian struct tgl di atas dapat disederhanakan menggunakan
kata cadang typedef menjadi:
typedef struct tgl {
int hari;
int bulan;
int tahun;
} Date;
Date Tanggal;
Single Linked List
Linked list dapat dianalogikan sebagai rantai yang terdiri dari beberapa node yang saling terkait.
Dengan memegang node terdepan, maka node-node yang saling terkait lainnya dapat kita
telesuri.
Dengan hanya mencatat atau memegang alamat dari alokasi data bertipe struct root pada sebuah
variabel LL maka keberadaan node-node dalam linked list tersebut dapat diketahui. Bila datadata dalam node berupa bilangan bulat, maka struct yang diperlukan untuk membentuk linked
list adalah sebagai berikut:
typedef struct node * NodePtr;
typedef struct node {
int data;
NodePtr next;
}Node;
typedef struct root {
NodePtr head;
unsigned size;
}Root;
Root LL;
Penambahan Node Linked List
Bila setiap penambahan simpul pada linked list dilakukan pada bagian depan (paling dekat
dengan head) maka kompleksitas yang diperlukan untuk menambah node baru dalam linked list
konstan atau O(1). Penambahan sebuah node dengan nilai 3 pada linked list di atas dapat
divisualisasikan sebagai berikut:
Penelusuran Node Linked List
Kompleksitas penelusuran (pencarian) node dalam linked list adalah linier atau O(n). Hal ini
disebabkan karena node-node dalam linked list disusun secara acak (tidak berurut). Seandainya
pun simpul-simpul dalam linked list disusun secara berurut, metode pencarian biner (binary
search) tetap tidak dapat dipergunakan. Ada 2 alasan mengapa pencarian biner tidak dapat
digunakan:
1. Linked list tidak memiliki indeks seperti array, sehingga akses langsung ke node tertentu
tidak dapat dilakukan. Untuk menuju ke node tertentu, proses pemeriksaan tetap dimulai dari
node head (node terdepan). Oleh karena itu proses pencarian selalu berjalan secara linier.
2. Tidak dapat membagi linked list menjadi 2 bagian yang sama besar seperti saat membagi
array menjadi 2 bagian bila metode pencarian biner diaplikasikan pada array terurut.
Penghapusan Node Linked List
Sebelum proses penghapusan dilakukan, pencarian node yang ingin dihapus harus terlebih
dahulu dilakukan. Bila node yang ingin dihapus ditemukan, suatu hal yang selalu harus
diperhatikan adalah bagaimana mengeluarkan node tersebut dari linked list dan kemudian
menyambung kembali linked list kembali. Kompleksitas menghapus sebuah node dalam linked
list adalah O(n). Perhatikan gambar berikut ini:
Implementasi Linked List
/* linkedlist.h: header file */
typedef struct node * NodePtr;
typedef struct node {
int data;
NodePtr next;
}Node;
typedef struct list {
NodePtr head;
unsigned size;
}List;
void initList(List *);
int addList(List *, int);
void displayList(List *);
void freeList(List *);
/* linkedlist.c: implementasi method dilakukan dalam file ini */
#include "linkedlist.h"
#include <stdlib.h>
#include <stdio.h>
void initList(List * lptr) {
lptr->head = NULL;
lptr->size = 0;
}
int addList(List * lptr, int data) {
NodePtr new;
new = malloc(sizeof(Node));
if(new == NULL) {
printf("Error dalam membuat alokasi memori\n");
return 0;
}
new->data = data;
new->next = lptr->head;
lptr->head = new;
lptr->size++;
return 1;
}
void displayList(List * lptr) {
NodePtr current = lptr->head;
printf("\n");
while(current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("null\n");
}
void freeList(List * lptr) {
NodePtr next=lptr->head;
NodePtr current=next;
while(current != NULL) {
next = current->next;
free(current);
current = next;
}
}
/* main.c */
#include <stdlib.h>
#include <stdio.h>
#include "linkedlist.h"
int main(void) {
int i, n, data;
List LL;
initList(&LL);
/* Buat initial linked list */
printf("Jumlah simpul = ");
scanf("%d", &n);
/* Input data simpul */
for(i=0; i<n; i++) {
printf("Data = ");
scanf("%d", &data);
addList(&LL, data);
}
displayList(&LL);
freeList(&LL);
return EXIT_SUCCESS;
Keuntungan dan kerugian
Keuntungan utama pemanfaatan daftar berantai dibandingkan larik, ataupun daftar biasa adalah
kemudahan dan efektifitas kerja yang lebih baik dalam hal menambah, mengurangi, serta
mencari suatu elemen/node yang terdapat dalam daftar. Hal tersebut dimungkinkan karena
elemen-elemen yang terdapat pada sebuah daftar berantai tidak ditempatkan pada sebuah blok
memori komputer seperti halnya larik ataupun daftar biasa, melainkan tiap-tiap elemen/node
tersebut tersimpan dalam blok memori terpisah, penambahan, pengurangan, ataupun penggantian
node dapat dilakukan dengan mengubah elemen rujukan atas tiap-tiap node yang terkait.
Kerugiannya, sebuah daftar berantai tidak memungkinkan pengaksesan elemen secara acak,
dalam artian untuk dapat mengakses node ke tiga pada contoh di atas harus dilakukan dengan
cara mengunjungi elemen-elemen sebelumnya, dimulai dari elemen pertama, ke dua, seterusnya
hingga pada lokasi elemen yang dimaksudkan.
Jenis-jenis daftar berantai
Daftar bertaut tunggal
Bila struktur data sebuah node hanya memiliki satu tautan atas node berikutnya dalam sebuah
daftar bertaut, maka daftar bertaut tersebut dinamakan sebagai daftar bertaut tunggal.
Daftar bertaut tunggal dengan tiap-tiap node yang terdiri atas dua elemen, data integer, dan elemen rujukan ke
node berikutnya
Daftar bertaut ganda
Berbeda halnya dengan daftar bertaut tunggal, pada daftar bertaut ganda, struktur data atas tiaptiap node memiliki rujukan pada node sebelum dan berikutnya. Sebagian algoritma
membutuhkan taut ganda, contohnya sorting dan reverse traversing.
Daftar bertaut ganda dengan tiap-tiap node yang terdiri atas tiga elemen, data integer, dan dua elemen rujukan ke
node sebelum serta berikutnya
Daftar bertaut sirkular
Pada dua jenis daftar sebelumnya, node terakhir dalam daftar tersebut merujuk pada null yang
artinya akhir dari sebuah daftar, begitu pula null sebagai rujukan node sebelumnya pada node
pertama bila daftar yang dimaksudkan adalah daftar bertaut ganda. Pada daftar bertaut sirkular,
informasi rujukan pada node terakhir akan merujuk pada node pertama, dan rujukan pada node
pertama akan merujuk pada node terakhir bila yang digunakan sebagai dasar implementasi
adalah daftar bertaut ganda.
Sumber pustaka
 Juan, Angel (2006) (pdf), Ch20 –Data Structures; ID06 - PROGRAMMING with JAVA (slide
part of the book “Big Java”, by CayS. Horstmann), hlm. 3
 "Definition of a linked list". National Institute of Standards and Technology. 16 Agustus 2004.
Diakses pada 14 Desember 2004.
 Antonakos, James L. (1999). Practical Data Structures Using C/C++. Prentice-Hall.
hlm. 165–190. ISBN 0-13-280843-9.
 Collins, William J. (2005) [2002]. Data Structures and the Java Collections Framework. New
York: McGraw Hill. hlm. 239–303. ISBN 0-07-282379-8.
 Cormen, Thomas H. (2003). Introduction to Algorithms. MIT Press. hlm. 205–213 & 501–
505. ISBN 0-262-03293-7.
 Cormen, Thomas H. (2001). "10.2: Linked lists". Introduction to Algorithms (edisi ke-2md).
MIT Press. hlm. 204–209. ISBN 0-262-03293-7.
 Green, Bert F. Jr. (1961). "Computer Languages for Symbol Manipulation". IRE Transactions
on Human Factors in Electronics (2): 3–8.
 McCarthy, John (1960). "Recursive Functions of Symbolic Expressions and Their
Computation by Machine, Part I". Communications of the ACM.
 Knuth, Donald (1997). "2.2.3-2.2.5". Fundamental Algorithms (edisi ke-3rd). AddisonWesley. hlm. 254–298. ISBN 0-201-89683-4.
 Newell, Allen (1957). "Programming the Logic Theory Machine". Proceedings of the Western
Joint Computer Conference: 230–240.
 Parlante, Nick (2001). "Linked list basics". Stanford University. Diakses pada 21 September
2009.
 Sedgewick, Robert (1998). Algorithms in C. Addison Wesley. hlm. 90–109. ISBN 0-20131452-5.
 Shaffer, Clifford A. (1998). A Practical Introduction to Data Structures and Algorithm
Analysis. New Jersey: Prentice Hall. hlm. 77–102. ISBN 0-13-660911-2.
 Wilkes, Maurice Vincent (1964). "An Experiment with a Self-compiling Compiler for a
Simple List-Processing Language". Annual Review in Automatic Programming (Pergamon
Press) 4 (1).
 Wilkes, Maurice Vincent (1964). "Lists and Why They are Useful". Proceeds of the ACM
National Conference, Philadelphia 1964 (ACM) (P-64): F1–1.
 Shanmugasundaram, Kulesh (2005-04-04). "Linux Kernel Linked List Explained". Diakses
pada 21 September 2009.
Nama : setiyono lukito
Npm : 1135010031
Download