Buku Ajar Struktur Data Bagian 3 Tujuan Instruksional Khusus Mahasiswa mampu menjelaskan struktur data linier List berkait. Mahasiswa mampu menjelaskan operasi-operasi yang dilakukan pada struktur data List berkait. Pokok Bahasan Struktur data List secara umum. Representasi List berkait dalam memori. Operasi pada List berkait: traversing, searching, Penyisipan, penghapusan. stilah list sering digunakan dalam kehidupan sehari-hari dan merujuk pada daftar dari sejumlah item. Gambar 3.1(a) adalah daftar item barang yang akan dibeli, yang berisi elemen pertama, elemen kedua, . . . ., dan elemen terakhir. Sering terjadi, dari daftar tersebut ada yang item data dihapus dan ada item data yang akan ditambahkan. Gambar 3.1(b) adalah daftar item barang yang akan dibeli setelah ada 3 item data yang ditambahkan dan 2 item data yang dihapus. I Susu Telur Mentega Tomat Apel Jeruk Roti (a) Kadwi Suharsono Susu Telur Mentega Tomat Apel Jeruk Roti Jagung buncis (b) Gambar 3.1. Daftar belanja harian 50 Buku Ajar Struktur Data Pemrosesan data sering melakukan penyimpanan dan pemrosesan yang diorganisasikan ke dalam list. Salah satu cara untuk menyimpan data tersebut adalah dengan menggunakan array, seperti yang telah dibahas di bagian 2. Hubungan linier antara elemen data suatu array linier merefleksikan hubungan fisik data yang tersimpan dalam memori. Hal ini memudahkan dalam menghitung alamat elemen data array. Sebaliknya Array mempunyai kelemahan, misalnya, relatif terlalu mahal untuk menyisipkan dan mengahapus elemen dari suatu array. Karena array biasanya menempati suatu blok memori, sangat sulit untuk melipat gandakan atau menjadikan 3 kali lipat ukuran array pada waktu diperlukan. Oleh karena itu array disebut juga dengan struktur data statis. Cara lain untuk menyimpan list dalam memori adalah dengan menambah field ke dalam list sebagai pointer, yang berisi alamat dari elemen berikut dalam list. Elemen berikutnya dari suatu elemen tidak harus menempati lokasi memori yang berdekatan. Cara ini memudahkan dalam proses penyisipan dan penghapusan elemen dari list. Oleh karena itu jika diperlukan suatu aplikasi yang sering melakukan proses searching pada seluruh data agar dapat dilakukan proses penyisisipan dan penghapusan data ke dalam list, seperti pengolah kata, data sebaiknya tidak disimpan dalam array tetapi disimpan dalam list yang menggunakan pointer. Jenis struktur data berikut ini adalah list berkait (linked list). Suatu list berkait, atau list satu-arah adalah sekumpulan elemen data linier, yang disebut dengan simpul (node), urutan liniernya ditentukan oleh pointernya. Oleh karena itu setiap simpul dibagi menjadi 2 bagian, yaitu pertama berisi informasinya, dan bagian kedua yang berisi adalah field penghubung atau field pointer berikut, yang berisi alamat dari simpul berikutnya. Gambar 3.2 adalah diagram skematik dari suatu list berkait dengan 6 simpul, setiap simpul digambarkan memiliki 2 bagian. Sebelah kiri adalah adalah representasi dari bagian informasi dari simpul, yang dapat berupa keseluruhan record suatu item data, misalnya berisi data Nama, Alamat dan seterusnya. Bagian kanannya representasi dari field berikutnya simpul, yang digambarkan adanya anak panah yang menuju ke simpul berikutnya dalam list. Pointer dari simpul terakhir berisi nilai khusus, yang disebut dengan pointer null, yang merupakan alamat yang salah. Nama atau Start field pointer berikut dari simpul 3 x bagian informasi dari simpul 3 Gambar 3.2. list berkait dengan 6 simpul Dalam penggunaan praktis, angka 0 atau bilangan negatif digunakan untuk pointer null. Pointer null, dalam diagram disimbolkan dengan x, merupakan tanda akhir dari list. Suatu list berkait juga mempunyai variabel Kadwi Suharsono 51 Buku Ajar Struktur Data pointer, yang sering disebut dengan NAMA atau START, yang berisi alamat simpul pertama dari list; oleh karena itu dalam diagram terdapat panah dari Nama ke simpul pertama dari list. Pada kondisi tertentu, yaitu list tidak mempunyai simpul, atau listnya kosong, maka pointer NAMA atau START akan berisi pointer null. Contoh 3.1. Sebuah kamar rumah sakit berisi 12 tempat tidur, yang terisi 9 pasien, seperti yang tertera dalam gambar 3.3. Daftar pasien disusun berdasarkan nama secara alfabetis. Untuk itu diperlukan field pointer, NEXT. Di sini variabel START berisi 5, karena Arjuno adalah pasien menempati tempat tidur no 5. Arjuno memiliki pointer NEXT yang berisi 3. Karena Durno menempati tempat tidur no 3, maka Durno adalah pasien berikutnya Arjuno. Pointer NEXT-nya Durno berisi 11. Karena Fetruk menempati tempat tidur no 11, maka Fetruk adalah pasien berikutnya Durno. Dan seterusnya. Pointer simpul terakhir dalam list, Semar, berisi pointer Null, dengan simbol 0. Beberapa tanda panah diberikan untuk menunjukkan hubungan di antara simpul dalam list. START 5 Nobed Pasien Next 1 2 3 4 5 6 7 8 9 10 11 12 Kresno 7 Durno Mbilung Arjuno 11 12 3 Limbuk Gareng Semar 4 1 0 Fetruk Narodo 8 9 Gambar 3.3. List Berkait Pasien Representasi List Berkait dalam Memori Jika LIST adalah sebuah list berkait, maka LIST tersebut akan disimpan di memori seperti berikut ini. Pertama, LIST memerlukan 2 array linier, misalnya INFO dan LINK. Isi dari INFO[K] adalah bagian informasi dan isi LINK[K] adalah pointer ke simpul berikut dalam LIST. LIST juga memerlukan variabel START, yang berisi alamat dari simpul pertama dari LIST, dan jika INFO[K] berisi null, menunjukkan akhir dari list. Contoh berikut adalah list berkait yang menunjukkan bahwa simpul-simpul dari list tersebut tidak harus berada pada lokasi memori yang berdekatan, tetapi tetap dapat dikelola layaknya array linier. Kadwi Suharsono 52 Buku Ajar Struktur Data Contoh 3.2. Gambar 3.4 menggambarkan list berkait dalam memori, masing-masing simpul berisi karakter tunggal. Urutan list tersebut dapat ditelusuri sebagai berikut: START = 9, dan INFO[9] = N, merupakan karakter pertama LINK[9] = 3, dan INFO[3] = O, merupakan karakter kedua LINK[3] = 6, dan INFO[6] = □ (blank), merupakan karakter ketiga LINK[6] = 11, dan INFO[11] = E, merupakan karakter keempat LINK[11] = 7, dan INFO[7] = X, merupakan karakter kelima LINK[7] = 10, dan INFO[10]= I,merupakan karakter keenam LINK[10] = 4, dan INFO[4] = T,merupakan karakter ketujuh LINK[4] = 0, pointer null, merupakan simpul terakhir dari list. Jadi string karakternya adalah : NO EXIT START 9 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. INFO LINK O T 6 0 X 11 10 N I E 3 4 7 Gambar 3.4. List Berkait di memori Contoh 3.3. Gambar 3.5 menggambarkan 2 nilai matakuliah Algoritma, ALG, dan Geometri, GEOM disimpan di memori dalam 1 array linier TEST dan LINK. Nama matakuliah juga dijadikan variabel pointer. Pada gambar tersebut, ALG berisi 11, merupakan simpul pertama dari list ALG, dan GEOM berisi 5, merupakan simpul pertama dalam list GEOM. Dengan mengikuti pointernya dapat diketahui isi nilai dari matakuliah ALG adalah: 88,74, 93, 82 dan isi nilai dari matakuliah GEOM adalah: 84,62, 74, 100, 74, 78 Kadwi Suharsono 53 Buku Ajar Struktur Data ALG 11 GEOM 5 TEST 1. 2. 74 3. 4. 82 5. 84 6. 78 7. 74 8. 100 9. 10. 11. 88 12. 62 13. 74 14. 93 15. 16. LINK 14 Simpul 2 dari ALG 0 12 0 8 13 Simpul 4 dari ALG Simpul 1 dari GEOM 2 7 6 4 Simpul 1 dari ALG Simpul 2 dari GEOM Simpul 3 dari GEOM Simpul 3 dari ALG Gambar 3.5. Dua List Berkait Contoh 3.4. Sebuah perusahaan mempunyai 4 broker, dan masing-masing broker mempunyai daftar pelanggannya. Data tersebut diorganisasikan seperti yang terlihat pada gambar 3.6. Dalam hal ini daftar nama pelanggan dari keempat broker disimpan dalam array Pelanggan yang sama, dan array LINK berisi pointer dari simpul berikutnya dalam list. Terdapat juga array Broker, yang berisi list broker dan array pointer POINT, POINT[K] menunjuk awal dari list Pelanggan dari Broker[K]. Oleh karena itu, daftar Pelanggan Bimo adalah Gatotkoco, Srikandi, Vibisana, Kunti. Daftar pelanggan Kresno adalah Hanoman, Madri, Emban dan daftar nama Pelanggan Narodo adalah Togog, Janoko, Arimbi, Rahwana, Widura sedangkan Hanggodo tidak mempunyai daftar Pelanggan, karena isi POINT-nya adalah pointer null atau 0. Kadwi Suharsono 54 Buku Ajar Struktur Data 1. 2. 3. 4. Broker Bimo Kresno Hanggodo Narodo Point 12 3 0 9 Pelanggan 1. Vibisana 2. 3. Hanoman 4. Kunti 5. 6. Emban 7. 8. Rahwana 9. Togog 10. Janoko 11. 12. Gatotkoco 13. 14. Madri 15. Widura 16. 17. Srikandi 18. 19. Arimbi 20. LINK 4 14 0 0 15 10 19 17 6 0 1 8 Gambar 3.6. List Berkait dengan Pointer Bagian informasi dari suatu simpul mungkin berupa record. Dalam hal ini, maka data harus disimpan dalam record, seperti contoh berikut: Contoh 3.5. Data karyawan dari sebuah perusahaan terdiri dari 9 orang yang berisi data: Nama, NIP, Jenis Kelamin, Gaji bulanan Secara umum, diperlukan 4 array linier, yaitu: Nama, NIP, Kelamin, Gaji untuk dapat menyimpan data pegawai tersebut. Gambar 3.7 menunjukkan bagaimana data tersebut disimpan di memori dalam struktur list berkait dengan diurutkan berdasarkan nama secara alfabetis, dengan menggunakan array tambahan LINK. LINK digunakan untuk menghubungkan antar simpul dalam list. Variabel START digunakan untuk menunjuk ke record pertama dari list. Kadwi Suharsono 55 Buku Ajar Struktur Data START 6 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Nama NIP Kelamin Gaji LINK Durno Kresno Gatotkoco 192-38-7282 165-64-3351 175-56-2251 Pria Pria Pria 22800 19000 27200 12 7 14 Bismo Limbuk 178-52-1065 181-58-9939 Pria Wanita 14700 16400 9 10 Cakil Rahwono 177-44-4557 135-46-6262 Pria Pria 19000 15500 2 0 Emban 168-56-8113 Wanita 34200 4 Hanoman 208-56-1654 Pria 22800 3 Gambar 3.7. List Berkait dengan Record Traversing Sebuah List Berkait. List berkait LIST disimpan di memori dalam array linier INFO dan LINK dengan variabel START, yang menunjuk simpul pertama dalam list, dan NULL mengindikasikan akhir dari list. Akan dilakukan operasi Traversing pada list agar setiap simpul dapat diproses. Algoritma traversing berikut menggunakan variabel PTR yang menunjuk simpul yang sedang diproses. Oleh karena itu, LINK[PTR] menunjuk pada simpul yang sedang diproses. Jadi, perintah PTR := LINK[PTR] adalah memindahkan pointer ke simpul berikutnya dalam list, seperti yang tergambar dalam gambar 3.8. PTR Gambar 3.8. Proses memindahkan Pointer Algoritma detilnya adalah sebagai berikut. Inisialisasi nilai PTR dengan nilai START. Kemudian proses INFO[PTR], yaitu informasi dari simpul yang pertama dalam list. Mutakhirkan nilai PTR dengan perintah PTR := LINK[PTR] agar PTR pindah ke simpul kedua. Kemudian proses INFO [PTR] yang merupakan informasi dari simpul kedua dalam list. Mutakhirkan lagi nilai PTR dengan perintah PTR := LINK[PTR], dan proses INFO[PTR], yang merupakan informasi dari simpul ketiga. Dan seterusnya. Lanjutkan sampai PTR = NULL, yang merupakan tanda akhir list. Algortima lengkapnya adalah sebagai berikut. Kadwi Suharsono 56 Buku Ajar Struktur Data Algoritma 3.1. (Traversing List Berkait) LIST adalah list berkait yang disimpan di memori. Algoritma ini adalah operasi traversing pada LIST, melakukan operasi PROSES untuk setiap elemen dalam LIST. Variabel PTR menunjuk simpul yang sedang diproses. 1. PTR := START [Inisialisasi pointer PTR]. 2. Ulangi langkah 3 dan 4 selama PTR ≠ NULL. 3. Lakukan PROSES pada INFO[PTR]. 4. PTR := LINK[PTR] [PTR berpindah ke simpul berikut.] [Akhir dari perulangan.] 5. Selesai. Perhatikan persamaan antara algoritma 3.1 dengan 2.1, yang melakukan operasi traversing pada array linier. Persamaannya adalah karena keduanya merupakan struktur data linier, di mana berisi elemen yang mempunyai urutan. Contoh 3.6 Procedure berikut mencetak informasi setiap simpul dari list berkait. Karena melakukan operasi traversing, maka mirip dengan algoritma 3.1. PRINT(INFO, LINK, START) Procedure berikut mencetak informasi setiap simpul dalam list 1. PTR := START. 2. Ulangi langkah 3 dan 4 selama PTR NULL. 3. Cetak: INFO[PTR]. 4. PTR := LINK[PTR] [Mutakhirkan pointer.] [Akhir dari Perulangan.] 5. Selesai. Contoh 3.7. Procedure berikut menghitung nilai NUM, yang merupakan jumlah elemen dalam list. COUNT(INFO, LINK, START, NUM) 1. NUM := 0. [Inisialisasi pencacah.] 2. PTR := START. [Inisialisasi Pointer.] 3. Ulangi langkah 4 dan 5 selama PTR ≠ NULL. 4. NUM := NUM + 1. 5. PTR := LINK[PTR] [Mutakhirkan pointer.] [Akhir dari Perulangan.] 6. Selesai. Procedure untuk menghitung jumlah elemen dalam list tersebut juga mirip dengan algoritma 3.1. Perbedaannya adalah ada diperlukan proses inisialisasi untuk variabel NUM sebelum melakukan operasi traversing. Kadwi Suharsono 57 Buku Ajar Struktur Data Searching Sebuah List Berkait Sebuah list berkait LIST disimpan di memori seperti yang telah dibahas di bagian sebelumnya, yaitu Representasi list di memori dan traversing sebuah list berkait. Suatu ITEM tertentu akan dicari dalam list. Terdapat 2 algoritma untuk menemukan lokasi simpul, LOC dalam list, yang pertama kali ditemukan. Algoritma pertama mengasumsikan data dalam list tidak terurut, sedangkan yang algortima kedua data dalam list sudah terurut. Jika ITEM adalah nilai kunci, dan dicari dalam file untuk mendapatkan record yang berisi ITEM, maka ITEM akan muncul hanya 1 kali. List yang Tidak Terurut. Data yang tersimpan dalam LIST adalah tidak terurut. Akan dicari ITEM dalam LIST dengan menggunakan operasi traversing dengan menggunakan variabel pointer PTR dan membandingkan ITEM dengan isi dari INFO [PTR] atau setiap simpul, satu per satu. Sebelum memutakhirkan isi variabel pointer PTR dengan PTR := LINK[PTR] diperlukan 2 pengujian. Pertama adalah menguji apakah sudah di akhir list, dengan kondisi PTR = NULL, kemudian diuji juga apakah INFO[PTR] = ITEM Kedua pengujian tersebut tidak dapat dilakukan secara bersamaan, karena INFO[PTR] tidak dapat didefinisikan jika PTR = NULL. Oleh karena itu digunakan pengujian pertama untuk mengendalikan pelaksanaan perulangan, dan pengujian kedua diletakkan di dalam perulangan. Algoritma lengkapnya sebagai berikut: Algoritma 3.2. SEARCH(INFO, LINK, START, ITEM, LOC) LIST adalah list berkait yang disimpan di memori. Algoritma ini adalah mencari lokasi LOC suatu simpul, di mana ITEM muncul pertama kali dalam LIST, atau LOC = NULL 1. PTR := START. 2. Ulangi langkah 3 selama PTR ≠ NULL: 3. Jika ITEM = INFO[PTR], maka: LOC := PTR, dan Selesai. Lainnya: PTR:=LINK[PTR]. [PTR berpindah ke simpul berikut] [Akhir dari struktur Jika] [Akhir dari perulangan] 4. LOC := NULL. [Search tidak berhasil] 5. Selesai. Kompleksitas algoritma search list sama dengan algoritma search pada array linier. Waktu pelaksanaan untuk kondisi terjelek adalah sama deKadwi Suharsono 58 Buku Ajar Struktur Data ngan jumlah elemen dalam listnya, dan rata-rata waktu search-nya adalah n/2. Contoh 3.8. Perhatikan file personal seperti yang terlihat dalam gambar 3.7. modul berikut membaca NIP: NNN dari seorang karyawan, dan mengubah Gajinya dengan penambahan 5%. 1. Baca: NNN. 2. Panggil SEARCH(NIP, LINK, START, NNN, LOC). 3. Jika LOC ≠ NULL, maka: Gaji[LOC] := Gaji[LOC] + Gaji[LOC] * 0.05. Lainnya: Cetak: NNN tidak terdapat dalam file. [Akhir dari struktur Jika.] 4. Selesai. List Sudah Terurut Data yang tersimpan dalam LIST sudah terurut. Akan dicari ITEM dalam LIST dengan traversing list menggunakan variabel pointer PTR dan membandingkan ITEM dengan isi INFO[PTR] pada setiap simpul dalam LIST. Kompleksitas dari algoritma ini tetap sama dengan algoritma pencarian linier; kondisi terjelek adalah setara dengan jumlah elemen dalam LIST dan rata-rata pencariannya kira-kira n/2. Perlu diingat bahwa pencarian linier dapat menggunakan pencarian biner yang memerlukan log2 n. Algoritma pencarian biner tidak dapat diaplikasikan pada list berkait yang terurut, karena tidak tersedia indeks untuk elemen tengah dari list. Algoritma 3.3. SEARCHSL(INFO, LINK, START, ITEM, LOC) LIST adalah list terurut yang disimpan di memori. Algoritma ini adalah mencari lokasi LOC suatu simpul, di mana ITEM muncul pertama kali dalam LIST, atau LOC = NULL 1. PTR := START. 2. Ulangi langkah 3 selama PTR ≠ NULL: 3. Jika ITEM < INFO[PTR], maka: PTR := LINK[PTR]. [PTR sekarang menunjuk ke simpul berikutnya] Lainnya Jika ITEM = INFO[PTR], maka: LOC := PTR, dan Selesai. [Pencarian berhasil] Lainnya: LOC := NULL, dan Selesai. [ITEM sudah melebihi INFO[PTR].] [Akhir dari struktur Jika] [Akhir dari perulangan] 4. LOC := NULL. [Search tidak berhasil] 5. Selesai. Kadwi Suharsono 59 Buku Ajar Struktur Data Contoh 3.9. Perhatikan lagi file personal pada gambar 3.7. Modul berikut membaca nama PEG dari pegawai dan memberikan tambahan 5% untuk gajinya. (Bandingkan dengan contoh 3.8) 1. Baca: PEG. 2. Panggil SEARCHSL(NAMA, LINK, START, PEG, LOC). 3. Jika LOC ≠ NULL, maka: Gaji[LOC] := Gaji[LOC] + Gaji[LOC] * 0.05. Lainnya: Cetak: PEG tidak terdapat dalam list. [Akhir dari struktur Jika.] 4. Selesai . Alokasi Memori dan Koleksi Memori Sisa Pengelolaan list berkait di memori akan terjadi penyisipan simpul baru ke dalam list, sehingga diperlukan beberapa mekanisme untuk menyediakan memori yang sedang tidak terpakai, dapat digunakan untuk simpul baru. Beberapa mekanisme diperlukan agar lokasi memori yang sudah dihapus menjadi memori yang tersedia untuk penggunaan berikutnya. Bersamaan dengan adanya list berkait di memori, suatu list khusus dibuat, yang berisi lokasi memori yang sudah tidak terpakai. List ini mempunyai pointer sendiri, yang disebut dengan list dari ruang yang kosong. List berkait yang digunakan, akan berhubungan dengan list dari memori yang kosong, sehingga setiap kali terjadi penyisipan simpul baru ke dalam list atau penghapusan suatu simpul dari list akan melibatkan list dari memori yang kosong ini. Memori yang kosong ini membentuki list berkait dengan menggunakan variabel pointer AVAIL. Contoh 3.10 Data List pasien yang terdapat dalam contoh 3.1 disimpan dalam array linier NOBED dan NEXT. Memori yang kosong dalam array linier NOBED dikaitkan seperti yang tertera dalam gambar 3.9. Perhatikan bahwa NOBED[10] adalah no bed yang pertama kali tersedia, NOBED[2] adalah no bed yang kedua tersedia, dan NOBED[6] adalah no bed terakhir yang tersedia, karena NOBED[6] berisi pointer null pada field NEXT-nya, NEXT[6] = 0. Kadwi Suharsono 60 Buku Ajar Struktur Data START AVAIL 5 10 Nobed Pasien Next 1 2 3 4 5 6 7 8 9 10 11 12 Kresno 7 6 Durno Mbilung Arjuno 11 12 3 0 4 1 0 2 8 9 Limbuk Gareng Semar Fetruk Narodo Gambar 3.9. List dari Memori Sisa Contoh 3.11 (a) Memori yang tersedia pada array linier TEST pada gambar 3.5 dapat dikaitkan seperti tertera pada gambar 3.10. masing-masing list, yaitu ALG dan GEOM menggunakan list AVAIL. Karena AVAIL = 9, maka TEST[9] adalah simpul bebas pertama dalam list AVAIL. Karena LINK[AVAIL] = LINK[9] = 10, maka TEST[10] adalah simpul bebas kedua dalam list AVAIL. Dan seterusnya. (b) Perhatikan file karyawan pada gambar 3.7. Memori yang tersedia pada array linier NAMA dapat dikaitkan seperti yang tertera pada gambar 3.11. perhatikan bahwa list memori bebasnya adalah NAMA[8], NAMA[11], NAMA[13], NAMA[5] dan NAMA[1]. TEST ALG 11 GEOM 5 AVAIL 9 1. 2. 74 3. 4. 82 5. 84 6. 78 7. 74 8. 100 9. 10. 11. 88 12. 62 13. 74 14. 93 15. 16. LINK 16 14 1 0 12 0 8 13 10 3 2 7 6 4 0 15 Gambar 3.10. List Memori Sisa. Kadwi Suharsono 61 Buku Ajar Struktur Data (c) Memori yang tersedia dalam array linier PELANGGAN pada gambar 3.6 dapat dikaitkan seperti yang tertera pada gambar 3.12. Perlu ditegaskan di sini bahwa 4 list yang ada menggunakan list AVAIL untuk penambahan PELANGGAN baru. START 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 6 AVAIL 8 Nama NIP Kelamin Gaji Durno Kresno Gatotkoco 192-38-7282 165-64-3351 175-56-2251 Pria Pria Pria 22800 19000 27200 Bismo Limbuk 178-52-1065 181-58-9939 Pria Wanita 14700 16400 Cakil Rahwono 177-44-4557 135-46-6262 Pria Pria 19000 15500 Emban 168-56-8113 Wanita 34200 Hanoman 208-56-1654 Pria 22800 LINK 0 12 7 14 1 9 10 11 2 0 13 4 5 3 Gambar 3.11. List Memori Sisa 1. 2. 3. 4. Broker Bimo Kresno Hanggodo Narodo Avail 11 Point 12 3 0 9 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Pelanggan Vibisana LINK 4 16 Hanoman Kunti 14 0 20 0 13 15 10 19 18 17 0 6 0 5 1 5 8 7 Emban Rahwana Togog Janoko Gatotkoco Madri Widura Srikandi Arimbi Gambar 3.12. List Memori Sisa dari List Pointer Contoh 3.12. Kadwi Suharsono 62 Buku Ajar Struktur Data Misalnya LIST(INFO, LINK, START,AVAIL) mempunyai lokasi memori sebanyak 10, n = 10 simpul. Jika LIST diinisialisasi, artinya LIST kosong, maka isi dari list AVAIL adalah seperti yang terlihat pada gambar 3.12. Perhatikan bahwa START = 0, karena LIST-nya kosong. INFO START 0 AVAIL 1 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. LINK 2 3 4 5 6 7 8 9 10 0 Gambar 3.13. List Memori Sisa pada Inisialisasi List Operasi Penyisipan ke dalam suatu List Berkait LIST merupakan list berkait yang mempunyai simpul berurutan A dan B, seperti yang tertera dalam gambar 3.14(a). misalkan akan disisipkan simpul N yang akan diletakkan di antara simpul A dengan simpul B. Diagram skematik proses penyisipan tersebut tertera pada gambar 3.14(b). Dalam hal ini simpul A menunjuk ke SImpul N, dan Simpul N menunjuk ke simpul B, yang sebelumnya ditunjuk oleh simpul A. Pada gambar 3.14 tersebut tidak terlihat munculnya simpul baru tersebut berasal dari list AVAIL. Untuk memudahkan operasi, simpul pertama dari list AVAIL akan digunakan untuk simpul baru, N. Diagram skematik yang lebih detil dari operasi penyisipan tersebut adalah seperti yang tertera pada gambar 3.15. terdapat 3 pointer yang berubah: (1) Field pointer dari simpul A sekarang menunjuk ke simpul baru N, yang sebelumnya ditunjuk oleh pointer AVAIL (2) AVAIL sekarang menunjuk simpul kedua dalam list AVAIL, yang sebelumnya ditunjuk oleh simpul N (3) Field pointer dari simpul N sekarang menunjuk ke simpul B, yang sebelumnya ditunjuk oleh simpul A. Kadwi Suharsono 63 Buku Ajar Struktur Data START Simpul A Simpul B x (a) Sebelum penyisipan START Simpul A Simpul B x Simpul N (b) Setelah penyisipan Gambar 3.14. Penyisipan sebuah Simpul pada List Terdapat 2 hal yang bersifat khusus. Jika simpul baru N adalah simpul pertama dalam LIST, maka START akan menunjuk ke N, dan jika simpul baru N adalah simpul terakhir dari LIST, maka N akan mempunyai pointer Null. List Data START Simpul A Simpul B x AVAIL Simpul N x List memori kosong Gambar 3.15. Penggunaan AVAIL untuk penyisipan List. Contoh 3.13 (a) Perhatikan gambar 3.9, List Pasien yang urut berdasarkan nama. Jika terdapat pasien baru, Hanoman, maka Hanoman akan diletakkan pada no bed 10, bed yang pertama tersedia Hanoman akan diletakkan dalam list di antara Gareng dan Kresno Terdapat perubahan 3 pointer, yaitu: 1. NEXT[8] := 10 [Sekarang Gareng menunjuk Hanoman] 2. NEXT[10] := 1. [Sekarang Hanoman menunjuk Kresno] 3. AVAIL := 2. Kadwi Suharsono 64 Buku Ajar Struktur Data (b) Perhatikan gambar 3.12, list broker dan Pelanggan. Karena list PELANGGAN tidak diurutkan, dapat diasumsikan bahwa PELANGGAN baru akan ditambahkan di awal list. Jika terdapat penambahan PELANGGAN baru Gareng, dari broker Kresno, maka: Gareng diletakkan pada array linier PELANGGAN[11], simpul pertama yang tersedia Gareng disisipkan sebelum Hanoman, yang sebelumnya adalah pelanggan pertama dari broker Kresno Terdapat perubahan 3 pointer, yaitu: 1. POINT[2] = 11. [Sekarang list Kresno diawalidengan Gareng] 2. LINK[11] = 3. [Sekarang Gareng menunjuk Hanoman] 3. AVAIL = 18. [Sekarang AVAIL menunjuk ke simpul tersedia, kedua] (c) Elemen data A, B,C, D, E, dan F disisipkan ke dalam list kosong, seperti yang terlihat pada gambar 3.13. Jika diasumsikan bahwa simpul baru selalu diletakkan di awal list, maka setelah penyisipan, F akan menunjuk ke E, D menunjuk ke D, D menunjuk ke C, C menunjuk ke B dan B menunjuk ke A. A akan berisi pointer null. AVAIL akan berisi 7, yaitu simpul pertama yang tersedia setelah terjadi 6 penyisipan. START = 6, lokasi dari simpul pertama dalam list, F. Gambar 3.16 adalah list baru tersebut. INFO START 6 AVAIL 7 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. A B C D E F LINK 0 1 2 3 4 5 8 9 10 0 Gambar 3.16. Penyisipan Elemen ke dalam List Kosong Algoritma Penyisipan Algoritma penyisipan simpul ke dalam list berkait bisa terjadi dalam beberapa situasi. Hanya 3 saja yang akan dibahas. Pertama adalah penyisipan terjadi di awal list, kedua adalah penyisipan setelah simpul tertentu, ketiga adalah penyisipan simpul ke dalam list yang terurut. Semua algoritma diasumsikan bahwa list berkait di memori membentuk LIST(INFO, LINK, START, AVAIL) dan variabel ITEM berisi informasi yang akan disisipkan ke dalam list. Kadwi Suharsono 65 Buku Ajar Struktur Data Karena algoritma penyisipan ini akan menggunakan simpul yang ada di AVAIL, semua algoritma akan meliputi langkah-langkah berikut: 1. Memeriksa apakah tersedia ruang di list AVAIL. Jika tidak, kondisinya adalah AVAIL = NULL, maka algoritma akan mencetak pesan: OVERFLOW 2. Menghapus simpul pertama dari list AVAIL. Menggunakan variabel BARU untuk mencatat alamat simpul baru, langkah ini dapat dilakukan dengan menggunakan pasangan perintah berikut: BARU := AVAIL, AVAIL := LINK[AVAIL] 3. Mengisikan informasi baru ke dalam simpul baru atau dengan INFO[BARU] := ITEM Diagram skematik dari perintah tersebut tertera pada gambar 3.17 BARU List memori kosong ITEM x AVAIL 3.17. Diagram Skematik Penggunaan List AVAIL Penyisipan di awal List Jika list berkait yang digunakan adalah tidak terurut, dan tidak ada alasan untuk menyisipkan simpul baru di mana saja dalam list, maka cara paling mudah adalah menyisipkan simpul baru tersebut di awal list, seperti yang terlihat pada algoritma berikut ini: Algoritma 3.4: INSFIRST(INFO, LINK, START, AVAIL, ITEM) Algoritma ini menyisipkan ITEM sebagai simpul pertama dari list. 1. [OVERFLOW?] Jika AVAIL = NULL, maka: Cetak:OVERFLOW, dan Selesai. 2. [Hapus elemen pertama dari list AVAIL] BARU := AVAIL dan AVAIL := LINK[AVAIL]. 3. INFO[BARU] := ITEM. [Salin data baru ke dalam simpul baru.] 4. LINK[BARU] := START. [Simpul baru sekarang menunjuk ke list awal] 5. START := BARU. [Ubah START agar menunjuk ke simpul baru.] 6. Selesai. Langkah 1 sampai 3 telah dibahas sebelumnya, dan diagram skematik dari langkah 2 dan 3 tertera pada gambar 3.17, sedangkan diagram skematik langkah 4 dan 5 tertera pada gambar 3.18. Kadwi Suharsono 66