• Tidak ada hasil yang ditemukan

Materi | Catatan Kuliah bab5 linked list

N/A
N/A
Protected

Academic year: 2017

Membagikan "Materi | Catatan Kuliah bab5 linked list"

Copied!
47
0
0

Teks penuh

(1)

83

L

INKED

L

IST

5.1 STRUKTUR BERKAIT

Pada pembicaraan kita dalam Bab 1, telah disinggung sekilas tentang sejenis struktur yang dibentuk dengan cara mengaitkan struktur yang lebih sederhana. Perhatikan Gambar 5.1.

A 50 B

100

POINTER

50

Alamat memori

POINTER

Gambar 5.1.

Struktur berkait

(2)

84

Kali ini kita bahas secara sederhana bagaimana operasi penyisipan atau insertion dan operasi penghapusan atau deletion bekerja pada struktur berkait. Kita mulai dengan struktur singly linked-list atau singkatnya linked list. Linked-list, yang kerap kali disebut pula one-way List, adalah koleksi linear dari elemen data yang disebut simpul atau node. Cara melinearkan urutan, adalah dengan menggunakan penuding atau pointer. Dalam hal ini, setiap simpul terdiri atas dua bagian. Bagian pertama berisi informasi data tersebut, sedangkan bagian kedua merupakan field, link, atau nextpointer. Link inilah yang menghubungkan satu elemen data ke elemen data lainnya, sehingga urutan elemen data tersebut membentuk suatu linear list. Field link ini berisi alamat dari simpul berikutnya dalam list. Ia bernilai 0 bila link tersebut tidak menuding ke data (simpul) lainnya. Penuding ini disebut penuding nol.

Gambar 5.2 merupakan diagram secara skematik dari sebuah linked list dengan 6 buah simpul. Setiap Simpul digambarkan sebagai dua kotak, Kotak kiri menyajikan bagian informasi (dapat berupa sebuah field NAMA, ataupun field NOMOR-POKOK, ataupun dapat pula berupa sebuah record). Kotak kanan menyajikan field nextpointer.

Dari kotak kanan ini tergambar panah mengarah ke simpul berikut. Penuding nol adalah penuding ke simpul akhir dari list yang disajikan dengan tanda X.

Nextpointer field of third node

x

Information part of third node

Gambar 5.2

Linked list dengan 6 simpul (nodes)

Linked list juga mengandung sebuah variabel penuding list, yang biasanya diberi nama START, yang berisi alamat dari simpul pertama dalam list. Di sini tergambar panah dari START mengarah ke simpul pertama tersebut.

Hal khusus dapat terjadi, yakni list tidak mengandung sebuah simpulpun. List semacam itu disebut list hampa atau list nol. List ini disajikan dengan menempatkan penuding nol pada variabel START.

Contoh 5.1

(3)

85 para pasien tersebut diurut secara alfabetik. Untuk itu kita buat sebuah linked list, dengan penuding NEXT.

Variable START kita gunakan untuk menyatakan lokasi pasien pertama dalam list. Jadi START berisi 5, karena pasien pertama tersebut, yakni Adam, menempati tempat tidur nomor 5.Selanjutnya penuding dari Adam bernilai 3, karena pasien kedua dalam list adalah Deni, menempati tempat tidur nomor 3, demikian seterusnya.

Akhirnya, untuk pasien terakhir, Samuel, penudingnya merupakan penuding nol (dinyatakan dengan bilangan 0).

Gambar 5.3.

Sortir data dalam linked list

5.2 PENYAJIAN LINKED LIST DALAM MEMORI

(4)

86

bagian akhir dari LIST, nextpointer bernilai NULL. Apabila tidak disebutkan, nilai NULL adalah 0, dan nilai dari subscript larik INFO serta LINK selalu diambil positif.

Contoh linked list berikut memperlihatkan bahwa elemen tak perlu menempati posisi yang berdampingan pada larik INFO serta LINK. Juga lebih dari satu linked list dapat disimpan dalam kedua larik yang sama tersebut di atas.

Contoh 5.2

Gambar 5.4 menggambarkan suatu linked list dalam memori. Data dalam larik INFO(K) adalah sebuah karakter tunggal. Dengan setiap kali kita mengubah nilai larik LINK(K) serta START, kita dapat membentuk linked list lain, yang kalau dibaca elemennya akan merupakan sebuah string atau untai.

String yang dinyatakan oleh Gambar 5.4 tersebut adalah NO EXIT.

START = 9, jadi INFO(9) = “N” adalah karakter pertama yang dikunjungi, LNK(9) = 3, jadi INFO(3) = “O” adalah karakter kedua,

LNK(3) = 6, jadi INFO(6) = “ ” (blank) adalah karakter ketiga, LNK(6) = 4, jadi INFO(4) = “E” adalah karakter keempat, LNK(4) = 7, jadi INFO(7) = “X” adalah karakter kelima, LNK(7) = 1, jadi INFO(1) = “I” adalah karakter keenam, LNK(1) = 5, jadi INFO(5) = “T” adalah karakter ketujuh, LNK(5) = 0, null pointer, list berakhir.

1

2

3

4

5

6

7

8

9

INFO LINK

O

T

X I

N

START

9

0

4 6

1

3 5

E 7

(5)

87 Contoh 5.3

Pada contoh ini diperlihatkan dua buah linked list, ALG dan GEOM, yang berturut-turut berisi nilai testing mata kuliah Algoritma dan Geometri, dapat tersimpan bersama dalam larik TEST dan LINK yang sama. Perhatikan bahwa nama dari list sekaligus digunakan sebagai variabel penuding.

Di sini penuding ALG berisi nilai 11, yakni lokasi dari simpul pertama list ALG, sedangkan penuding GEOM berisi nilai 5, yakni lokasi simpul pertama dari list GEOM. Mengikuti penuding tersebut, dapat dilihat bahwa list ALG berisi nilai-nilai :

88 74 93 82 dan list GEOM berisi nilai-nilai

84 62 74 100 74 78

11

5

ALG

GEOM

1 2 3 4 5 6 7 8 9 10 11 12

TEST LINK

13 14 15 16

74

82 84 78 74 100

88 62 74 93

16 14 1 0 12

0 8 13 10 3 2 7 6 4 0 15

(6)

88

Contoh 5.4

Lihat Gambar 5.6. Pandang suatu agen penjualan yang mempunyai 4 orang broker (perantara). Setiap broker mempunyai list customer (pelanggan) masing-masing. Data dapat diorganisir seperti pada Gambar 5.6. Di sini keempat list pelanggan digabung dalam satu linked list dengan larik CUSTOMER berisi nama pelanggan dan larik LINK merupakan nextpointer.

Nama broker ditempatkan dalam larik BROKER, dan digunakan pula variabel penuding dalam bentuk larik POINT, sedemikian sehingga POINT(K) menuding ke lokasi dari simpul pertama BROKER(K). Dapat kita lihat bahwa broker Bond mempunyai pelanggan berturut-turut Grant, Scott,Vito, Katz

Di sana, Tall tidak mempunyai pelanggan, karena POINT(3)=0. Kita dapat berbicara secara lebih umum, yakni bahwa bagian informasi dari setiap simpul merupakan sebuah record, dengan lebih dari satu satuan data. Dalam kasus ini, kita harus menyimpan data tersebut dalam bentuk struktur record ataupun dalam bentuk koleksi larik sejajar. Perhatikan contoh berikut :

Contoh 5.5

Lihat Gambar 5.8. Pandang berkas personalia dari sebuah perusahaan kecil, yang terdiri dari record 9 orang pegawai, dengan field NAMA, SSN (Social Security Number), SEX dan Gaji per bulan (monthly salary) Gambar tersebut memperlihatkan bagaimana berkas diorganisir sebagai linked list yang terurut (alfabetik), dengan menempatkan informasi dalam empat buah larik sejajar NAMA, SSN, SEX, dan SALARY, serta menggunakan pula larik LINK sebagai nextpointer, dan variabel START yang menuding record pertama. Di sana 0 digunakan sebagai penuding nol.

5.3 KUNJUNGAN LINKED LIST

Pandang sebuah linked list, LIST yang tersimpan dalam memori berupa larik INFO dan LINK, dilengkapi dengan variabel penuding START, yang berfungsi menuding lokasi simpul pertama dari list, dan NULL yang digunakan untuk menyatakan berakhirnya list.

(7)

89 0 14 12 0 20 9 13 10 19 18 17 1 2 3 4 15 BROKER LINK Hunter Katz POINT Evans COSTUMER 0 3 Bond Kelly Hall Nelson 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Adams Scott Weston McBride Grant Jones Teller Rogers Vito 4 16 0 6 0 5 1 2 8 7

Gambar 5.6.

Linked list empat orang broker

Statement : PTR := LINK(PTR)

(8)

90

Gambar 5.7

Record dalam linked list

ALGORITMA

1. PTR : = START 2. Kerjakan

langkah 3 dan 4

dalam hal

PTR <> NULL 3. Proses INFO(PTR)

(9)

91 6 START 0 Kelly 7 12 Green 14 Lewis Cohen Evans 1 9 10 2 0 13 4 1 2 3 4 5 6 7 8 9 10 11 12 11 NAMA LINK

Gambar 5.8 Kunjungan dalam linked list

Davis Brown Rubin 13 14 Harris 165-64-3351 175-56-2251 181-58-9939 177-44-4557 168-56-8113 SSN 192-38-7282 178-52-1065 135-46-6262 208-56-1654 Female Male Male Male Female SEX Male Male Male Male 19,000 27,200 16,400 19,000 34,200 SALARY 22,800 14,700 15,500 22,800 5 3

Proses yang dilakukan terhadap INFO(PTR) dapat dalam berbagai bentuk. Misalnya proses mencetak, ataupun yang lainnya lagi. Silakan Anda memodifikasi algoritma di atas untuk dapat mencetak semua informasi dalam list. Juga pikirkan bagaimana menghitung banyaknya elemen (simpul) dari list.

5.4 PENCARIAN (SEARCHING) DALAM LINKED LIST

Pandang linked list, LIST, yang disajikan dalam memori seperti cara yang lalu. Misalkan sekarang diberikan sebuah informasi tertentu ITEM. Diminta untuk menentukan lokasi dari simpul list, yang pertama ditemui memuat informasi ITEM tersebut.

Di sini kita akan membahas dua algoritma pencarian, untuk maksud di atas. Algoritma yang pertama tidak menuntut bahwa list telah terurut, sementara algoritma kedua menuntutnya.

(10)

92

5.4.1 CARI DALAM LIST TIDAK TERURUT

Untuk list yang tidak terurut, kita dapat melakukan proses cari dengan cara yang cukup sederhana. Cara tersebut adalah melakukan traversal simpul list, sambil setiap kali memeriksa apakah informasi dalam simpul yang tengah dikunjungi tersebut sama dengan ITEM.

Jadi dalam algoritma ini, kita memerlukan 2 buah pemeriksaan pada setiap putaran. Yang pertama adalah memeriksa apakah kita telah sampai pada akhir dari list, yakni dengan memeriksa apakah PTR = NULL. Yang kedua adalah memeriksa apakah ITEM telah diketemukan lokasinya, yakni dengan memeriksa apakah INFO(PTR):=ITEM.

ALGORITMA

Kompleksitas waktu dari algoritma ini adalah sama seperti kompleksitas waktu dari algoritma cari linier terhadap larik. Di sini worst-case running time adalah sebanding dengan n, banyaknya elemen list. Sedangkan average-case mendekati n/2. Di sini dengan catatan, kondisi adalah ITEM muncul paling banyak satu kali, serta probabilitas kemunculan ITEM dalam setiap simpul adalah sama.

Contoh 5.6

Pandang berkas personalia pada Gambar 5.7 yang lalu. Modul berikut ini akan mencari lokasi pegawai dengan SSN = NNN dan kemudian menaikkan gajinya sebesar 5 persen.

SEARCH( I NFO, LI NK, START, I TEM, LOC) 1 PTR : = START

2 Ker j ak an

l angk ah 3

dal am hal

PTR <> NULL 3 J i k a I NFO( PTR) = I TEM mak a

LOC : = PTR

ex i t k al au buk an

PTR : = LI NK( PTR)

4 LOC : = NULL ( penc ar i an gagal ) 5 Ex i t

1 Bac a NNN

2 Panggi l Pr os edur

SEARCH( SSN, LI NK, START, NNN, LOC) 3 J i k a LOC <> NULL

mak a

SALARY( LOC) = 1. 05 * SALARY( LOC)

k al au t i dak

(11)

93

5.4.2 CARI DALAM LIST TERURUT

Untuk list yang terurut, kita dapat melakukan pencarian dengan cara yang hampir sama seperti dalam list yang tidak terurut. Cara tersebut adalah dengan melakukan traversal simpul list, sambil setiap kali memeriksa apakah informasi dalam simpul yang tengah dikunjungi tersebut, sama dengan ITEM. Karena terurutnya list, kita tidak perlu melakukan traversal sampai akhir dari list, walau ITEM tidak terdapat dalam list.

Begitu INFO(PTR) > ITEM, kita sudah boleh menghentikan pencarian kita. Jadi dalam algoritma ini, kita memerlukan 2 buah pemeriksaan pada setiap putaran. Yang pertama adalah memeriksa apakah ITEM sudah lebih besar dari INFO(PTR), yang berarti ITEM tidak terdapat dalam list, dan kita boleh menghentikan proses cari kita. Yang kedua adalah memeriksa apakah ITEM telah diketemukan lokasinya, yakni dengan memeriksa apakah INFO(PTR) := ITEM.

ALGORITMA

Kompleksitas waktu dari algoritma ini juga sama seperti kompleksitas waktu dari algoritma cari linear terhadap larik. Di sini worst-case running time adalah sebanding dengan n, banyaknya elemen list. Sedangkan average-case mendekati n/2.

Dapat dicatat bahwa untuk larik terurut, kita dapat menggunakan cari binar (binary search), yang waktu pelaksanaannya sebanding dengan log2n. Namun algoritma cari binar ini tidak dapat digunakan terhadap linked list terurut, karena kita tidak mempunyai cara untuk mengindeks elemen tengah dari list. Sifat ini adalah salah satu kelemahan pemakaian linked list sebagai sebuah struktur data.

SEARCH( I NFO, LI NK, START, I TEM, LOC) 1 PTR : = START

2 Ker j ak an

l angk ah 3

dal am hal

PTR <> NULL 3 J i k a I NFO( PTR) < I TEM

mak a

PTR : = LI NK( PTR)

bi l a t i dak

J i k a I TEM = I NFO( PTR)

mak a

LOC : = PTR Ex i t

k al au t i dak

LOCK : = NULL

Ex i t

(12)

94

Contoh 5.7

Pandang sekali lagi, berkas personalia pada Gambar 5.7 yang lalu. Modul berikut ini akan mencari lokasi pegawai dengan NAMA = EMP dan kemudian menaikkan gajinya sebesar 5 persen.

1. Baca EMP

2. Panggil prosedur SEARCH(NAMA, LINK, START, EMP, LOC) 3. Jika LOC <> NULL

Maka

SALARY(LOC) := 1.05 * SALARY(LOC)

kalau tidak

Tulis EMP tidak ada dalam Berkas

Di sini kita dapat menggunakan algoritma cari untuk list terurut, karena NAMA telah terurut alfabetik.

5.5 ALOKASI MEMORI : KOLEKSI SAMPAH

Ketika kita menyimpan linked list dalam memori, diasumsikan bahwa selalu dapat dilakukan penyisipan (insertion) simpul baru ke dalam list, serta penghapusan (deletion) simpul dari list.

Untuk itu kita memerlukan suatu mekanisme guna menyediakan memori bagi simpul baru, ataupun guna mengelola memori yang sementara ini tidak berguna karena adanya penghapusan simpul, untuk sewaktu-waktu dapat dipakai lagi.

Untuk itu, biasanya bersama-sama dengan linked list dalam memori, ditempatkan juga list khusus yang berisi sel memori yang tak digunakan. List ini yang dilengkapi penuding sendiri, disebut list dari ruang yang tersedia, atau free-storage list atau free-pool.

Pandang linked list yang ditempatkan sebagai larik sejajar seperti dibicarakan yang lalu, dan katakanlah dilakukan beberapa penyisipan dan penghapusan simpul. Sel memori dari larik, yang tak digunakan, dihimpun menjadi sebuah linked list lain yang menggunakan variabel penuding list berupa larik AVAIL. Karena itu free-storage list ini biasa disebut list AVAIL. Struktur data serupa ini acap kali dituliskan sebagai :

(13)

95 Contoh 5.8

Pandang daftar pasien pada contoh Gambar 5.3 yang lalu. Kali ini, daftar kita simpan dalam dua larik BED dan LINK. Di sini tempat tidur K dinyatakan sebagai BED(K). Maka ruang yang tersedia dalam larik BED tersebut dapat dikaitkan seperti pada Gambar 5.9.

Perhatikan bahwa BED(10) merupakan tempat tidur pertama yang tersedia, BED(2) adalah tempat tidur berikutnya, dan BED(6) merupakan yang terakhir tersedia. Karenanya BED(6) mempunyai field nextpointer nol atau LINK(6) = 0.

5 START PATIENT 3 4 6 BED NUMBER 1 2 3 4 5 6 7 8 9 10 11 12 12 10 9 8 1 11 12 3 4 0 8 9 1 7 Next 2 5 7 11 Kirk Dean Maxwell Adams Lane Green Samuels Fields Nelson

Gambar 5.9. Sel memori yang tidak digunakan 10 AVAIL 2 6 0 Contoh 5.9

(a) Ruang tersedia dalam larik TEST, pada Gambar 5.5, dapat dikaitkan seperti terlihat pada Gambar 5.10. Perhatikan bahwa masing-masing list ALG dan GEOM boleh menggunakan list AVAIL. Dapat dicatat bahwa AVAIL = 9, maka TEST(9) adalah simpul bebas yang pertama dalam list AVAIL tersebut. Karena LINK(AVAIL) = LINK(9) = 10, maka TEST(10) adalah simpul bebas kedua dalam AVAIL. Demikian selanjutnya.

(14)

96

NAME(5), dan NAME(1). Selanjutnya perhatikan nilai LINK yang secara bersama mendaftar ruang bebas untuk larik SSN, SEX dan SALARY.

11 5 ALG GEOM 1 2 3 4 5 6 7 8 9 10 11 12 TEST LINK 13 14 15 16 AVAIL 9 74 82 84 78 74 100 88 62 74 93 16 14 1 0 12 0 8 13 10 3 2 7 6 4 0 15

Gambar 5.10.

Koleksi memori kosong dari Gambar 5.5

(c) Ruang tersedia dalam larik CUSTOMER pada Gambar 5.6, dapat dikaitkan secara Gambar 5.12. Kita tekankan bahwa masing-masing dari keempat list dapat menggunakan list AVAIL untuk pelanggan baru.

Contoh 5.10

(15)

97 6 8 START AVAIL 0 Kelly 7 12 Green 14 Lewis Cohen Evans 1 9 10 2 0 13 4 1 2 3 4 5 6 7 8 9 10 11 12 11 NAMA LINK

Gambar 5.11 Koleksi memori kosong dari Gambar 5.7

Davis Brown Rubin 13 14 Harris 165-64-3351 175-56-2251 181-58-9939 177-44-4557 168-56-8113 SSN 192-38-7282 178-52-1065 135-46-6262 208-56-1654 Female Male Male Male Female SEX Male Male Male Male 19,000 27,200 16,400 19,000 34,200 SALARY 22,800 14,700 15,500 22,800 5 3

KOLEKSI SAMPAH

Setelah penghapusan suatu simpul dari linked list, terdapat ruang memori yang bebas (tidak terpakai). Kita menginginkan ruang memori tersebut dapat digunakan lagi. Jelasnya kita menginginkan tersedianya ruang untuk kelak dapat kita pakai.

Salah satu caranya adalah memasukkannya segera ke dalam list ruang-bebas. Hal inilah yang kita kerjakan kalau kita mengimplementasikan linked list melalui larik, bahkan meskipun metode ini sangat memakan banyak waktu dalam sistem operasi komputer.

(16)

98 11 AVAIL 0 14 12 0 20 9 13 10 19 18 17 1 2 3 4 1 2 3 4 15 BROKER LINK Hunter Katz POINT Evans COSTUMER 0 3 Bond Kelly Hall Nelson 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Adams Scott Weston McBride Grant Jones Teller Rogers Vito 4 16 0 6 0 5 1 2 8 7

Gambar 5.12.

Koleksi memori kosong dari Gambar 5.6

(17)

99 1

AVAIL

4 5 6

8

10 0 9 LINK INFO

1 2 3 4 5 6 7 8 9 10

2 3

7

0

START

Gambar 5.13.

Memori dalam keadaan hampa

5.6 PENYISIPAN SIMPUL KE DALAM LINKED LIST

Misalkan LIST adalah linked list, dengan A dan B adalah dua simpul yang berurutan. Lihat Gambar 5.14(a). Misalkan sebuah simpul baru N akan disisipkan ke dalam LIST, antara simpul A dan simpul B. Diagram skematik dari proses penyisipan ini terlihat dalam Gambar 5.14(b). Di sini simpul A sekarang menuding ke simpul baru N, dan simpul baru N menuding ke simpul B, yang tadinya dituding oleh A.

Pandang bahwa linked list kita tersimpan di dalam memori dalam bentuk:

LIST(INFO,LINK,START,AVAIL)

(18)

100

x START

Gambar 5.14(a) Linked-list awal

Node A Node B

x START

Node A Node B

Node N

Gambar 5.14(b) Penyisipan simpul N

Perhatikan bahwa field penuding berubah sebagai berikut :

1. Fieldnextpointer dari simpul A, sekarang menuding ke simpul baru N, ter-hadap mana, sebelumnya AVAIL menuding.

2. AVAIL sekarang menuding ke simpul kedua pada ruang bebas, terhadap mana, sebelumnya simpul N menuding.

3. Field nextpointer dari simpul N, sekarang menuding ke simpul B, yang tadinya dituding oleh simpul A.

Di sini juga terdapat 2 kasus khusus, yakni jika simpul baru N adalah simpul pertama dalam list, maka START akan menuding ke N, dan jika simpul baru N adalah simpul terakhir dalam list, maka N akan berisi penuding nol.

Contoh 5.11

a. Pandang Gambar 5.9, yakni daftar alfabetik pasien. Misalkan seorang pasien baru Hughes masuk. Perhatikan bahwa :

(1) Hughes ditempatkan di ranjang 10, yakni ranjang pertama yang kosong (tersedia).

(19)

101 Terjadi 3 perubahan dalam field penuding, sebagai berikut :

LINK(8) = 10 (Sekarang Green menuding Hughes) LINK(10) = 1 (Sekarang Hughes menuding Kirk)

AVAIL = 2 (Sekarang AVAIL menuding ranjang kosong kedua)

x START

Node A Node B

x AVAIL

Gambar 5.15 Penyisipan simpul N menghilangkan 1 lokasi memori di AVAIL

Node N

b. Pandang Gambar 5.12, daftar broker dan pelanggannya. Karena list pelanggan tidak terurut, asumsikan bahwa setiap pelanggan baru ditambahkan pada awal list. Misalkan Gordan adalah pelanggan baru dari Kelly. Perhatikan bahwa :

(1) Gordan dimasukkan sebagai CUSTOMER(11), yakni simpul tersedia pertama (2) Gordan disisipkan di muka Hunter, yang tadinya adalah pelanggan pertama

dari Kelly.

Di sini terjadi 3 perubahan dalam field penuding, yakni sebagai berikut : POINT(2) = 11 (Sekarang list mulai dengan Gordan)

POINT(11) = 3 (Gordan menuding Hunter)

AVAIL = 18 (Sekarang AVAIL menuding ke simpul tersedia yang berikutnya).

(20)

102

pertama F. Gambar 5.16 menunjukkan list, setelah 6 penyisipan tersebut (untuk n = 10)

7

AVAIL

2 3 4

8

10 0 9 LINK INFO

1 2 3 4 5 6 7 8 9 10

0 1

5

6

START

A B

E D C

F

Gambar 5.16.

Penyisipan enam INFO dalam sebuah linked list

5.6.1 ALGORITMA PENYISIPAN

Algoritma penyisipan dapat kita bagi atas beberapa situasi atau kasus. Di sini kita bicarakan tiga di antaranya, yakni algoritma penyipan simpul pada bagian awal list, algoritma penyisipan simpul sesudah suatu simpul yang diketahui lokasinya, dan yang ketiga adalah penyisipan simpul ke dalam suatu list terurut.

Semua algoritma kita tersebut berasumsi bahwa linked list tersimpan di dalam memori dalam bentuk :

LIST(INFO,LINK,START,AVAIL)

dan variabel ITEM menyatakan informasi baru yang akan ditambahkan ke dalam list. Karena semua algoritma penyisipan kita tersebut membutuhkan simpul dari list AVAIL, maka mereka selalu mengandung langkah :

1. Memeriksa ruang bebas dari list AVAIL, kalau ternyata tidak ada lagi, yakni dalam hal ini AVAIL = NULL, algoritma mengirim pesan overflow.

(21)

103 NEW := AVAIL

AVAIL := LINK(AVAIL)

3. Menyalin informasi baru tersebut ke dalam simpul baru, atau dengan perkataan lain, kita memakai statement

INFO(NEW) := ITEM

Diagram skematik kedua langkah terakhir di atas terlihat pada Gambar 5.17.

NEW

x

AVAIL

ITEM

Free storage list

Gambar 5.17.

Penyisipan simpul yang mengubah penuding AVAIL

5.6.2 PENYISIPAN PADA BAGIAN AWAL LIST

Di sini linked list kita tidak perlu terurut dan penyisipan tidak harus di suatu posisi tertentu. Maka posisi termudah untuk memasukkan simpul baru adalah di bagian awal list.

ALGORITMA : INSFIRST(INFO,LINK,START,AVAIL,ITEM)

[Algoritma ini menyisipkan ITEM sebagai simpul pertama dari list.] 1. (Apakah overflow?)

(22)

104

NEW := AVAIL dan AVAIL := LINK[AVAIL] 3. INFO[NEW] := ITEM

(menyalin data baru ke dalam simpul baru) 4. LINK[NEW] := START

(Simpul baru sekarang menuding ke simpul awal semula) 5. START := NEW

(Mengubah START agar menuding ke simpul yang baru) 6. Exit.

Langkah 1 sampai 3 telah dibahas sebelum ini, dan diagram skematik langkah 2 dan 3 terlihat pada Gambar 5.17. Sedangkan diagram skematik langkah 4 dan 5 dapat dilihat pada Gambar 5.18.

START

x

NEW

Gambar 5.18 Penyisipan di awal list ITEM

Contoh 5.12

Pandang list pada Gambar 5.10. Misalkan angka 75 akan disisipkan pada awal dari list geometri. Kita akan memakai algoritma di atas. Perhatikan bahwa ITEM = 75, INFO = TEST, dan START = GEOM.

INSFIRST(INFO,LINK,START,AVAIL,ITEM)

1. Karena AVAIL <> NULL, kita pergi ke langkah 2 2. NEW = 9, maka AVAIL := LINK[9) = 10

(23)

105 4. LINK[9] = 5

5. GEOM = 9 6. Exit

Gambar 5.19 memperlihatkan keadaan setelah 75 dimasukkan ke dalam list geometri. Perhatikan bahwa hanya 3 penuding yang berubah, yakni AVAIL, GEM, dan LINK[9].

11

9

ALG

GEOM

1 2 3 4 5 6 7 8 9 10 11 12

TEST LINK

13 14 15 16 AVAIL

10

74

82 84 78 74 100

88 62 74 93

16 14 1 0 12

0 8 13

5 3 2 7 6 4 0 15 75

(24)

106

5.6.3 PENYISIPAN PADA BAGIAN DEPAN LIST

Pandang bahwa diberikan nilai dari LOC, yakni lokasi dari simpul A di dalam linked list, atau nilai LOC = NULL. Berikut ini adalah algoritma untuk menyisipkan ITEM ke dalam list, tepat sesudah simpul A, atau jika LOC = NULL, maka ITEM disisipkan sebagai simpul pertama dari list. Misalkan N adalah simpul baru, yang lokasinya adalah NEW. Jika LOC = NULL, maka penyisipan dikerjakan seperti pada algoritma yang lalu. Dalam hal lain, seperti terlihat pada Gambar 5.15, kita jadikan N menuding ke simpul B (simpul yang sebelumnya mengikuti simpul A) dengan menggunakan statement :

LINK[NEW] := LINK[LOC]

dan kita jadikan simpul A menuding ke simpul baru N, dengan menggunakan statement:

LINK[LOC] := NEW

Algoritma : INSLOC(INFO,LINK,START,AVAIL,LOC,ITEM)

[Algoritma ini dimaksudkan untuk menyisipkan ITEM, sehingga mengikuti simpul dengan lokasi LOC atau menyisipkan ITEM sebagai simpul pertama, bila LOC = NULL].

1. [OVERELOW?] jika AVAIL = NULL, maka tulis: OVERFLOW, dan Exit. 2. [Memindahkan simpul pertama dari List AVAIL]

NEW := AVAIL

AVAIL := LINK[AVAIL]

3. AVAIL-ITEM. [menyalin data baru ke dalam simpul baru] 4. Jika LOC = NULL, maka [sisipkan sebagai simpul pertama] LINK(NEW) := START dan START := NEW.

dalam hal lain : [sisipkan sesudah simpul dengan lokasi LOC] LINK[NEW] := LINK[LOC] dan LINK[LOC] := NEW

[Akhir dari struktur jika] 5. Exit

5.6.4 PENYISIPAN KE DALAM LINKED LIST TERURUT

(25)

107

INFO(A)< ITEM< INFO(B).

x

START

Gambar 5.20 Penyisipan simpul pada list terurut

SAVE PTR

Berikut ini prosedur untuk mencari lokasi dari simpul A, yakni mencari lokasi dari simpul terakhir dari LIST yang nilainya kurang dari ITEM. Kita lakukan traversal list, pergunakan variabel penuding PTR, dan bandingkan ITEM dengan INFO (PTR) pada masing-masing simpul selama traversal. Kita jaga jejak lokasi simpul sebelumnya, dengan menggunakan variabel penuding SAVE, seperti digambarkan pada Gambar 5.20. Maka SAVE dan PTR terupdate dengan statement :

SAVE := PTR dan PTR :LINK[PTR]

Traversal dilanjutkan selama INFO[PTR] < ITEM, atau dengan perkataan lain traversal berhenti segera saat ITEM <= INFO[PTR]. Kemudian PTR menuding ke simpul B, maka SAVE berisi lokasi dari simpul A. Berikut ini prosedur formal kita. Kasus bahwa list adalah hampa, dan ITEM < INFO[START], sehingga LOC := NULL ditangani tersendiri, karena mereka tak mengandung variabel SAVE.

Prosedur : FINDA(INFO, LINK, START, ITEM, LOC)

[Prosedur ini akan menemukan lokasi LOC dari simpul terakhir dalam list terurut, sedemikian sehingga INFO[LOC] < ITEM, atau menjadikan LOC := NULL]

1. (List hampa?] Jika START := NULL, maka LOC := NULL, dan return 2. (Kasus khusus?] Jika ITEM < INFO[START], maka LOC := NULL, dan return 3. SAVE := START dan PTR := LINK[START] [mengawali penuding]

4. Ulangi langkah 5 dan 6 sementara PTR <> NULL 5. Jika ITEM < INFO[PTR], maka :

(26)

108

6. SAVE := PTR dan PTR := LINK[PTR] [mengupdate penuding] [Akhir dari loop langkah 4]

7. LOC := SAVE 8. Return.

Sekarang kita mempunyai algoritma untuk menyisipkan ITEM ke dalam linked list terurut LIST, dengan memanfaatkan 2 prosedur terakhir.

Algoritma : INSSRT(INFO, LINK, START, AVAIL, ITEM)

[Algoritma ini menyisipkan ITEM ke dalam suatu linked list terurut.

1. [Gunakan Prosedur FINDA untuk mencari lokasi dari simpul sebelum ITEM] Call FINDA(INFO, LINK, START, ITEM, LOC).

2. [Gunakan algoritma INSLOC untuk menyisipkan ITEM sesudah simpul dengan lokasi LOC]

Call INSLOC(INFO,LINK,START,AVAIL,LOC,ITEM) 3. Exit

Contoh 5.13

Perhatikan list yang terurut secara alfabetik dari para pasien pada Gambar 5.9 yang lalu. Pandang bahwa Jones akan disisipkan ke dalam list tersebut. Kita akan menggunakan algoritma INSSRT di atas, yang pada hakikatnya melaksanakan prosedur FINDA, dan kemudian algoritma INSLOC. Perhatikan bahwa ITEM = Jones dan INFO = BED.

a. FINDA(BED,LINK, START,ITEM,LOC)

1. Karena START <> NULL, maka kita melangkah ke langkah 2 2. Karena BED[5] = Adams < Jones, kendali beralih ke langkah 3 3. SAVE = 5 dan PTR LINK[5] = 3

4. Langkah 5 dan 6 diulang, sebagai berikut :

(27)

109 b. INSLOC(BED,LINK,START,AVAIL,LOC,ITEM)

1. Karena AVAIL <> NULL, maka kita melangkah ke langkah 2 2. NEW = 10, dan AVAIL = LINK[10] = 2

3. BED[10] = Jones

4. Karena LOC <> NULL, maka

LINK[10] = LINK(8] =1, dan LINK[8]= NEW = 10 5. Exit

Gambar 5.21 menunjukkan struktur data kita sesudah Jones disisipkan ke dalam list. Di sini hanya 3 penuding yang berubah, yakni AVAIL, LINK[10], dan LINK[8].

PENYALINAN

Pandang bahwa kita ingin menyalin seluruh bagian dari list, atau akan membentuk sebuah list baru, yang diperoleh dari penyambungan 2 list yang diketahui. Kita dapat melakukannya dengan mendefinisikan sebuah list hampa, dan menambahkan elemen list yang diketahui tersebut, satu persatu menggunakan berbagai macam algoritma penyisipan kita yang lalu.

List hampa didefinisikan dengan cara sederhana, yakni dengan mengambil sebuah nama variabel, atau penuding untuk list, seperti misalnya NAME, dan kemudian memasang NAME := NULL.

5

2

START

AVAIL

Kirk 7

Dean 11

6

Maxwell 12 Adams

Lane Green Samuels

Fields Nelson

3 0 4

0 1 8 9 1

2 3 4 5 6 7 8 9 10 11 12

10

BED LINK

Jones

(28)

110

5.7 PENGHAPUSAN SIMPUL LINKED LIST

Misalkan Simpul N adalah simpul dari LIST yang terletak di antara simpul A dan simpul B, seperti terlihat pada Gambar 5.22a. Simpul N tersebut akan dihapus dari LIST. Diagram skematik dari penghapusan tersebut terlihat pada Gambar 5.22b. Penghapusan terjadi begitu nextpointer dari A berubah menuding ke B. Dalam peng-hapusan ini, kita harus mengingat alamat dari simpul A, simpul pendahulu dari Simpul yang akan kita hapus tersebut.

Pandang linked list kita tersimpan dalam memori dalam bentuk :

LIST(INFO,LINK,START,AVAIL)

Gambar 5.22 tidak memperlihatkan fakta bahwa bila kita melakukan penghapusan simpul N, kita akan segera memulangkan ruang memori kepada list AVAIL. Diagram skematik yang lebih tepat terlihat pada Gambar 5.23. Perhatikan bahwa 3 field penuding berubah, yakni :

1. Nextpointer dari Simpul A sekarang menuding ke B, yang tadinya dituding oleh N. 2. Nextpointer dari Simpul N sekarang menuding ke simpul pertama dari ruang bebas

(free pool), yang tadinya dituding oleh AVAIL. 3. AVAIL sekarang menuding ke simpul N

Di sana juga terdapat 2 kasus istimewa. Yang pertama adalah penghapusan simpul N sebagai simpul pertama dalam list. Dalam hal ini, START akan menuding ke simpul B. Dalam kasus kedua, yakni penghapusan simpul N sebagai simpul terakhir dari list, simpul A akan berisi penuding NULL.

Contoh 5.14

a. Perhatikan list pasien pada Gambar 5-21. Misalkan pasien Green sudah diper-bolehkan pulang, maka BED[8] sekarang menjadi kosong Agar linked list kita tersebut tetap terjaga, maka perlu dilakukan perubahan terhadap beberapa field penuding, yakni sebagai berikut :

(29)

111 x START

(a) sebelum dihapus

Node A Node B

Gambar 5.22 Penghapusan linked list

Node N

x START

(b) sesudah dihapus

Node A Node N Node B

Dengan perubahan pertama, Fields yang tadinya mendahului Green, sekarang menuding ke Jones, yang tadinya mengikuti Green. Perubahan kedua dan ketiga akan menambah jumlah ranjang kosong baru pada list AVAIL. Kita tekankan bahwa sebelum membuat penghapusan, kita harus mencari simpul BED[11], yang tadinya menuding ke simpul yang dihapus, BED[8].

Gambar 5.23 Memori kosong setelah penghapusan simpul

x

START

Node A Node N Node B

AVAIL

(30)

112

b. Perhatikan Gambar 5.12, list para broker dan pelanggannya. Pandang Teller, pelanggan pertama dari Nelson, akan dihapus dari list. Untuk itu dilakukan peru-bahan:

POINT[4] = 10 LINK[9] = 11 AVAIL = 9

Dengan perubahan pertama, Nelson sekarang menuding ke Jones, yang tadinya adalah pelanggan kedua. Perubahan kedua dan ketiga akan menambah simpul baru pada list AVAIL.

c. Misalkan elemen data B dan C akan dihapus satu persatu dari list Gambar 5.16. List yang baru, digambarkan pada Gambar 5.24. Perhatikan bahwa sekarang ketiga simpul pertama yang tersedia adalah :

INFO[3], yang tadinya berisi C INFO[2], yang tadinya berisi B INFO[5], yang tadinya berisi E

3

AVAIL

2 1 7

8

10 0 9 LINK INFO

1 2 3 4 5 6 7 8 9 10

0 5

4

Gambar 5.24 Penghapusan 3 simpul dari Gambar 5.16 6

START

A

D

F

(31)

113

5.7.1 ALGORITMA PENGHAPUSAN

Algoritma penghapusan simpul suatu linked list muncul dalam berbagai situasi. Di sini akan kita bahas 2 di antaranya. Yang pertama adalah penghapusan simpul sesudah suatu simpul yang diketahui, dan yang kedua adalah penghapusan simpul yang diketahui mempunyai informasi ITEM. Untuk algoritma kita, selalu diasumsikan, bahwa linked list adalah dalam bentuk :

LIST(INFO,LINK,START,AVAIL).

Semua algoritma penghapusan kita, selalu mengembalikan ruang memori dari simpul yang dihapus, kepada bagian awal dari list AVAIL. Karenanya, semua algoritma kita mengandung pasangan statement berikut ini :

LINK[LOC] := AVAIL AVAIL := LOC

Di sini LOC adalah lokasi dari simpul N yang kita hapus. Kedua operasi di atas digambarkan pada Gambar 5.25.

Gambar 5.25 Penghapusan simpul yang dicatat oleh AVAIL

x

LOC

Node N

AVAIL

free storage list

(32)

114

5.7.2 PENGHAPUSAN SIMPUL SESUDAH SIMPUL YANG

DIKETAHUI

Berikut ini algoritmanya :

DEL(INFO, LINKSTART, AVAIL, LOC, LOCP)

(Algoritma ini dimaksudkan untuk menghapus simpul N dengan lokasi LOC. LOCP adalah lokasi dari simpul yang mendahului N, atau apabila N adalah simpul pertama, LOCP = NULL

1. Jika LOCP= NULL, maka:

START := LINK[START]. [Menghapus simpul pertama] dalam hal lain : LINK[LOCP] = LINK[LOC] [Menghapus Simpul N]

[Akhir dari struktur jika]

2. [Mengembalikan simpul terhapus kepada list AVAIL] 3. Exit.

Gambar 5.26 merupakan diagram skematik dari Statement :

START

:=

LINK[START]

START

Node 2

Node 1 Node 3

Gambar 5.26.

Pengalihan penuding ketika satu simpul dihapus

Gambar 5.27 merupakan diagram skematik dari statements :

(33)

115

x

START

Node N

LOCP LOC

Gambar 5.27

Skematik dari statements LINK[LOCKP] := LINK[LOC]

5.7.3 PENGHAPUSAN

SIMPUL YANG DIKETAHUI

INFORMASINYA

Algoritmanya, yakni algoritma DELLOC bekerja dengan memanfaatkan prosedur FINDB.

Procedure : FINDB(INFO,LINK,STARTJTEM,LOC,LOCP)

[Prosedur ini dimaksudkan untuk mencari lokasi LOC dari simpul N pertama yang mengandung ITEM dan lokasi LOCP dari simpul pendahulu N. Jika ITEM tidak terdapat pada list, maka prosedur akan menjadikan LOC NULL, dan jika ITEM muncul pada simpul pertama, maka LOCP = NULL.

1. [List hampa?] Jika START := NULL, maka: LOC := NULL, dan LOCP := NULL, dan return [Akhir dari struktur jika]

2. [ITEM, di dalam simpul pertama?] Jika INFO[START] := ITEM, maka : LOC := START dan LOCP := NULL, dan Return.

3. SAVE := START dan PTR := LINK[START] [Inisialisasi Penuding] 4. Ulangi langkah 5 dan 6 sementara PTR <> NULL

5. Jika INFO[PTR] = ITEM, maka

LOC := PTR dan LOCP := SAVE, dan Return [Akhir dari struktur jika]

6. SAVE := PTR dan PTR := LINK[PTR] [Mengupdate penuding] [Akhir dari loop langkah 4]

(34)

116

8. Return

Berikut ini algoritma lengkapnya

Algoritma : DELLOC(INFO, LINK, START, AVAIL, ITEM)

(Algoritma ini dimaksudkan untuk menghapus dari suatu linked list, simpul N pertama yang berisi informasi ITEM)

1. [Gunakan prosedur FINDB di atas, untuk mencari lokasi dari N dan simpul pendahulunya]

Call FINDB(INFO, LINK, START, ITEM, LOC, LOCP)

2. Jika LOC := NULL, maka: tulis: ITEM tidak dalam list, dan Exit. 3. [Hapus simpul.]

Jika LOCP := NULL, maka:

START := LINK[START]. [Hapus simpul pertama] Jika tidak:

LINK[LOCP] := LINK(LOC] [Akhir dari struktur jika]

4. [Mengembalikan simpul terhapus ke list AVAIL] LINK[LOC] := AVAIL dan AVAIL := LOC. 5. Exit.

Contoh 5.15

Pandang list pasien pada Gambar 5.21. Misalkan pasien Green diperbolehkan pulang. Untuk menghapusnya dari list, kita laksanakan prosedur FINDB dan algoritma DELLOC di atas. Di sini ITEM Green, INFO = BED, START = 5, dan AVAIL = 2.

(a). FINDB(BED,LINK,START,ITEM,LOC,LOCP) 1. Karena START <> NULL, kita lanjutkan ke langkah 2

(35)

117 3. SAVE = 5 dan PTR = LINK[5] = 3

4. Langkah 5 dan 6 diulangi sebagai berikut :

a. BED[3] = Dean <> Green, maka SAVE = 3, dan PTR LINK[3] =11 b. BED[11] = Fields <> Green, maka SAVE = 11, dan PTR = LINK[11] = 8 c. BED[8] = Green, maka kita peroleh

LOCP = PTR = 8, dan LOCP = SAVE = 11, dan Return

5

8

START

AVAIL

Kirk 7

Dean 11 6

Maxwell 12 Adams

Lane

Samuels

Fields Nelson

3 0 4

0 1 10

9 1

2 3 4 5 6 7 8 9 10 11 12

2 BED LINK

Gambar 5.28 Penghapusan sebuah simpul

Jones

(b) DELLOC(BED,LINK,START,AVAIL, ITEM)

1. Call FINDB(BED,LINK,START,ITEM,LOC,LOCP), diperoleh LOC = 8, dan LOCP = 11

2. Karena LOC <> NULL, lanjutkan ke langkah 3 3. Karena LOCP <> NULL, kita peroleh

(36)

118

Gambar 5.28 menunjukkan struktur data setelah Green dihapus dari list. Kita lihat bahwa hanya 3 penuding berubah, yakni LINK[11], LINK[8], dan AVAIL.

5.8 HEADER LINKED LIST

Header linked list adalah suatu linked list yang mengandung suatu simpul khusus yang terletak pada bagian awal dari list, yang disebut simpul header. Berikut ini 2 jenis header linked list yang biasa digunakan, yakni :

1. Grounded Header list, yang adalah header list yang simpul terakhirnya berisi penuding NULL. Kata grounded dipakai karena banyak buku menggunakan simbol listrik grounded (dibumikan) untuk menunjukkan penuding NULL.

2. Circular Header List adalah header list yang simpul terakhimya menuding ke simpul header dari list tersebut.2.

Gambar 5.29 merupakan diagram skematik dari header list tersebut. Biasanya jika tidak disebutkan apa-apa, maka kita maksudkan header list adalah circular. Perhatikan bahwa penuding dari list, yakni START selalu menuding ke simpul header. Karenanya LINK[START] = NULL menunjukkan bahwa grounded header list adalah hampa, dan LINK[START] = START menunjukkan bahwa circular header list adalah hampa.

x START

(a) Grounded header list

START

Gambar 5.29 Dua macam header list

Header node

(b) Circular header list

(37)

119 Meskipun data kita simpan dalam memori sebagai header list, namun list AVAIL tetap disimpan sebagai linked list biasa.

Contoh 5.16

Perhatikan berkas Personalia pada Gambar 5.11. Data akan kita simpan sebagai header list seperti pada Gambar 5.30. Perhatikan bahwa sekarang LOC = 5 adalah lokasi dari record header. Karenanya, START = 5, dan karena Rubin adalah pegawai terakhir, maka LINK[10] = 5. Header dapat pula dipakai menyimpan informasi tentang isi berkas. Sebagai contoh, misalkan SSN[5] = 9 menunjukkan banyaknya pegawai, dan SALARY[5] = 191.600 menunjukkan total gaji yang dibayarkan kepada pegawai.

5 8 START AVAIL 0 Kelly 7 12 Green 14 Lewis Cohen Evans 6 9 10 2 5 13 4 1 2 3 4 5 6 7 8 9 10 11 12 11 NAMA LINK

(38)

120

5.9 ALGORITMA UNTUK HEADER LINKED LIST

Algoritma berikut ini dimaksudkan untuk melakukan kunjungan atau traversing simpul suatu circular header list (traversal dalam circular header list) :

Algoritma (Traversal dalam

circular header list

)

Misalkan LIST adalah circular header list dalam memori. Algoritma ini akan melakukan traversal LIST. Kita gunakan operasi proses terhadap setiap simpul dari LIST.

1. PTR:=LINK[START] [inisialisasi pnuding PTR) 2. Ulangi langkah 3 dan 4 sementara PTR <> START; 3. Proses INFO[PTR]

4. PTR := LINK[PTR]. [PTR sekarang menuding ke simpul berikutnya] [Akhir dari loop langkah 2]

5. Exit.

Selanjutnya diberikan algoritma untuk mencari lokasi LOC dari simpul yang pertama kali memuat informasi ITEM dalam list, atau menjadikan LOC = NULL, bila tidak ditemukan.

Algoritma : SRCHHL(INFO, LINK, START, ITEM, LOC)

LIST adalah circular header list dalam memori. Algoritma ini untuk mencari lokasi LOC dari simpul yang pertama kali memuat informasi ITEM dalam list, atau men-jadikan LOC = NULL, bila tidak ditemukan.

1. PTR := LINK[START]

2. Ulangi sementara INFO[PTR] <> ITEM dan PTR <> START:

PTR := LINK[PTR] [PTR sekarang menuding ke simpul berikutnya [Akhir dari loop]

3. Jika INFO[PTR] := ITEM, maka LOC := PTR

kalau tidak : LOC := NULL.

(39)

121 Selanjutnya adalah prosedur untuk mencari lokasi LOC dari simpul N pertama yang mengandung ITEM dan lokasi LOCP dari simpul pendahulu N. Jika ITEM tidak terdapat pada list, maka prosedur akan menjadikan LOC = NULL, dan jika ITEM muncul pada simpul pertama, maka LOCP = NULL. Prosedur ini berfungsi sama seperti Prosedur FINDB(INFO,LINK,START,ITEM,LOC,LOCP) untuk linked list biasa, yang telah dibahas terdahulu.

Prosedur : FINDBHL[INFO, LINK, START, ITEM, LOC, LOCP)

1 . SAVE := START dan PTR := LINK[START]; [inisialisasi penuding] 2. Ulangi sementara INFO[PTR] <> ITEM dan PTR <> START.

SAVE := PTR dan PTR := LINK[PTR] [Mengupdate penuding]

[Akhir dari loop]

3. Jika INFO[PTR] := ITEM, maka LOC := PTR dan LOCP := SAVE,

Kalau tidak LOC := NULL dan LOCP := SAVE. [Akhir dari struktur jika]

4. Exit.

Berikut, terakhir sekali adalah algoritma yang fungsinya sama seperti algoritma DELLOC(INFO, LINK, START, AVAIL, ITEM) untuk linked list biasa, yakni untuk untuk menghapus, dari suatu circular header linked list, simpul N pertama yang berisi informasi ITEM.

Algoritma : DELLOCHL(INFO, LINK, START, AVAIL, ITEM)

1. [Gunakan Prosedur FINDBHL yang lalu untuk mencari lokasi dari N dan Simpul pendahulunya]

Call LINDBHL(INFO, LINK, START, ITEM, LOC, LOCP) 2. Jika LOC = NULL, maka: tulis: ITEM tidak dalam list, dan Exit. 3. LINK[LOCP] := LINK[LOC]..[Menghapus Simpul]

4. [Mengembalikan simpul terhapus kepada List AVAIL] LINK[LOC] := AVAIL dan AVAIL := LOC.

(40)

122

Sebagai catatan, masih terdapat 2 lagi variasi dari linked list yang kadang-kadang muncul dalam literatur, yakni :

1. Linked list yang simpul terakhirnya menuding ke simpul awal. Linked list ini disebut Circular List.

2. Satu jenis lagi adalah linked list yang mempunyai simpul khusus (header) di bagian awal dan di bagian akhir list.

Gambar 5.31 merupakan diagram skematik kedua list tersebut.

START

(b) Linked list with header and trailer nodes

Header node

(a) Circular linked list

x Trailer node START

Gambar 5.31.

Dua variasi lain dari linked list

5.10 PENYAJIAN POLINOMIAL

Header linked list acap kali dipergunakan untuk menyimpan polinomial dalam memori. Di sini simpul header selalu merupakan bagian penting dalam penyajian, karena ia dibutuhkan untuk menyajikan polinomial nol.

Contoh 5.17

(41)

123 koefisien dan eksponen dari suku yang bersangkutan, dan simpul dikaitkan berdasar atas derajat menurun.

Perhatikan bahwa variabel penuding POLY menuding ke simpul header, yang field eksponennya diberi nilai bilangan negatif, dalam hal ini adalah -1. Di sini penyajian larik dari list membutuhkan 3 larik linier, yang boleh kita sebut COEF, EXP dan LINK. Salah satu penyajian terdapat dalam Gambar 5.32b.

POLY

Gambar 5.32(a) Penyajian polinomial dalam linked list

0 -1 2 8 -5 7 -3 2 4 0

Coefficient of term

Exponent of term

1

2

POLY

AVAIL

-1

8

7

2 1

2 3 4 5 6 7 8

-EXP

Gambar 5.32(b) Penyajian polinomial dalam memori

n

COEF

3

4 5

6 8 7 1 9 LINK

0

-0

2 - 5

- 3

(42)

124

5.11 LINKED-STACK dan LINKED-QUEUE

Bentuk lain dari struktur berkait adalah linked-stack dan linked-queue. Diagram skematik dari linked-stack dan linked-queue dilihat pada Gambar 5.33 dan 5.34.

Gambar 5.34 Linked-queue TOP

a DATA LINK

Gambar 5.33. Linked stack

FRONT

data link

REAR

Operasi penghapusan dan penyisipan pada linked-stack sama seperti yang dilakukan pada stack biasa, yaitu pada TOP dari stack. Sedangkan operasi penyisipan dan penghapusan pada linked-queue juga sama seperti yang dilakukan pada queue bisa. Operasi penyisipan dilakukan pada REAR dan operasi penghapusan pada FRONT dari queue.

5.12. TWO WAY LIST

(43)

125 yang disebut dengan nodes, yang setiap nodenya dibagi atas tiga bagian utama, yaitu : (1) nilai data atau informasi (INFO), (2) penuding ke alamat node sebelumnya (BACK), dan (3) penuding ke alamat node berikutnya (FORW).

Bila lokasi (alamat) suatu node dilambangkan dengan LOC, maka berlaku FORW(LOCA) = LOCB jika dan hanya jika, BACK(LOCB) = LOCA, atau “lokasi berikutnya dari node A adalah lokasi node B, jika dan hanya jika, lokasi sebelumnya dari node B adalah lokasi node A.”

Skema dari two way list dapat dilihat di Gambar 5.35. FIRST adalah penunjukkan node awal dan LAST adalah penandaan node terakhir. Skema pemetaan di memori dari two way list dapat dilihat di Gambar 5.36.

LAST FIRST

x x

Node N

INFO (nilai data dari node N) BACK (penunjuk ke node sebelumnya) FORW (penunjuk ke node berikutnya)

Gambar 5.35

Skema two way list

IN F O

F IR ST

4

B A C K F O R W

L A ST

8 7 A V A IL

1

2

3

4

5

6

7

8

9

L isa N .

C o n ny N .

N u r L o la

N u r L o li

M a rd ia na

9

3 6

0

5 0

4 1

5 8

1 2

8 0

8

(44)

126

5.13. TWO WAY HEADER LIST

Two way header list merupakan gabungan dari two way list dan circular header linked list. Intinya, pada two way list, FIRST atau START-nyamengarah ke header node, begitu juga node terakhirnya akan mengarah kembali ke header nodenya.

NodeN

Header Node START

Gambar 5.37

Skema two way header list

Berikut, pada Gambar 5.38 merupakan contoh penggunaan two way header list yang merupakan pengembangan dari header linked list yang ada di Gambar 5.30. Silakan Anda telusuri field FORW dan BACK-nya.

Operasi-operasi yang ada, seperti biasa, traversing (penelusuran), searching (pencarian), deleting (penghapusan), dan inserting (penyisipan) item-item data. Gambar 5.39 dan 5.40 memperlihatkan skema penghapusan dan penyisipan item data (simpul/ node). Silakan Anda buat programnya dengan bahasa pemrograman apapun yang Anda kuasai.

Algoritma penghapusan simpul :

DELTWL(INFO, FORW,BACK,START,AVAIL, LOC)

1. [Delete node]

Set FORW[BACK[LOC]] = FORW[LOC] and BACK[FORW[LOC]] := BACK[LOC] 2. [Remove node to AVAIL list]

(45)

127 5 8 START AVAIL 0 Kelly 7 12 Green 14 Lewis Cohen Evans 6 9 10 2 5 13 4 1 2 3 4 5 6 7 8 9 10 11 12 11 NAMA FORW

Gambar 5.38 Contoh two way header linked-list

Davis Brown Rubin 13 14 Harris 165-64-3351 175-56-2251 181-58-9939 177-44-4557 168-56-8113 SSN 192-38-7282 178-52-1065 135-46-6262 208-56-1654 Female Male Male Male Female SEX Male Male Male Male 19,000 27,200 16,400 19,000 34,200 SALARY 22,800 14,700 15,500 22,800 1 3 009 191,600 BACK 9 14 12 10 5 3 6 7 3 4 NodeN LOC

(46)

128

Algoritma penyisipan simpul :

INSTWL(INFO, FORW,BACK,START,AVAIL, LOCA,LOCB,ITEM)

1. [OVERFLOW ?] IF AVAIL = NULL, then Write : OVERFLOW and Exit 2. [Remove node from AVAIL list and copy new data into node.]

SET NEW := AVAIL, AVAIL = FORW[AVAIL], INFO[NEW] := ITEM 3. [Insert node into list.]

Set FORW[LOCA] := NEW, FORW[NEW] : = LOCB BACK[LOCB] : = NEW, BACK[NEW] := LOCA 4. Exit

x

NodeN

NodeA NodeB

LOCA LOCB

NEW

(47)

129

L A T I H A N 5

1. Jelaskan istilah ‘pointer’ dan link dalam linked list.

2. Bagaimana kunjungan (traversal) terhadap suatu link list ?

3. Buatlah suatu skema linked-list yang menggambarkan 10 buah abjad terurut. Sajikan skema tersebut ke penyajian dalam memori.

4. Lakukan penghapusan dua elemen dari soal nomor 3 di atas, yaitu elemen pertama dan elemen kelima.

5. Lakukan penambahan elemen di urutan elemen pertama dan ketujuh dari soal nomor 4 di atas (jadi tidak urut).

6. Ubah pointer-pointerlinknya sehingga data di soal nomor 5 di atas menjadi terurut kembali.

7. Apa yang dimaksud dengan koleksi sampah (garbage collection) di linked-list ?

8. Apa yang dimaksud dengan header linked list dan apa saja jenisnya ?

9. Jelaskan perbedaan cara kerja one way list dan two way list ?

10. Apa yang dimaksud dengan two way header list ?

Gambar

Gambar  5.3.   Sortir data  dalam linked list
Gambar 5.4.  Linked list yang menghasilkan string
Gambar 5.5.   Contoh linked list hasil testing 2 mata kuliah
Gambar 5.6.  Linked list empat orang broker
+7

Referensi

Dokumen terkait

Dengan mengikuti training SW 03, Anda diharapkan dapat menggunakan software AnswerTree yang memiliki berbagai metode analisis untuk melakukan prediksi

Selain digunakan untuk memberikan latihan simulasi ketakutan yang biasa dialami oleh anak – anak, terdapat perangkat lain pada board game yang akan digunakan untuk

Berdasarkan temuan ini manajemen LPD semestinya mengembangkan suatu pola penghayatan dan pengamalan nilai-nilai budaya THK yang dapat meningkatkan kepercayaan atas kegunaan dan

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

Strategi ini bertujuan untuk mendapatkan keuntungan lebih melalui penekanan biaya produksi dengan menemukan pemasok alternatif sehingga harga bahan baku

Berikut ini merupakan notasi yang digunakan dalam model. Biaya total untuk sistem persediaan material Panjang periode review untuk modul i tipe j Panjang periode