Dokumen - IK - STMIK EL RAHMA Double linked list
Double linked list
Link list yang kita pelajari sebelumnya hanya mempunyai sebuah pointer pada setiap simpulnya.
Hal ini merupakan kelemahan bahwa link list tersebut hanya bisa dibaca dalam satu arah saja,
yaitu dari kiri ke kanan. Hal yang seperti ini kurang cepat jika kita ingin mencari data di dalam
link list
Untuk itulah kita memerlukan link list yang setiap simpulnya mempunyai 2 buah pointer ,
dengan pointer pertama menunjuk ke simpul sebelumnya (sebelah kiri) dan pointer kedua
menunjuk ke simpul sesudahnya (disebelah kanan). Hal ini akan mempermudah pembacaan (bisa
dilakukan dari kiri ke kanan dan dari kanan ke kiri), begitu juga untuk penambahan simpul baru
dan penghapusan simpul. Link list seperti ini disebut dengan Seranai Beranai Ganda (Double
linked list). Juga disebut dengan Two Way List
Secara garis besar Double link list adalah link list yang memiliki dua buah pointer yang
menunjuk ke simpul sebelumnya (Prev) dan yang menunjuk ke simpul sesudahnya (Next).
Gambar berikut menunjukkan gambaran Double Link list
NULL
A
B
C
D
NULL
Gambar 1. Double linket list dengan empat simpul
Deklarasi Double Linked List di dalam Pascal :
Type
PSimpul =^Simpul
Simpul = Record
Info : char;
Prev : PSimpul;
Next : PSimpul;
End;
Var
Head, Tail : PSimpul;
Ada beberapa hal yang harus diketahui mengenai Double link list, diantaranya adalah :
1. Double Link list selalu memiliki pointer petunjuk yang selalu menunjuk pada awal dari list
yang disebut Head
2. Double Link list juga selalu memiliki pointer petunjuk menunjuk pada akhir dari list yang
disebut Tail.
3. Setiap simpul yang terbentuk selalu memiliki nilai NIL , kecuali jika simpul tersebut sudah
ditunjuk oleh simpul yang lainnya (Double Link list belum terhubung).
4. Posisi simpul terakhir pada Doube link list selalu bernilai NIL karena ia tidak menunjuk pada
simpul yang lainnya, kecuali bentuk circular.
5. Operasi yang dapat dilakukan pada DoubleLink list diantaranya adalah :
a. Inisialisasi.
b. Menambah Simpul (di Depan, Belakang dan Tengah).
c. Menghapus Simpul (di Depan, Belakang dan Tengah).
d. Membaca isi link list.
1. Membuat Simpul Baru
Untuk membuat node baru digunakan keyword new. Perintah ini digunakan untuk
mempersiapkan sebuah node dengan alokasi memorinya. Selanjutnya medan informasi pada
node tersebut diisi dengan data tertentu. Terakhir pointer prev dan next diisi dengan NILL.
New(Baru);
Baru^.Info := Elemen;
Baru^.Next := Nil;
Baru^.Prev := Nil;
2. Menambah Simpul di Awal
Penambahan node baru yang akan diletakkan di node paling depan, perlu diperhatikan saat
pertama kali (data masih kosong), maka saat penambahan data dilakukan head/tail ditunjukkan
ke node baru tersebut. Sedangkan jika tidak kosong, data akan ditambahkan didepan head,
kemudian node baru akan berubah menjadi head.
NULL
NULL
head tail
NULL
prev
A
next
prev
A
next
prev
NULL NULL
prev
next
baru
B
prev
A
next
baru
head
prev
NULL
tail
next
NULL
tail
B
head
baru
NULL
head
B
head
baru
NULL
prev
next
NULL
tail
B
next
NULL
tail
Procedure TDep(Var Head, Tail : PSimpul; Elemen : Char);
Var Baru : PSimpul;
Begin
New(Baru);
Baru^.Info := Elemen;
Baru^.Next := Nil;
Baru^.Prev := Nil;
if head = nil then
begin
head := baru;
tail := baru
end
else
begin
Baru^.Next := Head;
Head^.Prev := Baru;
Head := Baru
end
End;
3. Menambah Simpul di Belakang
Penambahan node di belakang akan selalu dikaitkan dengan tail dan kemudian node baru tersebut
akan menjadi tail.
NULL
NULL
prev
head tail
NULL
prev
B
head
NULL
prev
prev
NULL
NULL
prev
tail
B
head
NULL
next
head
next
next
baru
A
next
NULL
tail
next
NULL
next
NULL
next
NULL
baru
prev
tail
B
B
A
baru
prev
head
tail
A
baru
Procedure TBel(Var Head, Tail : PSimpul; Elemen : Char);
Var Baru : PSimpul;
Begin
New(Baru);
Baru^.Info := Elemen;
Baru^.Next := Nil;
Baru^.Prev := Nil;
if head = nil then
begin
head := baru;
tail := baru
end
else
begin
Tail^.Next := Baru;
Baru^.prev := Tail;
Tail := Baru
end
End;
4. Menghapus Simpul di Awal
Menghapus node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka
harus dilakukan penggunakan suatu pointer lain yang digunakan untuk menunjuk node yang
akan dihapus, misalnya pointer hapus. Kemudian head harus ditunjukkan ke node sesudahnya
terlebih dahulu agar list tidak putus, sehingga node setelah head lama akan menjadi head baru.
Setelah itu barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete.
Jika head masih NIL maka berarti data masih kosong!
NULL
hapus
A
B
C
D
head
NULL
tail
NULL
B
C
head
D
NULL
tail
Procedure HDepan(Var Head, Tail : PSimpul);
Var Hapus : PSimpul;
Begin
if head = nil then
Write('List Kosong')
else if Head^.Next = Nil Then
begin
Hapus := Head;
Head := Nil;
Tail := Nil;
Dispose(Hapus)
end
else
Begin
Hapus := Head;
Head := Hapus^.Next;
Head^.Prev := Nil;
Dispose(Hapus);
End
End;
5. Menghapus Simpul di Belakang
Menghapus simpul di belakang dibutuhkan satu buah pointer bantuan, misal pointer hapus, tidak
perlu melakukan perulangan untuk mencari node terakhir seperti pada single linked list. Pointer
hapus hanya perlu menunjuk pada pointer tail saja. Sebelum penghapusan node, tail harus
dipindahkan pada node sebelumnya. Selanjutnya pointer next dari tail diberi nilai NILL. Kemudian
langkah terakhir simpul hapus di-delete
NULL
A
B
C
head
NULL
A
D
tail
B
head
Procedure HBel(Var Head, Tail : PSimpul);
Var Hapus : PSimpul;
Begin
if head = nil then
Write('List Kosong')
else if Head^.Next = Nil Then
begin
Hapus := Head;
Head := Nil;
Tail := Nil;
Dispose(Hapus)
end
else
Begin
Hapus := Tail;
Tail := Hapus^.Prev;
Tail^.Next := Nil;
Dispose(Hapus);
End
End;
C
tail
NULL
hapus
Link list yang kita pelajari sebelumnya hanya mempunyai sebuah pointer pada setiap simpulnya.
Hal ini merupakan kelemahan bahwa link list tersebut hanya bisa dibaca dalam satu arah saja,
yaitu dari kiri ke kanan. Hal yang seperti ini kurang cepat jika kita ingin mencari data di dalam
link list
Untuk itulah kita memerlukan link list yang setiap simpulnya mempunyai 2 buah pointer ,
dengan pointer pertama menunjuk ke simpul sebelumnya (sebelah kiri) dan pointer kedua
menunjuk ke simpul sesudahnya (disebelah kanan). Hal ini akan mempermudah pembacaan (bisa
dilakukan dari kiri ke kanan dan dari kanan ke kiri), begitu juga untuk penambahan simpul baru
dan penghapusan simpul. Link list seperti ini disebut dengan Seranai Beranai Ganda (Double
linked list). Juga disebut dengan Two Way List
Secara garis besar Double link list adalah link list yang memiliki dua buah pointer yang
menunjuk ke simpul sebelumnya (Prev) dan yang menunjuk ke simpul sesudahnya (Next).
Gambar berikut menunjukkan gambaran Double Link list
NULL
A
B
C
D
NULL
Gambar 1. Double linket list dengan empat simpul
Deklarasi Double Linked List di dalam Pascal :
Type
PSimpul =^Simpul
Simpul = Record
Info : char;
Prev : PSimpul;
Next : PSimpul;
End;
Var
Head, Tail : PSimpul;
Ada beberapa hal yang harus diketahui mengenai Double link list, diantaranya adalah :
1. Double Link list selalu memiliki pointer petunjuk yang selalu menunjuk pada awal dari list
yang disebut Head
2. Double Link list juga selalu memiliki pointer petunjuk menunjuk pada akhir dari list yang
disebut Tail.
3. Setiap simpul yang terbentuk selalu memiliki nilai NIL , kecuali jika simpul tersebut sudah
ditunjuk oleh simpul yang lainnya (Double Link list belum terhubung).
4. Posisi simpul terakhir pada Doube link list selalu bernilai NIL karena ia tidak menunjuk pada
simpul yang lainnya, kecuali bentuk circular.
5. Operasi yang dapat dilakukan pada DoubleLink list diantaranya adalah :
a. Inisialisasi.
b. Menambah Simpul (di Depan, Belakang dan Tengah).
c. Menghapus Simpul (di Depan, Belakang dan Tengah).
d. Membaca isi link list.
1. Membuat Simpul Baru
Untuk membuat node baru digunakan keyword new. Perintah ini digunakan untuk
mempersiapkan sebuah node dengan alokasi memorinya. Selanjutnya medan informasi pada
node tersebut diisi dengan data tertentu. Terakhir pointer prev dan next diisi dengan NILL.
New(Baru);
Baru^.Info := Elemen;
Baru^.Next := Nil;
Baru^.Prev := Nil;
2. Menambah Simpul di Awal
Penambahan node baru yang akan diletakkan di node paling depan, perlu diperhatikan saat
pertama kali (data masih kosong), maka saat penambahan data dilakukan head/tail ditunjukkan
ke node baru tersebut. Sedangkan jika tidak kosong, data akan ditambahkan didepan head,
kemudian node baru akan berubah menjadi head.
NULL
NULL
head tail
NULL
prev
A
next
prev
A
next
prev
NULL NULL
prev
next
baru
B
prev
A
next
baru
head
prev
NULL
tail
next
NULL
tail
B
head
baru
NULL
head
B
head
baru
NULL
prev
next
NULL
tail
B
next
NULL
tail
Procedure TDep(Var Head, Tail : PSimpul; Elemen : Char);
Var Baru : PSimpul;
Begin
New(Baru);
Baru^.Info := Elemen;
Baru^.Next := Nil;
Baru^.Prev := Nil;
if head = nil then
begin
head := baru;
tail := baru
end
else
begin
Baru^.Next := Head;
Head^.Prev := Baru;
Head := Baru
end
End;
3. Menambah Simpul di Belakang
Penambahan node di belakang akan selalu dikaitkan dengan tail dan kemudian node baru tersebut
akan menjadi tail.
NULL
NULL
prev
head tail
NULL
prev
B
head
NULL
prev
prev
NULL
NULL
prev
tail
B
head
NULL
next
head
next
next
baru
A
next
NULL
tail
next
NULL
next
NULL
next
NULL
baru
prev
tail
B
B
A
baru
prev
head
tail
A
baru
Procedure TBel(Var Head, Tail : PSimpul; Elemen : Char);
Var Baru : PSimpul;
Begin
New(Baru);
Baru^.Info := Elemen;
Baru^.Next := Nil;
Baru^.Prev := Nil;
if head = nil then
begin
head := baru;
tail := baru
end
else
begin
Tail^.Next := Baru;
Baru^.prev := Tail;
Tail := Baru
end
End;
4. Menghapus Simpul di Awal
Menghapus node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka
harus dilakukan penggunakan suatu pointer lain yang digunakan untuk menunjuk node yang
akan dihapus, misalnya pointer hapus. Kemudian head harus ditunjukkan ke node sesudahnya
terlebih dahulu agar list tidak putus, sehingga node setelah head lama akan menjadi head baru.
Setelah itu barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete.
Jika head masih NIL maka berarti data masih kosong!
NULL
hapus
A
B
C
D
head
NULL
tail
NULL
B
C
head
D
NULL
tail
Procedure HDepan(Var Head, Tail : PSimpul);
Var Hapus : PSimpul;
Begin
if head = nil then
Write('List Kosong')
else if Head^.Next = Nil Then
begin
Hapus := Head;
Head := Nil;
Tail := Nil;
Dispose(Hapus)
end
else
Begin
Hapus := Head;
Head := Hapus^.Next;
Head^.Prev := Nil;
Dispose(Hapus);
End
End;
5. Menghapus Simpul di Belakang
Menghapus simpul di belakang dibutuhkan satu buah pointer bantuan, misal pointer hapus, tidak
perlu melakukan perulangan untuk mencari node terakhir seperti pada single linked list. Pointer
hapus hanya perlu menunjuk pada pointer tail saja. Sebelum penghapusan node, tail harus
dipindahkan pada node sebelumnya. Selanjutnya pointer next dari tail diberi nilai NILL. Kemudian
langkah terakhir simpul hapus di-delete
NULL
A
B
C
head
NULL
A
D
tail
B
head
Procedure HBel(Var Head, Tail : PSimpul);
Var Hapus : PSimpul;
Begin
if head = nil then
Write('List Kosong')
else if Head^.Next = Nil Then
begin
Hapus := Head;
Head := Nil;
Tail := Nil;
Dispose(Hapus)
end
else
Begin
Hapus := Tail;
Tail := Hapus^.Prev;
Tail^.Next := Nil;
Dispose(Hapus);
End
End;
C
tail
NULL
hapus