• Tidak ada hasil yang ditemukan

03 LINKED LIST. Slide 0 voice. Slide 1 voice. Slide 2 voice. Thompson Susabda Ngoen 1 P a g e

N/A
N/A
Protected

Academic year: 2021

Membagikan "03 LINKED LIST. Slide 0 voice. Slide 1 voice. Slide 2 voice. Thompson Susabda Ngoen 1 P a g e"

Copied!
15
0
0

Teks penuh

(1)

© Thompson Susabda Ngoen 1 |

P a g e

03 LINKED LIST

Slide 0 voice

Pada perkuliahan ini kita akan membahas topik linked list atau senarai berkait.

Slide 1 voice

Terdapat tujuh bilangan bulat yang nilainya terurut secara menaik (ascending) di dalam sebuah larik bilangan bulat (array of integer) berkapasitas seribu.

Ke dalam larik ini akan ditambahkan sebuah bilangan bernilai 23 dan setelah ditambahkan semua nilai harus tersusun menaik.

Bagaimana prosesnya?

Slide 2 voice

Langkah pertama: geser ke kanan semua bilangan yang nilainya lebih besar daripada 23. Penggeseran dimulai dari bilangan yang bernilai paling besar.

Bilangan bernilai 38 akan menempati posisi [7]. Bilangan bernilai 33 akan menempati posisi [6] dan seterusnya.

Posisi [3] menjadi kosong.

(2)

© Thompson Susabda Ngoen 2 |

P a g e Langkah kedua:

Masukkan bilangan 23 di tempat yang kosong, yaitu di posisi [3].

Slide 4 voice

Kasus lain.

Terdapat tujuh bilangan bulat yang nilainya terurut secara menaik (ascending) di dalam sebuah larik bilangan bulat (array of integer) berkapasitas seribu.

Salah satu bilangan yaitu yang bernilai 15 akan dihapus dari larik. Setelah dihapus larik tidak boleh bolong di tengah dan semua nilai harus tersusun menaik.

Bagaimana prosesnya?

Slide 5 voice

Langkah ke-1

Pindahkan ke kiri satu posisi atau salin ke kiri semua bilangan yang nilainya lebih besar daripada 15, mulai dari bilangan bernilai 21. Bilangan bernilai 21 akan menempati posisi [1], bilangan 23 akan menempati posisi [2] dst.

(3)

© Thompson Susabda Ngoen 3 |

P a g e Langkah kedua

Hapus bilangan di posisi [7].

Slide 7 voice

Pada kedua kasus kita melihat bahwa ada sejumlah data yang perlu digeser.

Apakah terdapat cara lain yang lebih efisien sehingga penambahan data atau penghapusan data tidak memerlukan penggeseran sejumlah data lain?

Ada, dengan menggunakan struktur data SENARAI BERKAIT atau LINKED LIST.

Slide 8 voice

Bentuk sebuah linked list atau senarai berkait yang paling sederhana adalah sekumpulan nodes (simpul-simpul) yang membentuk sebuah struktur linier seperti sebuah rantai.

Setiap node (simpul) mengandung sebuah field berjenis pointer, yang biasa diberi nama next. Pointer next ini menunjuk atau mengacuh simpul berikutnya.

Pointer next ini berfungsi seperti kait, mengait satu simpul ke simpul berikutnya.

Pointer next simpul terakhir tidak menunjuk simpul lain melainkan diberi nilai NULL atau 0. NIlai NULL atau 0 ini menandakan bahwa simpul tersebut tidak menunjuk simpul lain. Pada setiap node (simpul) selain terdapat pointer next juga terdapat elemen-elemen data lainnya.

(4)

© Thompson Susabda Ngoen 4 |

P a g e Simpul pertama sebuah linked list disebut head dari linked list tersebut. Simpul terakhir sebuah linked list disebut tail dari linked list tersebut.

Pada saat diimplementsi dalam penulisan program, simpul pertama ini ditunjuk oleh atau diacu dengan sebuah variabel pointer yang umumnya diberi nama head, dan simpul terakhir ditunjuk oleh atau diacu dengan sebuah variabel pointer yang umumnya diberi nama tail. Pointer tail bersifat opsional.

Pada gambar terlampir, kotak berwarna kuning menandakan variabel pointer.

Slide 10 voice

Terdapat dua jenis linked list yaitu

singly-linked list atau senarai berkait tunggal dan doubly-linked list atau senarai berkait ganda.

Pada singly-linked list setiap simpul mempunyai satu kait, maksudnya terdapat satu field yang berjenis pointer, digunakan untuk menunjuk ke atau mengait ke simpul berikutnya.

Pada doubly-linked list setiap simpul mempunyai dua kait, maksudnya terdapat dua field yang berjenis pointer, yang satu digunakan untuk menunjuk ke atau mengait ke simpul berikutnya, dan yang lain digunakan untuk menunjuk ke atau mengaitkan ke simpul sebelumnya.

Pada gambar terlampir, kotak berwarna kuning menandakan variabel pointer.

Slide 11 voice

Bagaimana dengan pemakaian memori oleh linked list?

Pointer head dan pointer tail berada di local stack memory, di lokasi yang sama dengan variable lainnya.

Simpul-simpul linked list berada di heap memory. Simpul- simpul linked list dibentuk atau dialokasi secara dinamis.

Dialokasi secara dinamis maksudnya adalah ketika sebuah simpul mau dibuat maka barulah pada saat itu memory yang diperlukan untuk itu dimintakan dari operating system.

(5)

© Thompson Susabda Ngoen 5 |

P a g e Pada ilustrasi linked list, pointer next, pointer head, pointer tail digambarkan sebagai sebuah panah.

Sebetulnya apa isi pointer-pointer tersebut?

Seperti kita ketahui, variabel pointer atau disingkat sebagai pointer adalah variabel yang berisi alamat memori. Pointer tidak berisi data seperti bilangan bulat, bilangan pecah, atau karakter ASCII. Pointer berisi alamat memori komputer.

Pada ilustrasi berikut pointer head menunjuk ke simpul bernilai 17. Misalkan Secara fisik simpul bernilai 17 ini menempati heap memory mulai dari address 2000.

Maka variabel pointer head berisi address 2000. Misalkan secara fisik simpul bernilai 92 menempati heap memory mulai dari address 2800 maka pointer next pada simpul bernilai 17 berisi address 2800. Pointer next simpul terakhir, simpul bernilai 45 tidak menunjuk simpul lain maka pointer next simpul ini berisi nilai nol.

Slide 13a voice

Selanjutnya kita melihat coding untuk singly-linked list.

Akan dibentuk dua class yaitu StringLinkedList dan class StringNode.

Coding ini membentuk sebuah class bernama StringNode yang simpulnya terdiri atas dua field atau dua data member yaitu sebuah string bernama elem dan sebuah pointer bernama next. Class StringNode tidak

mempunyai member function.

Class StringNode digunakan untuk membentuk objek atau simpul yang menjadi elemen data class

StringLinkedList.

Karena data member (variabel) di dalam StringNode ini akan diakses langsung oleh StringLinkedList maka pada deklarasi StringN StringNode ode ditambahkan instruksi friend class StringLinkedList.

Slide 13b voice

Class StringLinkedList mempunyai sebuah data member bertipe pointer to StringNode yang bernama head. Class ini mempunyai constructor, destructor, dan empat function member lain yaitu empty(), front(), addFront(), dan removeFront().

(6)

© Thompson Susabda Ngoen 6 |

P a g e Constructor memberi nilai NULL kepada pointer head, untuk menandakan bahwa linked list kosong, belum ada simpul satu pun.

Destructor bertugas menghapus simpul yang ada satu per satu sampai habis. Penghapusan simpul ini dilakukan dengan memanggil function removeFront().

Function empty() akan mengembalikan nilai true jika linked list kosong dan akan mengembalikan nilai false jika linked list ada simpul. Caranya adalah dengan

membandingkan pointer head dengan NULL.

Function front() akan mengembalikan elemen data simpul pertama, yaitu simpul yang ditunjuk pointer head.

Slide 15 voice

Function addFront() bertujuan menambah simpul baru di posisi depan linked list. Setelah ditambahkan maka simpul baru menjadi simpul pertama atau simpul terdepan linked list.

Perhatikan ilustrasi berikut.

Terdapat sebuah singly-linked list yang terdiri atas tiga simpul dengan nilai MSP, ATL, dan BOS. Simpul pertama yang bernilai MSP ditunjuk pointer head. Ke dalam linked list ini akan ditambahkan sebuah simpul baru bernilai LAX di depannya. Setelah ditambahkan maka jumlah simpul menjadi empat. Simpul pertama atau simpul terdepan bernilai LAX ditunjuk pointer head. Pointer next pada simpul LAX menunjuk simpul MSP dan seterusnya.

Proses menambah simpul di depan singly-linked list terdiri atas empat langkah: 1) memesan atau mengalokasi memori untuk simpul baru berjenis hStringNode dengan menggunakan instruksi new. Simpul baru ini ditunjuk pointer v.

2) Copy-kan elemen data e ke dalam data member elem pada simpul baru yang ditunjuk pointer v. 3) Pointer next simpul baru diberi nilai seperti pointer head. Akibatnya pointer next simpul baru akan menunjuk ke simpul yang ditunjuk pointer head, yaitu menunjuk simpul pertama. Dengan proses ini maka simpul baru menjadi terhubung dengan simpul-simpul lain.

4) Pointer head diberi nilai seperti pointer v. Akibatnya pointer head menunjuk ke simpul baru.

Slide 16a voice

Slide ini mengilustrasikan proses penambahan simpul baru ke dalam singly-linked list yang masih kosong. Kotak yang berwarna kuning menandakan tipe data pointer.

Kotak kuning berisi garis miring menandakan NULL pointer. Kotak yang berwarna biru menandakan tipe data string.

Perhatikan gambar ke-1. Karena linked list masih kosong maka pointer head diilustrasikan sebagai kotak kuning dengan garis miring.

Pesan satu simpul baru bertipe StringNode dan tunjuk simpul ini dengan pointer v. Intruksinya

StringNode* v = new StringNode

Simpul ini mempunyai dua field, satu field untuk data tipe string dan yang satu lagi bertipe pointer. Tanda Tanya pada kedua field ini menandakan bahwa kedua field berisi sampah memori. Simpul baru ini ditunjuk pointer v.

(7)

© Thompson Susabda Ngoen 7 |

P a g e Langkah ke-2

Copy isi parameter e ke dalam field elem pada simpul yang ditunjuk pointer v. Dalam ini berisi BOS.

Instruksinya: v -> elem = e

Langkah ke-3,

ubah pointer next pada simpul baru ini sehingga bernilai sama demgam head.

Dengan perkataan lain

Pointer next pada simpul yang ditunjuk pointer v diberi nilai seperti pointer head.

Instruksinya: v -> next = head Langkah ke-4, ubah pointer head sehingga menunjuk ke simpul baru ini.

Dengan perkataan lain, pointer head diberi nilai seperti pointer v. Instruksi: head = v

Slide 17 voice

Slide ini mengilustrasikan proses penambahan simpul baru ke dalam singly-linked list yang sudah ada simpul.

Keempat statement-nya sama dengan statement pada slide sebelumnya.

Langkah ke-1.

instruksi new StringNode membentuk sebuah simpul atau sebuah objek bertipe StringNode. Simpul ini ditunjuk pointer v.

Langkah ke-2

Copy isi parameter e ke dalam field elem. Langkah ke-3, ubah pointer next pada simpul baru sehingga menunjuk ke simpul pertama.

Langkah ke-4, ubah pointer head sehingga menunjuk ke simpul baru.

(8)

© Thompson Susabda Ngoen 8 |

P a g e Kita akan melihat bagaimana cara menghapus simpul pertama atau terdepan singly linked list.

Sebagai ilustrasi terdapat singly linked list dengan empat simpul. Simpul terdepan yang berdata LAX mau dihapus dari linked list. Pointer head harus dipindahkan simpul kedua yang bernilai MSP. Setelah itu simpul LAX dihapus.

Slide 19 voice

Langkah ke-1

Sediakan sebuah pointer, misalnya old. Pointer ini digunakan untuk menunjuk ke simpul pertama linked list.

Dalam ilustrasi ini pointer old menunjuk ke simpul berdata LAX.

Dengan perkataan lain,

Sediakan sebuah pointer, misalnya old. Pointer old diberi nilai seperti pointer head.

Instruksinya: StringNode* old = head

Langkah ke-2

Pointer head menunjuk simpul berikut. Dalam ilustrasi ini menunjuk ke simpul berdata MSP.

Dengan perkataan lain,

Pointer head diberi nilai seperti pointer next pada simpul yang ditunjuk pointer head pada gambar satu Instruksinya: head = head -> next

Langkah ke-3

Hapus simpul yang pertama yaitu simpul yang ditunjuk pointer old. Instruksinya: delete old

Slide 20 voice

Ini adalah deklarasi class SNode yang akan menjadi simpul linked list. Simpul atau objek yang dibentuk dari class SNode mempunyai dua data member atau dua variabel yaitu elem yang bertipe data generik dan next yang bertipe data pointer.

Perhatikan data member elem yang bertipe data E. Pas di atas deklarasi class SNode terdapat statement template

<typename E>. Deklarasi ini menyatakan bahwa E adalah tipe data yang bersifat generik, maksudnya dapat

ditentukan oleh user sesuai kebutuhan.

Instruksi friend clas SLinkedList<E> menyatakan class SLinkedList dapat langsung mengakses data member elem dan next.

Karena class SNode ini bersifat generik maka class SLinkedList juga harus bersifat generik.

Karena class SLinkedList bersifat generik maka harus ditambahkan dua statement yang berwarna biru sebelum deklarasi class SNode.

(9)

© Thompson Susabda Ngoen 9 |

P a g e Slide ini dan dua slide berikutnya berisi definisi class SLinkedList. Definisi class ini me-include header file SNode.h.

Class SLinkedList hanya mempunyai satu data member yaitu head. Class ini mempunyai constructor, destructor, dan empat member function lain.

Constructor SLinkedList memberi nilai NULL kepada pointer head.

Slide 22 voice

Destructor bertujuan menghapus semua simpul yang ada, dengan cara memanggil function removeFront() berkali- kali sampai linked list menjadi kosong.

Function empty() mengembalikan nilai true jika linked list kosong alias belum mempunyai simpul satu pun.

Function empty() mengembalikan nilai false jika ada simpul di dalam linked list. Algoritmanya adalah dengan membandingkan pointer head dengan NULL.

Function front() mengembalikan elemen data simpul pertama, yaitu simpul yang ditunjuk pointer head.

Function front() tidak menyebabkan perubahan isi linked list. Function addFront() menambah simpul baru pada bagian depan linked list. Pada slide sebelumnya kita sudah membahas hal ini.

Slide 23 voice

Function removeFront() menghapus simpul pertama, yaitu simpul yang ditunjuk pointer head. Pada slide sebelumnya kita sudah membahas hal ini.

(10)

© Thompson Susabda Ngoen 10 |

P a g e Program example 03-01 membentuk singly linked list yang elemen datanya bertipe string. Setiap string (kata) yang diketikkan user ditambahkan di depan linked list dengan cara memanggil function addFront(). Akibatnya string (kata) yang terakhir diketikkan menjadi simpul yang pertama ketika diakses.

Selanjutnya simpul linked list dihapus semua dengan mengulangi dua proses berkut:

1. mencetak elemen data pada simpul terdepan 2. menghapus simpul terdepan.

Slide 25 voice

Program example 03-02 mirip dengan program example 03-01, bedanya adalah pada tipe data simpul yang berupa integer.

Slide 26 voice

Mind Twister 03-01

Anda diminta untuk mengembangkan class SLinkedList dengan menambahkan 5 member function.

Function addBack() berfungsi menambah simpul di ujung atau posisi akhir linked list.

Function removeBack() berfungsi menghapus simpul yang terakhir linked list.

Function insertAfter() berfungsi menambah simpul baru pas setelah simpul dengan nilai tertentu.

Function removeCertain() berfungsi menghapus simpul bernilai tertentu.

Function printList() berfungsi mencetak isi simpul satu persatu.

(11)

© Thompson Susabda Ngoen 11 |

P a g e Mind twister 03-02.

Buat sebuah class bernama OrderedList yang mengatur penambahan simpul ke dalam linked list sehingga nilai simpul terurut menaik.

Selain itu juga buat sebuah program yang menggunakan OrderedList tersebut.

Slide 28 voice

Doubly linked list adalah senarai berkait yang simpul- simpul dapat ditelusuri dari dua arah:

Forward atau arah maju, mulai dari simpul pertama, kedua, sampai dengan simpul terakhir.

Backward atau arah mundur, mulai dari simpul terakhir, simpul kedua dari akhir, mundur sampai dengan simpul pertama.

Simpul pembentuk doubly-linked list mempunyai dua data member yang bertipe pointer, yaitu next dan prev. Pointer next digunakan menunjuk simpul berikutnya.

Pointer prev digunakan untuk menunjuk simpul sebelumnya.

Biasanya double-linked list ditunjuk dua pointer yaitu header atau head dan trailer atau tail. Pointer head digunakan untuk menunjuk simpul pertama dan pointer tail digunakan untuk menunjuk simpul terakhir.

Slide 29 voice

Slide berikut menjelaskan cara menyisipkan (insert) sebuah simpul di posisi setelah simpul tertentu.

Terdapat simpul berelemen data v, simpul ini bukan simpul terakhir. Simpul berelemen data Z akan disisipkan di posisi setelah simpul berelemen data V sehingga simpul berelemen data Z akan berada di antara simpul

berelemen data V dan W.

(12)

© Thompson Susabda Ngoen 12 |

P a g e Untuk menyisipkan Z setelah V perlu mengubah empat pointer atau kait yang ditunjuk panah berwarna merah.

Urutannya harus benar agar tidak ada kait yang terputus atau simpul menjadi hilang.

Slide 31 voice

Urutannya adalah

1. ubah pointer prev pada simpul z agar menunjuk simpul v 2. ubah pointer next pada simpul z agar menunjuk simpul w 3. ubah pointer prev pada simpul w agar menunjuk simpul z 4. ubah pointer next pada simpul v agar menunjuk simpul z

Satu hal yang perlu diklarifikasi adalah bahwa sebuah pointer yang menunjuk sebuah simpul, selalu menunjuk ke awal simpul meskipun di dalam ilustrasi mungkin

tergambar menunjuk ke field yang di tengah atau menunjuk pointer next.

Slide 32 voice

Langkah pertama,

Ubah pointer prev pada simpul yang mau disisipkan sehingga menunjuk ke simpul yang di dalamnya terdapat data v.

Dengan perkataan lain,

Ubah pointer prev pada simpul yang ditunjuk pointer node sehingga menunjuk ke simpul yang ditunjuk pointer curr.

Instruksinya: node -> prev = curr

(13)

© Thompson Susabda Ngoen 13 |

P a g e Langkah kedua

Ubah pointer next pada simpul yang mau disisipkan sehingga menunjuk ke simpul yang di dalamnya terdapat data w.

Dengan perkataan lain,

Ubah pointer next pada simpul yang ditunjuk pointer node sehingga menunjuk ke simpul yang ditunjuk pointer next pada simpul yang ditunjuk pointer curr.

Instruksinya: node -> next = curr -> next

Slide 34 voice

Langkah ketiga

Ubah pointer prev pada simpul yang di dalamnya terdapat data w sehingga menunjuk ke simpul yang di dalamnya terdapat data z.

Dengan perkataan lain,

Ubah pointer prev pada simpul yang ditunjuk pointer next pada simpul yang ditunjuk pointer node sehingga menunjuk simpul yang ditunjuk pointer node.

Instrukinya: node->next->prev = node ATAU

Ubah pointer prev pada simpul yang ditunjuk pointer next pada simpul yang ditunjuk pointer curr sehingga menunjuk simpul yang ditunjuk pointer node. Instrukinya: curr->next->prev = node

Slide 35 voice

Langkah keempat

Ubah pointer next pada simpul yang di dalamnya terdapat data v sehingga menunjuk simpul berdata z.

Dengan perkataan lain,

Ubah pointer next pada simpul yang ditunjuk pointer curr sehingga menunjuk ke simpul yang ditunjuk pointer node.

Instruksinya: curr -> next = node

(14)

© Thompson Susabda Ngoen 14 |

P a g e Berikut adalah ilustrasi menghapus sebuah simpul yang diapit dua simpul lain. Dalam contoh ini menghapus simpul yang didalamnya terdapat data v.

Proses yang dilakukan adalah

1. mengubah pointer prev pada simpul yang di dalamnya terdapat data w sehingga menunjuk ke simpul yang di dalamnya terdapat data u,

2. mengubah pointer next pada simpul yang di dalamnya terdapat data u sehingga menunjuk ke simpul yang di dalamnya terdapat data w,

3. menghapus simpul v.

Slide 37 voice

Langkah pertama

Ubah pointer prev pada simpul yang di dalamnya terdapat data w sehingga menunjuk ke simpul yang di dalamnya terdapat data u.

Atau dengan pernyataan lain

Ubah pointer prevpada simpul yang ditunjuk oleh pointer next pada simpul yang ditunjuk pointer next sehingga menunjuk ke simpul yang ditunjuk pointer curr Instruksinya: node->next->prev = curr

Slide 38 voice

Langkah kedua,

Ubah pointer next dari simpul yang di dalamnya terdapat data u sehingga menunjuk ke simpul yang di dalamnya terdapat data w.

Dengan perkataan lain, ubah pointer nextpada simpul yang ditunjuk pointer curr sehingga menunjuk ke simpul yang ditunjuk oleh pointer next pada simpul yang ditunjuk pointer node.

Instruksinya: curr-> next = node->next

(15)

© Thompson Susabda Ngoen 15 |

P a g e Langkah ke-3,

Menghapus simpul yang ditunjuk pointer node dengan menggunakan instruksi

delete node

Slide 40 voice

Simulasikan / ilustrasikan / gambarkan keempat proses berikut pada doubly-linked list. Diasumsikan bahwa linked list tidak kosong, sudah mempunyai simpul (node) satu atau lebih. Pointer head menunjuk simpul pertama dan pointer tail menunjuk simpul terakhir.

1. addFront, menambah simpul baru di depan (awal) linked list.

2. addBack, menambah simpul baru di ujung (akhir) linked list

3. removeFront, menghapus simpul pertama linked list 4. removeBack, menghapus simpul terakhir linked list

Slide 41 voice

Sebagian bahan powerpoint ini bersumber dari buku berjudul Data Structures and Algorithm in C++, 2nd edition yang menjadi buku teks mata kuliah ini.

Referensi

Dokumen terkait

Peneliti : Selain berdasarkan nilai ulangan harian, apakah ada informasi lain yang digunakan dalam menetapkan peserta didik yang harus mengikuti program remedi?. Guru : Tidak

Melihat keberagaman atraksi yang dimiliki oleh Desa Wisata Pentingsari, penulis melihat bahwa atraksi-atraksi yang dimiliki menjadi daya tarik yang dapat diolah

Otitis media akut dapat dise#a#kan invasi virus Campak ke dalam telin$a ten$a!% Gendan$ telin$a #iasana !peremia pada fase prodormal dan stadium erupsi% 4ika terjadi invasi

Peneliti tersebut kemudian membandingkan efek antimikroba senyawa “X” dengan beberapa senyawa antimikroba lainnya pada uji plate  Kirby-Bauer dan hasil percobaan ditampilkan pada

positi untuk (at bermuatan negati !anoda#. 3lektrolit dalam jam lemon bertenaga adalah asam sitrat. erakan elektron dimulai ketika lapisan seng pada salah satu paku

Hasil penelitian ini adalah lie detector memiliki urgensi dalam penggunaannya pada tahap penyidikan kasus tindak pidana pembunuhan berencana yang sulit untuk dipecahkan

Uji kai kuadrat (dilambangkan dengan &#34;χ 2 &#34; dari huruf Yunani &#34; Chi  &#34; dilafalkan &#34;Kai&#34;) digunakan untuk menguji dua kelompok data baik variabel

Dalam rancangan tampilan ini terdapat 2 button yang dapat dipilih oleh pengguna, yaitu button1 merupakan tombol informasi yang berfungsi untuk masuk ke dalam halaman