Title: Double Linked List
1Double Linked List
2Double Linked List (non circular)
- Double Linked List memiliki 2 buah pointer yaitu
pointer next dan prev. Pointer next menunjuk
pada node setelahnya dan pointer prev menunjuk
pada node sebelumnya. - Pengertian
- Double artinya field pointer-nya dua buah dan
dua arah, ke node sebelum dan sesudahnya. - Linked List artinya node-node tersebut saling
terhubung satu sama lain. - Non Circular artinya pointer prev dan next-nya
akan menunjuk pada NULL.
prev
next
3Ilustrasi Double Linked List
- Setiap node pada linked list mempunyai field yang
berisi data dan pointer ke node berikutnya ke
node sebelumnya - Untuk pembentukan node baru, mulanya pointer next
dan prev akan menunjuk ke nilai NULL. - Selanjutnya pointer prev akan menunjuk ke node
sebelumnya, dan pointer next akan menunjuk ke
node selanjutnya pada list.
4Deklarasi dan Pembentukan Node baru pada Double
Linked List
- Deklarasi node
- typedef struct TNode
- int data
- TNode next
- Tnode prev
-
- Pembentukan node baru
- TNode baru
- baru new TNode
- baru-gtdata databaru
- baru-gtnext NULL
- baru-gtprev NULL
5Double Linked List menggunakan HEAD
- Dibutuhkan satu buah variabel pointer yaitu head
- Head akan selalu menunjuk pada node pertama
6Double Linked List menggunakan HEAD (lanjutan)
- Deklarasi Pointer Double Linked List menggunakan
head - TNode head
- Fungsi Inisialisasi Double LinkedList
- void init()
- head NULL
-
- Function untuk mengetahui kosong tidaknya Double
LinkedList - int isEmpty()
- if(head NULL) return 1
- else return 0
-
7Penambahan data dari depanpada double linked
list dengan head
- Penambahan node baru akan diletakkan di node
paling depan, namun pada saat pertama kali (data
masih kosong), maka penambahan data dilakukan
pada head nya. - Pada prinsipnya adalah mengkaitkan data baru
dengan head, kemudian head akan menunjuk pada
data baru tersebut sehingga head akan tetap
selalu menjadi data terdepan. Untuk
menghubungkan node terakhir dengan node terdepan
dibutuhkan pointer bantu.
8Penambahan data dari depanpada double linked
list dengan head (lanjutan)
1. List masih kosong (headNULL)
NULL
2. Masukkan data baru, misal 10
9Penambahan data dari depanpada double linked
list dengan head (lanjutan)
3. Masukkan data baru lagi dari depan, misal 15
10Penambahan data dari depanpada double linked
list dengan head (lanjutan)
- void insertDepan(int databaru)
- TNode baru
- baru new TNode
- baru-gtdata databaru
- baru-gtnext NULL
- baru-gtprev NULL
- if(isEmpty()1)
- headbaru
- head-gtnext NULL
- head-gtprev NULL
-
- else
- baru-gtnext head
- head-gtprev baru
- head baru
-
- coutltltData masuk\n
-
11Penambahan data dari belakang pada double linked
list dengan head
- Penambahan di belakang lebih sulit karena kita
membutuhkan pointer bantu untuk mengetahui data
terbelakang, kemudian dikaitkan dengan data baru.
Untuk mengetahui data terbelakang perlu
digunakan perulangan.
12Penambahan data dari belakang pada double linked
list dengan head (lanjutan)
1. List masih kosong (headNULL)
NULL
2. Masukkan data baru, misal 10
13Penambahan data dari belakang pada double linked
list dengan head (lanjutan)
3. Masukkan data baru lagi dari belakang, misal 15
14Penambahan data dari belakang pada double linked
list dengan head (lanjutan)
- void insertBelakang (int databaru)
- TNode baru,bantu
- baru new TNode
- baru-gtdata databaru
- baru-gtnext NULL
- baru-gtprev NULL
- if(isEmpty()1)
- headbaru
- head-gtnext NULL
- head-gtprev NULL
-
- else
- bantuhead
- while(bantu-gtnext!NULL)
- bantubantu-gtnext
-
- bantu-gtnext baru
- baru-gtprev bantu
-
15Function untuk menampilkan isi Double Linked List
- void tampil()
- TNode bantu
- bantu head
- if(isEmpty()0)
- while(bantu!NULL)
- coutltltbantu-gtdataltlt" "
- bantubantu-gtnext
-
- coutltltendl
- else coutltlt"Masih kosong\n"
16Hapus data dari depanpada double linked list
dengan head
Proses penghapusan data 10 dari depan
17Hapus data dari depanpada double linked list
dengan head (lanjutan)
- void hapusDepan ()
- TNode hapus
- int d
- if (isEmpty()0)
- if(head-gtnext ! NULL)
- hapus head
- d hapus-gtdata
- head head-gtnext
- head-gtprev NULL
- delete hapus
- else
- d head-gtdata
- head NULL
-
- coutltltdltlt" terhapus\n"
- else coutltlt"Masih kosong\n"
-
18Hapus data dari belakangpada double linked list
dengan head
19Hapus data dari belakangpada double linked list
dengan head (lanjutan)
- void hapusBelakang()
- TNode hapus
- int d
- if (isEmpty()0)
- if(head-gtnext ! NULL)
- hapus head
- while(hapus-gtnext!NULL)
- hapus hapus-gtnext
-
- d hapus-gtdata
- hapus-gtprev-gtnext NULL
- delete hapus
- else
- d head-gtdata
- head NULL
-
- coutltltdltlt" terhapus\n"
- else coutltlt"Masih kosong\n"
-
20Hapus data dari belakangpada double linked list
dengan head (lanjutan)
- Tidak diperlukan pointer bantu yang mengikuti
pointer hapus yang berguna untuk menunjuk ke NULL - Karena pointer hapus sudah bisa menunjuk ke
pointer sebelumnya dengan menggunakan elemen prev
ke node sebelumnya, yang akan diset agar menunjuk
ke NULL setelah penghapusan dilakukan.
21Function untuk menghapus semua elemen
- void clear()
- TNode bantu,hapus
- bantu head
- while(bantu!NULL)
- hapus bantu
- bantu bantu-gtnext
- delete hapus
-
- head NULL
22Double Linked List menggunakan HEAD dan TAIL
- Dibutuhkan dua buah variabel pointer head dan
tail - Head akan selalu menunjuk pada node pertama,
sedangkan tail akan selalu menunjuk pada node
terakhir.
23Double Linked List menggunakan HEAD dan TAIL
(lanjutan)
- Inisialisasi DLLNC
- TNode head, tail
- Fungsi Inisialisasi DLLNC
- void init()
- head NULL
- tail NULL
-
- Function untuk mengetahui kosong tidaknya DLLNC
- int isEmpty()
- if(tail NULL) return 1
- else return 0
24Penambahan data dari depanpada double linked
list dgn head dan tail
1. List masih kosong (headtailNULL)
2. Masukkan data baru, misal 10
25Penambahan data dari depanpada double linked
list dgn head dan tail (lanjutan)
3. Masukkan data baru lagi dari belakang, misal 15
26Penambahan data dari depanpada double linked
list dgn head dan tail (lanjutan)
- void insertDepan (int databaru)
- TNode baru
- baru new TNode
- baru-gtdata databaru
- baru-gtnext NULL
- baru-gtprev NULL
- if(isEmpty()1)
- headbaru
- tailhead
- head-gtnext NULL
- head-gtprev NULL
- tail-gtprev NULL
- tail-gtnext NULL
-
- else
- baru-gtnext head
- head-gtprev baru
- head baru
-
27Penambahan data dari belakangpada double linked
list dgn head dan tail
1. List masih kosong (headtailNULL)
2. Masukkan data baru, misal 10
28Penambahan data dari belakangpada double linked
list dgn head dan tail (lanjutan)
3. Masukkan data baru lagi dari belakang, misal 15
29Penambahan data dari belakangpada double linked
list dgn head dan tail (lanjutan)
- Penambahan node di belakang akan selalu dikaitkan
dengan tail dan kemudian node baru tersebut akan
menjadi tail - void insertBelakang(int databaru)
- TNode baru
- baru new TNode
- baru-gtdata databaru
- baru-gtnext NULL
- baru-gtprev NULL
- if(isEmpty()1)
- headbaru
- tailhead
- head-gtnext NULL
- head-gtprev NULL
- tail-gtprev NULL
- tail-gtnext NULL
-
- else
- tail-gtnext baru
- baru-gtprev tail
- tail baru
30Function untuk menampilkan isi linked list
- void tampil()
- TNode bantu
- bantu head
- if(isEmpty()0)
- while(bantu!tail-gtnext)
- coutltltbantu-gtdataltlt" "
- bantubantu-gtnext
-
- coutltltendl
- else coutltlt"Masih kosong\n"
31Hapus data dari depanpada double linked list dgn
head dan tail
Proses penghapusan data 10 dari depan
32Hapus data dari depanpada double linked list dgn
head dan tail (lanjutan)
- void hapusDepan()
- TNode hapus
- int d
- if (isEmpty()0)
- if(head-gtnext ! NULL)
- hapus head
- d hapus-gtdata
- head head-gtnext
- head-gtprev NULL
- delete hapus
- else
- d head-gtdata
- head NULL
- tail NULL
-
- coutltltdltlt" terhapus\n"
- else coutltlt"Masih kosong\n"
33Hapus data dari belakangpada double linked list
dgn head dan tail
34Hapus data dari belakangpada double linked list
dgn head dan tail (lanjutan)
- void hapusBelakang()
- TNode hapus
- int d
- if (isEmpty()0)
- if(head-gtnext ! NULL)
- hapus tail
- d tail-gtdata
- tail tail-gtprev
- tail-gtnext NULL
- delete hapus
- else
- d head-gtdata
- head NULL
- tail NULL
-
- coutltltdltlt" terhapus\n"
- else coutltlt"Masih kosong\n"
35Hapus data dari belakangpada double linked list
dgn head dan tail (lanjutan)
- Pointer hapus tidak perlu di loop untuk mencari
node terakhir. Pointer hapus hanya perlu
menunjuk pada pointer tail saja. - Karena pointer hapus sudah bisa menunjuk ke
pointer sebelumnya dengan menggunakan elemen
prev, maka pointer prev hanya perlu diset agar
menunjuk ke NULL. Lalu pointer hapus didelete.
36Function untuk menghapus semua elemen LinkedList
- void clear()
- TNode bantu,hapus
- bantu head
- while(bantu!NULL)
- hapus bantu
- bantu bantu-gtnext
- delete hapus
-
- head NULL
- tail NULL
37Function untuk menghapus semua elemen LinkedList
- Menggunakan pointer bantu yang digunakan untuk
bergerak sepanjang list, dan menggunakan pointer
hapus yang digunakan untuk menunjuk node-node
yang akan dihapus. - Pada saat pointer hapus menunjuk pada node yang
akan dihapus, pointer bantu akan bergerak ke node
selanjutnya, dan kemudian pointer hapus akan
didelete.
38Sumber
- lecturer.ukdw.ac.id/anton/download/TIstrukdata8.pd
f - hansmichael.com/download/SD09.pdf