Pengertian Linked list : sekumpulan elemen bertipe sama, yang mempunyai keterurutan tertentu, yang setiap elemennya terdiri dari dua bagian struktur berupa rangkaian elemen saling berkait dimana setiap elemen dihubungkan elemen lain melalui pointer. Pointer adalah alamat elemen. Penggunaan pointer untuk mengacu elemen berakibat elemen-elemen bersebelahan secara logik walau tidak bersebelahan secara fisik di memori. Bentuk Umum : Infotype sebuah tipe terdefinisi yang menyimpan informasi sebuah elemen list Next address dari elemen berikutnya (suksesor) ika ! adalah list, dan P adalah address, maka alamat elemen pertama list ! dapat diacu dengan notasi " #ebelum digunakan harus dideklarasikan terlebih dahulu " $lemen yang diacu oleh P dapat dikonsultasi informasinya dengan notasi " Beera!a De"inisi : %. !ist l adalah list kosong, &ika 'irst(!) ( Nil ). $lemen terakhir dikenali, dengan salah satu cara adalah karena Next(!ast) ( Nil Nil adalah pengganti Null, perubahan ini dituliskan dengan *define Nil Null Single Linked List Pada gambar di atas tampak bahwa sebuah data terletak pada sebuah lokasi memori area. +empat yang disediakan pada satu area memori tertentu untuk menyimpan data dikenal dengan sebutan node atau simpul. #etiap node memiliki pointer yang menun&uk ke simpul berikutnya sehingga terbentuk satu untaian, dengan demikian hanya diperlukan sebuah ,ariabel pointer. #usunan berupa untaian semacam ini disebut #ingle !inked !ist (N-!! memilik nilai khusus yang artinya tidak menun&uk ke mana- mana. .iasanya !inked !ist pada titik akhirnya akan menun&uk ke N-!!). Pembuatan #ingle !inked !ist dapat menggunakan ) metode" !I'/ (!ast In 'irst /ut), aplikasinya " #tack (+umpukan) 'I'/ ('irst In 'irst /ut), aplikasinya " 0ueue (1ntrean) Double Linked List #alah satu kelemahan single linked list adalah pointer (penun&uk) hanya dapat bergerak satu arah sa&a, ma&u2mundur, atau kanan2kiri sehingga pencarian data pada single linked list hanya dapat bergerak dalam satu arah sa&a. -ntuk mengatasi kelemahan tersebut, dapat menggunakan metode double linked list. !inked list ini dikenal dengan nama !inked list berpointer 3anda atau 4ouble !inked !ist. Circular Double Linked List Harjanto Sutedjo Page 1 STACK DAN QUEUE DGN LINKED LIST 5erupakan double linked list yang simpul terakhirnya menun&uk ke simpul terakhirnya menun&uk ke simpul awalnya menun&uk ke simpul akhir sehingga membentuk suatu lingkaran. #!erasi$#!erasi %ang ada !ada Linked List Insert Istilah Insert berarti menambahkan sebuah simpul baru ke dalam suatu linked list. IsEm!t% 'ungsi ini menentukan apakah linked list kosong atau tidak. &ind &irst 'ungsi ini mencari elemen pertama dari linked list &ind Ne't 'ungsi ini mencari elemen sesudah elemen yang ditun&uk now (etrie)e 'ungsi ini mengambil elemen yang ditun&uk oleh now. $lemen tersebut lalu dikembalikan oleh fungsi. U!date 'ungsi ini mengubah elemen yang ditun&uk oleh now dengan isi dari sesuatu Delete N*+ 'ungsi ini menghapus elemen yang ditun&uk oleh now. ika yang dihapus adalah elemen pertama dari linked list (head), head akan berpindah ke elemen berikut. Delete ,ead 'ungsi ini menghapus elemen yang ditun&uk head. 6ead berpindah ke elemen sesudahnya. Clear 'ungsi ini menghapus linked list yang sudah ada. 'ungsi ini wa&ib dilakukan bila anda ingin mengakhiri program yang menggunakan linked list. ika anda melakukannya, data-data yang dialokasikan ke memori pada program sebelumnya akan tetap tertinggal di dalam memori. A. STACK DENGAN SINGLE LINKED LIST #elain implementasi stack dengan array seperti telah di&elaskan sebelumnya, stack daat diimplementasikan dengan single linked list. 7eunggulannya dibandingkan array adalah penggunaan alokasi memori yang dinamis sehingga menghindari pemborosan memori. 5isalnya pada stack dengan array disediakan tempat untuk stack berisi %89 elemen, sementara ketika dipakai oleh user stack hanya diisi 89 elemen, maka telah ter&adi pemborosan memori untuk sisa %99 elemen, yang tak terpakai. 4engan penggunaan linked list maka tempat yang disediakan akan sesuai dengan banyaknya elemen yang mengisi stack. 4alam stack dengan linked list tidak ada istilah "ull, sebab biasanya program tidak menentukan ¨ah elemen stack yang mungkin ada (kecuali &ika sudah dibatasi oleh pembuatnya). Namun demikian sebenarnya stack ini pun memiliki batas kapasitas, yakni dibatasi oleh ¨ah memori yang tersedia. #!erasi$*!erasi untuk Sta-k dengan Linked List IsEm!ty 'ungsi memeriksa apakah stack yang adamasih kosong. Pus. 'ungsi memasukkan elemen baru ke dalam stack. Push di sini mirip dengan insert dalam single linked list biasa. P*! 'ungsi ini mengeluarkan elemen teratas dari stack. Clear 'ungsi ini akan menghapus stack yang ada. Harjanto Sutedjo Page 2 STACK DAN QUEUE DGN LINKED LIST B. QUEUE DENGAN D#UBLE LINKED LIST #elain menggunakan array, :ueue &uga dapat dibuat dengan linked list. 5etode linked list yang digunakan adalah double linked list. #!erasi$*!erasi Queue dengan D*ule Linked List IsEm!t% 'ungsi Is$mpty berguna untuk mengecek apakah :ueue masih kosong atau sudah berisi data. 6al ini dilakukan dengan mengecek apakah head masih menun&ukkan pada Null atau tidak. ika benar berarti :ueue masih kosong. Is&ull 'ungsi Is'ull berguna untuk mengecek apakah :ueue sudah penuh atau masih bisa menampung data dengan cara mengecek apakah umlah 0ueue sudah sama dengan 51;<0-$-$ atau belum. ika benar maka :ueue sudah penuh. EnQueue 'ungsi $n0ueue berguna untuk memasukkan sebuah elemen ke dalam :ueue (head dan tail mula-mula meun&ukkan ke N-!!). DeQueue Procedure 4e0ueue berguna untuk mengambil sebuah elemen dari :ueue. 6al ini dilakukan dengan cara menghapus satu simpul yang terletak paling depan (head). II. STACK DAN QUEUE DENGAN A((A/ 0. STACK DENGAN 1ENGGUNAKAN A((A/ Pengertian Sta-k #tack atau tumpukan adalah suatu stuktur data yang penting dalam pemrograman .ersifat !I'/ (Last In First Out) .enda yang terakhir masuk ke dalam stack akan men&adi benda pertama yang dikeluarkan dari stack =ontohnya, karena kita menumpuk =ompo di posisi terakhir, maka =ompo akan men&adi elemen teratas dalam tumpukan. #ebaliknya, karena kita menumpuk +ele,isi pada saat pertama kali, Harjanto Sutedjo Page 3 STACK DAN QUEUE DGN LINKED LIST maka elemen +ele,isi men&adi elemen terbawah dari tumpukan. 4an &ika kita mengambil elemen dari tumpukan, maka secara otomatis akan terambil elemen teratas, yaitu =ompo &uga. #!erasi$*!erasi2"ungsi Sta-k Pus. : digunakan untuk menambah item pada stack pada tumpukan paling atas P*! : digunakan untuk mengambil item pada stack pada tumpukan paling atas Clear : digunakan untuk mengosongkan stack IsEm!t% : fungsi yang digunakan untuk mengecek apakah stack sudah kosong Is&ull : fungsi yang digunakan untuk mengecek apakah stack sudah penuh Sta-k +it. Arra% *" Stru-t 4efinisikan #tack dengan menggunakan struct 4efinisikan 51;<#+1=7 untuk maksimum isi stack .uatlah ,ariabel array data sebagai implementasi stack secara nyata 4eklarasikan operasi-operasi2function di atas dan buat implemetasinya Deklarasi 1A34STACK *define 51;<#+1=7 %9 22hati-hati mulai dari 9 &adi 9-> Deklarasi STACK dengan stru-t dan arra% data typedef struct #+1=7? int top@ char dataA%9BA%9B@ 22misalkan " data adalah array of string 22ber¨ah %9 data, masing-masing string 22menampung maksimal %9 karakter C@ Deklarasi2uat )ariael dari stru-t #+1=7 tumpuk@ Inisialisasi Sta-k Pada mulanya isi top dengan -%, karena array dalam = dimulai dari 9, yang berarti stack adalah 7/#/N3D +op adalah suatu ,ariabel penanda dalam #+1=7 yang menun&ukkan elemen teratas #tack sekarang. +op /f #tack akan selalu bergerak hingga mencapai 51; of #+1=7 sehingga menyebabkan stack P$N-6D Ilustrasi stack pada saat inisialisasi" &ungsi Is&ull -ntuk memeriksa apakah stack sudah penuhE Harjanto Sutedjo Page 4 STACK DAN QUEUE DGN LINKED LIST 4engan cara memeriksa top of stack, &ika sudah sama dengan 51;<#+1=7-% maka full, &ika belum (masih lebih kecil dari 51;<#+1=7-%) maka belum full Ilustrasi" &ungsi IsEm!t% -ntuk memeriksa apakah stack masih kosongE 4engan cara memeriksa top of stack, &ika masih -% maka berarti stack masih kosongD Program" &ungsi Pus. -ntuk memasukkan elemen ke stack, selalu men&adi elemen teratas stack +ambah satu (increment) nilai top of stack terlebih dahulu setiap kali ada penambahan elemen stack, asalkan stack masih belum penuh, kemudian isikan nilai baru ke stack berdasarkan indeks top of stack setelah ditambah satu (diincrement) Ilustrasinya" &ungsi P*! -ntuk mengambil elemen teratas dari stack. 1mbil dahulu nilai elemen teratas stack dengan mengakses top of stack, tampilkan nilai yang akan diambil terlebih dahulu, baru didecrement nilai top of stack sehingga ¨ah elemen stack berkurang Ilustrasinya" Programnya" &ungsi Print -ntuk menampilkan semua elemen-elemen stack 4engan cara looping semua nilai array secara terbalik, karena kita harusmengakses dari indeks array tertinggi terlebih dahulu baru ke indeks yang kecilD Program" 5. QUEUE DENGAN 1ENGGUNAKAN A((A/ 0ueue ( 1ntrian $lemen yang pertama kali masuk ke antrian akan keluar pertama kalinya 4$0-$-$ adalah mengeluarkan satu elemen dari suatu 1ntrian 1ntrian dapat dibuat dengan menggunakan" !iniear 1rray dan =ircular 1rray QUEUE DENGAN LINIEA( A((A/ +erdapat satu buah pintu masuk di suatu u&ung dan satu buah pintu keluar di u&ung satunya #ehingga membutuhkan ,ariabel 6ead dan +ail Harjanto Sutedjo Page 5 STACK DAN QUEUE DGN LINKED LIST DEKLA(ASI QUEUE #PE(ASI$#PE(ASI PADA QUEUE - Create67 o -ntuk menciptakan dan menginisialisasi 0ueue o 4engan cara membuat 6ead dan +ail ( -% - IsEm!t%67 o -ntuk memeriksa apakah 1ntrian sudah penuh atau belum o 4engan cara memeriksa nilai +ail, &ika +ail ( -% maka empty o 7ita tidak memeriksa 6ead, karena 6ead adalah tanda untuk kepala antrian (elemen pertama dalam antrian) yang tidak akan berubahubah o Pergerakan pada 1ntrian ter&adi dengan penambahan elemen 1ntrian kebelakang, yaitu menggunakan nilai +ail - Is&ull67 o -ntuk mengecek apakah 1ntrian sudah penuh atau belum o 4engan cara mengecek nilai +ail, &ika +ail F( 51;-% (karena 51;-% adalah batas elemen array pada =) berarti sudah penuh - En8ueue6data7 o -ntuk menambahkan elemen ke dalam 1ntrian, penambahan elemen selalu ditambahkan di elemen paling belakang o Penambahan elemen selalu menggerakan ,ariabel +ail dengan cara increment counter +ail - De8ueue67 o 4igunakan untuk menghapus elemen terdepan2pertama dari 1ntrian o 4engan cara mengurangi counter +ail dan menggeser semua elemen antrian kedepan. o Penggeseran dilakukan dengan menggunakan looping - Clear67 o -ntuk menghapus elemen-elemen 1ntrian dengan cara membuat +ail dan 6ead ( -% o Penghapusan elemen-elemen 1ntrian sebenarnya tidak menghapus arraynya, namun hanya mengeset indeks pengaksesan-nya ke nilai -% sehingga elemen-elemen 1ntrian tidak lagi terbaca - Tam!il67 o -ntuk menampilkan nilai-nilai elemen 1ntrian o 5enggunakan looping dari head s2d tail PE1BA,ASAN Harjanto Sutedjo Page 6 STACK DAN QUEUE DGN LINKED LIST Perandingan Antara Sta-k$Queue Dengan Linked List 9s Sta-k$Queue Dengan Arra% 0. Sta-k Dengan Linked List 9S Sta-k Dengan Arra% .erikut ini adalah perbandingan algoritma pada operasi-operasi dasar dari #tack 4engan !inked !ist dan #tack 4engan 1rray, dengan menggunakan bahasa pemrograman Pascal Sta-k Dengan Linked List Sta-k Dengan Arra% *!erasi : -reate67 procedure create@ begin top "( nil @ end@ procedure create@ begin top "( 9@ end@ *!erasi : em!t%67 function empty " boolean@ begin empty "( false @ if top ( nil then empty "( true @ end@ function empty " boolean@ begin empty "( false @ if top ( 9 then empty "( true @ end@ *!erasi : "ull67 tidak ada istilah full pada stack. program tidak menentukan ¨ah elemen stack yang mungkin ada. kecuali dibatasi oleh pembuat program dan ¨ah memory yang tersedia. tempat akan sesuai dengan banyaknya elemen yang mengisi stack. function full " boolean@ begin full "( false @ if top ( max then full "( true @ end@ *!erasi : !us.67 procedure push (elemen " typedata) @ ,ar now"point @ begin now(now) @ nowG.isi "( elemen @ if empty then nowG.next "( nil @ else nowG.next "( top @ top "( now @ end@ procedure push (elemen " typedata) @ begin if not full then begin top "( top H % @ stack AtopB "( elemen @ end@ end@ *!erasi : !*!67 procedure pop (,ar elemen " typedata) @ procedure pop (elemen " typedata) @ Harjanto Sutedjo Page 7 STACK DAN QUEUE DGN LINKED LIST ,ar now"point @ begin if not empty then begin elemen "( nowG.isi @ now "( top @ top "( topG.next @ dispose(now) @ end@ end@ begin if not empty then begin elemen "( stack AtopB @ top "( top I % @ end@ end@ *!erasi : -lear procedure clear @ ,ar trash " typedata @ begin while not empty do pop(trash) @ end@ procedure clear @ begin top "( 9 @ end@ PE1BA,ASAN 4ari perbandingan diatas, dapat dilihat pada linked list tidak dikenal istilah full. 6al ini berkaitan dengan penggunaan alokasi memori pada linked list yang lebih dinamis &ika dibandingkan dengan array, sehingga pemborosan memory dapat dihindari. Program tidak menentukan ¨ah elemen stack yang mungkin ada. 7ecuali dibatasi oleh pembuat program dan ¨ah memory yang tersedia. +empat akan sesuai dengan banyaknya elemen yang mengisi stack. 5. Queue Dengan Linked List 9S Queue Dengan Arra% Implementasi :ueue menggunakan array Implementasi sederhana -kuran memori harus ditentukan ketika sebuah ob&ek :ueue dideklarasikan Pemborosan tempat (memori) ketika menggunakan ¨ah data yang lebih sedikit dari alokasi memori +idak dapat menambahkan data melebihi maksimal ukuran array yang telah dideklarasikan Implementasi :ueue menggunakan linked list Pengalokasian memori dinamis 5enggunaka ) buah pionter, qFront dan qRear, untuk menandai posisi depan dan belakang dari :ueue Perbandingan implementasi :ueue, array J# linked list (contoh %) 5emory re:uirements o 1rray-based implementation 4iasumsikan ukuran :ueue %99 (string KL9bytes) 4iasumsikan index membutuhkan ) bytes +otal memory" (L9 bytes x %9% slots) H () bytes x ) indexes) ( L9LM bytes o !inked-list-based implementation Harjanto Sutedjo Page 8 STACK DAN QUEUE DGN LINKED LIST 4iasumsikan pointers membutuhkan M bytes +otal memory per node" L9 bytes H M bytes ( LM bytes 3ambar " Perbandingan implementasi :ueue, array J# linked list (contoh )) 5emory re:uirements o 1rray-based implementation 4iasumsikan ukuran :ueue %99 (string K)bytes) 4iasumsikan index membutuhkan ) bytes +otal memory" () bytes x %9% slots) H () bytes x ) indexes) ( )9N bytes o !inked-list-based implementation 4iasumsikan pointers membutuhkan M bytes +otal memory per node" ) bytes H M bytes ( N bytes 3ambar " KESI1PULAN Perbandingan 1ntara #tack-0ueue 4engan !inked !ist Js #tack-0ueue 4engan 1rray -ntuk stack dan :ueue yang berukuran besar, terutama ¨ah maksimal data tidak diketahui, lebih baik menggunakan linked list. -ntuk perangkat yang memiliki memori terbatas, seperti small handheld de,ices, linked list memiliki performa yang lebih bagus. Harjanto Sutedjo Page 9