You are on page 1of 27

DOUBLE LINKED LIST

DOUBLE LINKED LIST Pada dasarnya, penggunaan Double Linked List hampir sama dengan penggunaan Single Linked List yang telah kita pelajari pada materi sebelumnya. Hanya saja Double Linked List menerapkan sebuah pointer baru, yaitu prev, yang digunakan untuk menggeser mundur selain tetap mempertahankan pointer next. Keberadaan 2 pointer penunjuk (next dan prev) menjadikan Double Linked List menjadi lebih leksibel dibandingkan Single Linked List, namun dengan mengorbankan adanya memori tambahan dengan adanya pointer tambahan tersebut. !da 2 jenis Double Linked List, yaitu" Double Linked List #on $ir%ular dan Double Linked List $ir%ular. I. DOUBLE LINKED LIST NON CIRCULAR (DLLNC) a. DLLNC DLL#$ adalah sebuah Linked List yang terdiri dari dua arah pointer, dengan node yang saling terhubung, namun kedua pointernya menunjuk ke #&LL. Setiap node pada linked list mempunyai ield yang berisi data dan pointer yang saling berhubungan dengan node yang lainnya. b. GAMBARAN NODE DLLNC

c.

PEMBUATAN DLLNC De !ara"# N$%e typedef struct TNode { int data; TNode *next; TNode *prev; } Pe&b'atan DLLNC %en(an )ea% o 'lustrasi "

(ungsi) ungsi yang biasa digunakan " (ungsi untuk inisialisasi a*al

void init() // inisialisasi awal { TNode *head; head = NU ; } Perlu diperhatikan " (ungsi ini harus ada, untuk memun%ulkan node a*al.

Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini. -angan lupa untuk mendeklarasikan node)nya terlebih dahulu. (ungsi untuk menge%ek kosong tidaknya Linked List int is!"pty() // "en#ece$ $oson# tida$nya in$ed ist { if(head == NU ) return %; else return &; } Perlu diperhatikan " Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini. (ungsi untuk menambahkan data di depan void insert'epan(int value) // pena"(ahan data di depan { TNode *(aru; (aru = new TNode; // pe"(entu$an node (aru (aru)*data = value; (aru)*next = NU ; (aru)*prev = NU ; if(is!"pty() == { head = (aru; head)*next = head)*prev = } else { (aru)*next = head)*prev = head = (aru; } } Perlu diperhatikan " .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penambahan di depan. /isalkan saja data pada Linked List ada 0. Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini. %) NU NU ; ; // pe"(erian nilai terhadap data (aru // data perta"a harus "enun+u$ $e NU // data perta"a harus "enun+u$ $e NU // +i$a in$ed ist $oson#

// head harus selalu (erada di depan

// +i$a head; (aru;

in$ed

ist sudah ada datanya

// node (aru dihu(un#$an $e head // node head dihu(un#$an $e node (aru // head harus selalu (erada di depan

printf(,data "asu$-n.);

(ungsi untuk menambahkan data di belakang void insert/ela$an#(int value) // pena"(ahan data di (ela$an# { TNode *(aru0 *(antu; (aru = new TNode; // pe"(entu$an node (aru (aru)*data = value; (aru)*next = NU ; (aru)*prev = NU ; if(is!"pty() == %) // pe"(erian nilai terhadap data (aru // data perta"a harus "enun+u$ $e NU // data perta"a harus "enun+u$ $e NU // +i$a in$ed ist $oson#

head = (aru; head)*next = NU head)*prev = NU

//head harus selalu (erada di depan ; ;

} else { (antu = head; while((antu)*next 1= NU ) { (antu = (antu)*next } (aru)*next = (aru; head)*prev = (antu;

// (antu dileta$an di head dulu // "en##eser hin##a node tera$hir // node (aru dihu(un#$an $e head // node head dihu(un#$an $e node (aru

} printf(,data "asu$-n.);

Perlu diperhatikan " -ika Linked List hanya menggunakan head, maka dibutuhkan satu pointer untuk membantu mengetahui node terakhir dari Linked List. Dalam %ode di atas digunakan pointer bantu. .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penambahan di belakang. /isalkan saja data pada Linked List ada 0. Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini.

(ungsi untuk menambahkan data di tengah (menyisipkan data) void insertTen#ah(int value0 int cari) //pena"(ahan data di ten#ah { TNode *(aru0 *(antu0 *(antu2; (aru = new TNode; // pe"(entu$an node (aru (aru)*data = value; (aru)*next = NU ; (aru)*prev = NU ; (antu = head; while((antu)*data 1= cari) { (antu = (antu)*next; } (antu2 = (antu)*next; (aru)*next = (antu2; (antu2)*prev = (aru; (antu)*next = (aru; (aru)*prev = (antu; } Perlu diperhatikan " Dibutuhkan satu pointer untuk membantu men%ari node di mana data yang ingin disisipkan ditempatkan. Dalam %ode di atas digunakan pointer bantu. Penggunaan pointer bantu2 pada %ode di atas sebenarnya bisa digantikan dengan peman aatan pointer bantu. .agaimana %aranya1 .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penambahan di tengah. /isalkan // pe"(erian nilai terhadap data // data perta"a harus "enun+u$ $e // data perta"a harus "enun+u$ $e // (antu dileta$an di head (aru NU NU dulu

//"en##eser hin##a didapat data cari

// "en#hu(un#$an $e node setelah yan# dicari // "en#hu(un#$an node (aru // "en#hu(un#$an $e node se(elu" yan# dicari

saja data pada Linked List ada 0, lalu sisipkan data baru setelah node kedua. Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini. (ungsi untuk menghapus data di depan void delete'epan() // pen#hapusan data di depan { TNode *hapus; if(is!"pty() == &) // +i$a data (elu" $oson# { if(head)*next 1= NU ) // +i$a data "asih le(ih dari % { hapus = head; // leta$an hapus pada head head = head)*next; // "en##eser head ($arena head harus ada) head)*prev = NU ; // head harus "enu+u $e NU delete hapus;//proses delete tida$ (oleh dila$u$an +i$a node "asih ditun+u$ oleh pointer } else // +i$a data tin##al head { head = NU ; // lan#sun# di(eri nilai NU sa+a } printf(,data terhapus-n.); } else // +i$a data sudah $oson# printf(,data $oson#-n.); } Perlu diperhatikan " Dibutuhkan satu pointer untuk membantu memindahkan head ke node berikutnya. Dalam %ode di atas digunakan pointer hapus. /engapa head harus dipindahkan1 .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penghapusan di depan. /isalkan saja data pada Linked List ada 0. Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini. (ungsi untuk menghapus data di belakang void delete/ela$an#() // pen#hapusan data di (ela$an# { TNode *hapus; if(is!"pty() == &) { if(head)*next 1= NU ) { hapus = head; while(hapus)*next 1= NU ) { hapus = hapus)*next; } hapus)*prev)*next = NU den#an NU ; // +i$a data (elu" $oson# // +i$a data "asih le(ih dari % // leta$an hapus pada head // "en##eser hin##a node a$hir // "en#hu(un#$an node se(elu"nya

delete hapus;//proses delete tida$ (oleh dila$u$an +i$a node sedan# ditun+u$ oleh pointer } else // +i$a data tin##al head

head = NU ; } printf(,data terhapus-n.); } else printf(,data $oson#-n.); }

// lan#sun# di(eri nilai NU

sa+a

// +i$a data sudah $oson#

Perlu diperhatikan " -ika Linked List hanya menggunakan head, maka dibutuhkan satu pointer untuk membantu mengetahui node terakhir dari Linked List. Dalam %ode di atas digunakan pointer hapus. -angan lupa untuk tetap mengaitkan node terakhir ke #&LL. .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penghapusan di belakang. /isalkan saja data pada Linked List ada 0. Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini.

(ungsi untuk menghapus data di tengah void deleteTen#ah(int cari) // pen#hapusan data di ten#ah { TNode *hapus0 *(antu0 *(antu2; hapus = head; // leta$an hapus pada head while(hapus)*data 1= cari) { hapus = hapus)*next; // "en##eser hin##a data cari } (antu2 = hapus)*next; // "en#$ait$an node se(elu" dan sesudahnya (antu = hapus)*prev; (antu)*next = (antu2; (antu2)*prev = (antu; printf(3data terhapus-n3); delete hapus; //proses delete tida$ (oleh dila$u$an +i$a node sedan# ditun+u$ oleh pointer } Perlu diperhatikan " Dibutuhkan satu pointer untuk membantu men%ari node di mana data yang ingin dihapus ditempatkan. Dalam %ode di atas digunakan pointer hapus. Penggunaan pointer bantu dan bantu2 pada %ode di atas sebenarnya bisa digantikan dengan peman aatan pointer hapus. .agaimana %aranya1 .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penghapusan di tengah. /isalkan saja data pada Linked List ada 0, lalu hapus data pada node ketiga. Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini. (ungsi untuk menghapus semua data void clear() // pen#hapusan se"ua data { TNode *(antu0 *hapus; (antu = head; // leta$an (antu pada head while ((antu 1= NU ) // #eser (antu hin##a a$hir { hapus = (antu;

(antu = (antu)*next; delete hapus; } } head = NU ;

// delete satu persatu node pada head

// +i$a sudah ha(is (eri$an nilai NU

Perlu diperhatikan " Dibutuhkan dua pointer untuk membantu menggeser dan menghapus, di mana dalam %ode di atas digunakan pointer bantu dan hapus. Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini.

(ungsi untuk menampilkan semua data void ceta$() // "ena"pil$an se"ua data { TNode *(antu; (antu = head; // leta$an (antu pada head if(is!"pty() == &) { while ((antu 1= NU ) { printf(,4d .0 (antu)*data); (antu = (antu)*next; } printf(,-n.); } else printf(,data $oson#.); } Perlu diperhatikan " Dibutuhkan satu pointer untuk membantu menggeser, di mana dalam %ode di atas digunakan pointer bantu. Setelah memahami penggunaan ungsi ini, bukalah +urbo $,, !nda, dan %opy)kan ungsi ini.

// ceta$ data pada setiap node // #eser (antu hin##a a$hir

// +i$a data sudah $oson#

Lat#*an + , 2. Setelah deklarasi node dilakukan, dan semua ungsi sudah tersedia. Sekarang gabungkan setiap ungsi yang ada pada sebuah program penuh dengan spesi ikasi " Pada program utama (main) berisi sebuah menu yang berisi itur) itur yang terdapat dari setiap ungsi yang sudah ada ada sebelumnya, yaitu " tambah data, hapus data, %ek data kosong, dan %etak semua data. Pada stru%t hanya terdapat 2 tipe data saja yaitu integer. Sesuaikan ungsi) ungsi yang ada dengan program yang !nda buat (jangan langsung %opy)paste dan digunakan). 2. .uat program untuk enkripsi dan dekripsi pass*ord yang meman aatkan Linked List, dengan spesi ikasi " Panjang pass*ord minimal 3 digit. 'si pass*ord terserah dari user dan pass*ord diinputkan terlebih dahulu sebelumnya (penambahan data di belakang). 4nkripsi dilakukan dengan memindahkan 5 node terakhir, menjadi node terdepan. Kemudian sisipkan 2 karakter baru (kun%i) setelah node ketiga dari yang dipindahkan tersebut. 'lustrasi "

Lakukan juga proses dekripsi)nya. .erikan juga itur untuk menampilkan pass*ord.

Pe&b'atan DLLNC %en(an )ea% %an Ta#! o 'lustrasi "

o o

void init() { TNode *head0 *tail; head = NU ; tail = NU ; }

Sebenarnya sama saja dengan DLL#$ dengan menggunakan head saja, hanya saja perbedaannya terletak pada kemudahan pengaksesan di bagian data terakhirnya saja (tail). (ungsi) ungsi yang biasa digunakan " (ungsi untuk inisialisasi a*al //inisialisasi awal

(ungsi untuk menge%ek kosong tidaknya Linked List int is!"pty() //"en#ece$ $oson# tida$nya { if(tail == NU ) return %; else return &; }

in$ed

ist

(ungsi untuk menambahkan data di depan void insert'epan(int value) //pena"(ahan data di depan { TNode *(aru; (aru = new TNode; // pe"(entu$an node (aru (aru)*data = value; (aru)*next = NU ; (aru)*prev = NU ; if(is!"pty() == %) { head = (aru; tail = head; head)*next = NU // pe"(erian nilai terhadap data (aru // data perta"a harus "enun+u$ $e NU // data perta"a harus "enun+u$ $e NU // +i$a in$ed ist $oson#

// leta$an (aru pada head // head = tail ;

} else { (aru)*next = head; head)*prev = (aru; head = (aru; } printf(,data "asu$-n.);

head)*prev = NU tail)*next = NU tail)*prev = NU

; ; ;

// +i$a

in$ed

ist sudah ada datanya

// "enya"(un#$an data (aru den#an head la"a //head harus selalu (erada di depan

Perlu diperhatikan " .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penambahan di depan.

(ungsi untuk menambahkan data di belakang void insert/ela$an#(int value) //pena"(ahan data di (ela$an# { TNode *(aru; (aru = new TNode; // pe"(entu$an node (aru (aru)*data = value; (aru)*next = NU ; (aru)*prev = NU ; if(is!"pty() == %) { head = (aru; tail = head; head)*next = NU ; head)*prev = NU ; tail)*next = NU ; tail)*prev = NU ; } else { tail)*next = (aru; (aru)*prev = tail; tail = (aru; tail)*next = NU ; } printf(,data "asu$-n.); } Perlu diperhatikan " .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penambahan di belakang. Perhatikan kemudahan pengaksesan node terakhirnya. // pe"(erian nilai terhadap data (aru // data perta"a harus "enun+u$ $e NU // data perta"a harus "enun+u$ $e NU // +i$a in$ed ist $oson#

// leta$an (aru pada head // head = tail

// +i$a

in$ed

ist sudah ada datanya

// "en#hu(un#$an data (aru den#an tail la"a // tail harus selalu (erada di (ela$an#

(ungsi untuk menambahkan data di tengah (menyisipkan data) void insertTengah(int value, int cari) //penambahan data di tengah { TNode *(aru0 *(antu0 *(antu2; (aru = new TNode; // pe"(entu$an node (aru (aru)*data = value; // pe"(erian nilai terhadap data (aru (aru)*next = NU ; // data perta"a harus "enun+u$ $e NU (aru)*prev = NU ; // data perta"a harus "enun+u$ $e NU bantu = head; // letakan bantu di awal

while(bantu->data = cari) { bantu = bantu->ne!t; " (antu2 = (antu)*next; (aru)*next = (antu2; (antu2)*prev = (aru; (antu)*next = (aru; (aru)*prev = (antu; "

// geser bantu sampai data cari

// "en#hu(un#$an $e node setelah yan# dicari // "en#hu(un#$an node (aru // "en#hu(un#$an $e node se(elu" yan# dicari

Perlu diperhatikan " .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penambahan di tengah. /isalkan saja data pada Linked List ada 0, lalu sisipkan data sebelum node ketiga.

(ungsi untuk menghapus data di depan void delete'epan() // pen#hapusan data di depan { TNode *hapus; if(is!"pty() == &) // +i$a data (elu" $oson# { if(head)*next 1= NU ) // +i$a data tida$ tin##al % { hapus = head; // leta$an hapus pada head head = head)*next; // "en##eser head ($arena head harus ada) head)*prev = NU ; // head harus "enu+u $e NU delete hapus; //proses delete tida$ (oleh dila$u$an +i$a node sedan# ditun+u$ oleh pointer } else // +i$a data tin##al head { head = NU ; // lan#sun# di(eri NU sa+a tail = NU ; } printf(,data terhapus-n.); } else // +i$a data $oson# printf(,data $oson#-n.); } Perlu diperhatikan " .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penghapusan di depan. (ungsi untuk menghapus data di belakang void delete/ela$an#() // pen#hapusan data di (ela$an# { TNode *hapus; if(is!"pty() == &) // +i$a data (elu" $oson# { if(head )*next 1= NU ) // +i$a data tida$ tin##al % { hapus = tail; // leta$an hapus pada tail tail = tail)*prev; // "en##eser tail tail)*next = NU ; // tail harus "enu+u $e NU delete hapus; //proses delete tida$ (oleh dila$u$an +i$a node sedan# ditun+u$ oleh pointer

} else printf(,data $oson#-n.); }

} else // +i$a data tin##al head { head = NU ; tail = NU ; } printf(,data terhapus-n.);

// lan#sun# di(eri NU

sa+a

// +i$a data $oson#

Perlu diperhatikan " .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penghapusan di belakang. Perhatikan kemudahan pengaksesan node terakhirnya.

(ungsi untuk menghapus data di tengah void deleteTen#ah(int cari) // pen#hapusan data di ten#ah { TNode *hapus0 *(antu0 *(antu2; hapus = head; // leta$an hapus pada head while(hapus)*data 1= cari) { hapus = hapus)*next; // "en##eser hin##a data cari } (antu2 = hapus)*next; // "en#$ait$an node se(elu" dan sesudahnya (antu = hapus)*prev; (antu)*next = (antu2; (antu2)*prev = (antu; printf(3data terhapus-n3); delete hapus; //proses delete tida$ (oleh dila$u$an +i$a node sedan# ditun+u$ oleh pointer } Perlu diperhatikan " .a%a %ode beserta panduan proses yang terjadi, pahami, lalu gambarkan ilustrasi proses terjadinya penghapusan di tengah. /isalkan saja data pada Linked List ada 0, lalu hapus data pada node ketiga. (ungsi untuk menghapus semua data void clear() // pen#hapusan se"ua data { TNode *(antu0 *hapus; (antu = head; // leta$an (antu pada head while ((antu 1= NU ) // #eser (antu hin##a a$hir { hapus = (antu; (antu = (antu)*next; delete hapus; // delete satu persatu node } head = NU tail = NU ; ; // +i$a sudah ha(is (eri$an nilai NU // +i$a sudah ha(is (eri$an nilai NU pada head pada tail

(ungsi untuk menampilkan semua data void ceta$() // "ena"pil$an se"ua data { TNode *(antu;

(antu = head; if(is!"pty() == &) { while ((antu 1= tail)*next) { printf(,4d .0 (antu)*data); (antu = (antu)*next; } printf(,-n.); } else printf(,data $oson#.);

// leta$an (antu pada head

// ceta$ data pada setiap node // #eser (antu hin##a a$hir

// +i$a data sudah $oson#

Lat#*an - , 2. Lakukan latihan 2 no 2 dengan DLL#$ dengan head dan tail, bandingkan kemudahan penggunaannya. 2. Lakukan latihan 2 no 2 dengan DLL#$ dengan head dan tail, lalu berikan spesi ikasi tambahan " +ambahkan 2 ma%am user " anonymous dan admin. Pada bagian itur menampilkan pass*ord, jika admin user yang ingin melihat pass*ord tampilkan pass*ord se%ara benar (dari depan ke belakang), namun jika anonymous user yang ingin melihat pass*ord tampilkan pass*ord se%ara terbalik (dari belakang ke depan 6 man aatkan tail dalam pengaksesan sema%am ini). %. TUGAS (DLLNC) 2. Dari latihan 2 no 2 yang sudah !nda buat, buat juga itur tambahan untuk melakukan sorting (as%ending dan des%ending). 2. Dengan meman aatkan semua itu yang sudah ada sebelumnya. .uat sebuah aplikasi SIMULASI .RAGMENTASI )ARDDISK. Dengan spesi ikasi sebagai berikut " Setiap node dilambangkan sebagai 2 ragmen harddisk dalam komputer !nda. Dalam setiap ragmen berisi " #ama data (unik). -enis data (aplikasi, 7S, dokumen) &kuran data. +erdapat menu untuk melakukan " Penambahan ragmen 8 penambahan data. Penghapusan ragmen 8 penghapusan data. Pen%arian ragmen (bisa ditambahkan itur untuk men%ari ukuran terbesar8terke%il, pen%arian berdasarkan nama ataupun jenis data). 4dit isi ragmen. /enampilkan isi ragmen (bisa dikombinasikan dengan itur pen%arian). /elakukan de ragmentasi (sorting), di mana bisa dilakukan terhadap " jenis data dan ukuran data.

II.

1. Dengan Head - Menggunakan 1 pointer head - Head selalu menunjuk node pertama Sebelumnya kita harus mendeklarasikan dulu pointer head :
T#ode $head;

D$'b!e L#n e% L#"t C#c'!ar

Setelah kita mendeklarasikan pointer head, kita belum bisa secara langsung mendeklarasikan node yang dituju. Sehingga pointer head harus dibuat bernilai null terlebih dahulu :
head = #%&&;

untuk mengetahui apakah suatu Linked List kosong atau tidak, kita dapat mengetahuinya dengan mengecek nilai dari pointer Head-nya.

int is'mpt(() { i)(head==#%&&) return *; else return +; "

ontoh program : !enambahan di depan

void tambahdata (int databaru){ T#ode $baru,$bantu; //pointer bantu digunakan untuk menun,uk node terakhir (head>prev) baru = new T#ode; baru -> data = databaru; baru -> ne!t = baru; baru -> prev = baru;

i) (is'mpt(()==*) { head=baru; head->ne!t=head; head->prev=head; " else { bantu=head->prev; baru->ne!t=head; head->prev=baru; head=baru; head->prev=bantu;

bantu->ne!t=head; " print)(-data masuk-); "

!enggambaran : head

"#L L

Setelah dibuat node baru dan jika diketahui head$$"#LL : head baru

%ila kita membuat node baru lagi maka : baru head bantu

baru

head

bantu

baru

head

bantu

head

bantu

head

bantu

!enambahan di belakang

void insert.elakang (int databaru){ T#ode $baru,$bantu; baru = new T#ode; baru->data = databaru; baru->ne!t = baru; baru->prev = baru; i)(is'mpt(()==*){ head=baru; head->ne!t = head; head->prev = head; " else { bantu=head->prev; bantu->ne!t = baru; baru->prev = bantu; baru->ne!t = head; head->prev = baru; " print)(-data masuk-); "

&ampil

void tampil(){ T#ode $bantu; bantu = head; i)(is'mpt(()==+){ do{ print)(/0i -,.antu->data); bantu=bantu->ne!t; "while(bantu =head); print)(/1n-); " else print)(/masih 2osong-);cout3345asih kosong1n4; "

Hapus di depan

void hapus6epan (){ T#ode $hapus,$bantu; int d; i) (is'mpt(()==+){ i)(head->ne!t = head){

hapus = head; d = hapus->data; bantu = head->prev; head = head->ne!t; bantu->ne!t = head; head->prev = bantu; delete hapus; " else {

d = head->data; head = #%&&; " print)(/0i terhapus-,d); " else print)(/5asih kosong1n-); "

Hapus di belakang

void hapus.elakang(){ T#ode $hapus,$bantu; int d; i) (is'mpt(()==+){ i)(head->ne!t = head){

bantu = head; while(bantu->ne!t->ne!t = head){

bantu = bantu->ne!t; " hapus = bantu->ne!t; d = hapus->data; bantu->ne!t = head; delete hapus; " else { d = head->data; head = #%&&; " print)(/0i terhapus1n-,d); " else print)(/5asih 2osong-); "

latihan :

%uatlah ilustrasi dari masing-masing potongan program. %uat program lengkap dari potongan-potongan program yang ada diatas' %uat agar menjadi seperti menu. %uat program untuk memasukkan node baru tetapi diantara node yang sudah ada. &entukan node yang baru akan berada pada antrian keberapa.

(. Dengan Head dan tail - Menggunakan ( pointer, head dan tail. - Head selalu menunjuk node pertama dan tail selalu menunjuk node terakhir Sebelumnya kita harus mendeklarasikan dulu pointer head :
T#ode $head, $tail;

Setelah kita mendeklarasikan pointer head, kita belum bisa secara langsung mendeklarasikan node yang dituju. Sehingga pointer head harus dibuat bernilai null terlebih dahulu :
head = #%&&; tail = #%&&;

untuk mengetahui apakah suatu Linked List kosong atau tidak, kita dapat mengetahuinya dengan mengecek nilai dari pointer &ail-nya.
int is'mpt(() { i)(tail==#%&&) return *; else return +; "

ontoh program : !enambahan di depan

void tambahdata (int databaru){ T#ode $baru; baru = new T#ode; baru -> data = databaru; baru -> ne!t = #%&&; baru -> prev = #%&&;

i) (is'mpt(()==*) { head=baru; tail=head;

head->ne!t=head; head->prev=head; tail->ne!t=tail; tail->prev=tail; " else { baru->ne!t=head; head->prev=baru; head=baru; head->prev=tail; tail->ne!t=head; " print)(-data masuk-); "

!enggambaran : head tail

"#LL

Setelah dibuat node baru dan jika diketahui tail$$"#LL : head baru tail

%ila kita membuat node baru lagi maka :

baru

head

bantu

baru

head

tail

baru

head

tail

head

bantu

head

bantu

!enambahan di belakang

void insert.elakang(int databaru){ T#ode $baru; baru = new T#ode; baru->data = databaru; baru->ne!t = baru; baru->prev = baru; i)(is'mpt(()==*){ head=baru; tail=baru; head->ne!t = head; head->prev = head; tail->ne!t = tail; tail->prev = tail; " else {

tail->ne!t = baru; baru->prev = tail; tail = baru; tail->ne!t = head; head->prev = tail; " print)(/6ata masuk1n-); "

&ampil

void tampil(){ T#ode $bantu; bantu = head; i)(is'mpt(()==+){ do{ cout33bantu->data334 4; bantu=bantu->ne!t; "while(bantu =tail->ne!t); print)(/1n-); " else print)(/masih kosong1n-); "

Hapus di depan

void hapus6epan(){ T#ode $hapus; int d; i) (is'mpt(()==+){ i)(head = tail){

hapus = head; d = hapus->data;

head = head->ne!t; tail->ne!t = head; head->prev = tail; delete hapus; " else { d = head->data; head = #%&&; tail = #%&&; " print)(/0i terhapus1n-,d); " else print)(/5asih 2osong-); "

Hapus di belakang

void hapus.elakang(){ T#ode $hapus; int d; i) (is'mpt(()==+){ i)(head = tail){

hapus = tail; d = hapus->data; tail = tail->prev; tail->ne!t = head; head->prev = tail; delete hapus; " else { d = head->data; head = #%&&; tail = #%&&; " cout33d334 terhapus1n4;

" else cout3345asih kosong1n4; "

latihan : %uatlah ilustrasi dari masing-masing potongan program. %uat program lengkap dari potongan-potongan program yang ada diatas' %uat agar menjadi seperti menu. %uat program untuk memasukkan node baru tetapi diantara node yang sudah ada. &entukan node yang baru akan berada pada antrian keberapa.

Soal Double Linked List Circular Soal Guided 1. Marilah kita buat sebuah Double Linked List ircular)DLL * sederhana+ %uatlah sebuah program dengan menggunakan DLL yang dapat menerima inputan dari belakang maupun dari depan.
5include 3stdio6h3
typedef struct Tnode { int value; Tnode *next; Tnode *(ac$; }; Tnode *(aru0 *(antu0*head0*tail; void ta"(ah(int value) { (aru = new Tnode; (aru)*next = (aru; (aru)*(ac$ = (aru; (aru)*value = value; } void ta"(ah(ela$an#(int value){ ta"(ah(value); if(head == NU ) head = tail = (aru; else{ tail)*next = (aru; (aru)*(ac$ = tail; tail = (aru; } tail)*next = head; head)*(ac$ = tail; } void ta"(ahdepan(int value){ ta"(ah(value); if(head == NU ) head = tail = (aru; else {

} tail)*next = head; head)*(ac$ = tail; }

(aru)*next = head; head)*(ac$ = (aru; head = (aru;

void ceta$(){ (antu = head; do { printf(34d30(antu)*value); (antu = (antu)*next; }while((antu1=head); } void "enu(){ int pil; int isi; do { printf(37enu 8-n%67asu$ dari depan-n267asu$ dari (ela$an#-n96:eta$-n;6!xit-n7asu$$an pilihan anda3); scanf(34d30<pil); switch(pil){ case % 8 printf(37asu$$an nilai 8 3); scanf(34d30<isi); ta"(ahdepan(isi); (rea$; case 2 8 printf(37asu$$an nilai 8 3); scanf(34d30<isi); ta"(ah(ela$an#(isi); (rea$; case 9 8 ceta$(); (rea$; case ; 8 printf(3Teri"a $asih3); (rea$; default8 an#$a dari % sa"pai 93); } }while(pil1=;); } int "ain(){ "enu(); return &; } printf(3Tida$ ada pilihan terse(ut0 "asu$$an

(. Setelah dapat menambahkan dari depan dan belakang, mari kita berlatih untuk dapat menghapus data yang telah di masukkan. %erikut ini adalah contoh program untuk mendelete data dari belakang.
5include 3stdio6h3 typedef struct Tnode

{ int value; Tnode *next; Tnode *(ac$; }; Tnode *(aru0 *(antu0*head0*tail0 *(antudelete; void ta"(ah(int value) { (aru = new Tnode; (aru)*next = (aru; (aru)*(ac$ = (aru; (aru)*value = value; } void ta"(ah(ela$an#(int value) { ta"(ah(value); if(head == NU )

head = tail = (aru; else { tail)*next = (aru; (aru)*(ac$ = tail; tail = (aru; } tail)*next = head; head)*(ac$ = tail; } void delete(ela$an#() { if(head == NU ) ;

head = tail = NU

else { (antudelete = tail; tail = tail)*(ac$; tail)*next = head; head)*(ac$ = tail; delete (antudelete; } }

void ceta$() { if(head 1= NU {(antu = head; do { printf(34d30(antu)*value); (antu = (antu)*next; }while((antu1=head); }else printf(3tida$ ada data3); } void "enu() { int pil; int isi; do { printf(37enu 8-n%67asu$ dari (ela$an#-n26'elete dari (ela$an#-n96:eta$-n;6!xit-n7asu$$an pilihan anda3); scanf(34d30<pil); )

switch(pil) { case % 8 printf(37asu$$an nilai 8 3); scanf(34d30<isi); ta"(ah(ela$an#(isi); (rea$; case 2 8 delete(ela$an#(); (rea$; case 9 8 ceta$(); (rea$; case ; 8 printf(3Teri"a $asih3); (rea$;

default8 printf(3Tida$ ada pilihan terse(ut0 "asu$$an an#$a dari % sa"pai 93); } }while(pil1=;); }

int "ain(){ "enu(); return &; }

Soal Unguided 1. Setelah tadi diberi contoh mengenai tambah depan dan belakang, coba sekarang buatlah yang menambah data nya dari tengah . !enambahan dilakukan setelah data ke n)inputan user* (. Setelah dapat menambahkan data setelah data ke n, bagaimana dengan menghapus data ke n, silahkan dicoba dikerjakan+

Soal Take Home 1. Marilah kita membuat sebuah game Sebuah mesin roulette memiliki 1- point yang masing-masing memiliki .arna dan sebuah nilai angka. "ilai angka yang ada di point-point yang ada adalah angka 1 sampai 1- yang peletakannya secara urut dan .arna untuk setiap point berbeda-beda dengan urutan .arna merah, putih, dan hitam. &entukan sebuah bola )sebuah pointer random* yang menunjuk ke mesin roulette tersebut dengan perhitungan random tentu saja+ #ser bisa memilih akan melempar bola tersebut ke arah kanan atau kearah kiri tergantung pilihan user Sebelum memulai user dapat menentukan pilihan dengan cara memilih antara angka 1 / 1- atau .arna antara putih, hitam, dan merah. 0emudian memasukkan banyaknya bet)banyaknya point yang ditaruhkan*)pada a.al user diberi 1111point* 2ika tebakan benar maka point user bertambah yaitu ( kali bet. 2ika salah maka point user berkurang sebanyak bet yang dimasukkan (. Sebuah bank di 3ndonesia ingin membuat sebuah program dengan menggunakan urutan prioritas. &ujuan program ini adalah untuk memberikan no urut kepada para nasabahnya. "o urut yang diberikan kemudian akan dipanggil oleh program sehingga nasabah yang memiliki no tersebut dapat menuju ke teller yang telah ditunjuk. !ermasalahannya di bank tersebut terdapat sebuah sistem prioritas yang mendahulukan orang( yang memiliki prioritas, sehingga ketika nasabah yang memiliki prioritas bisa dipanggil terlebih dahulu dari pada nasabah yang tidak memiliki prioritas. %uatlah program menggunakan DLL untuk mengatasi hal ini+

You might also like