• Tidak ada hasil yang ditemukan

Operasi Dasar Terhadap Senarai 1. Create: membuat senarai kosong

Dalam dokumen BAB 1 PENGANTAR KE STRUKTUR DATA (Halaman 21-42)

2. Traversal: mengunjungi elemen senarai mulai dari elemen pertama sampai elemen terakhir atau elemen tertentu yang diinginkan dan melakukan pemrosesan

3. Insert: menyisipkan elemen 4. Delete: menghapus elemen

5. Bekerja dengan 2 senarai atau lebih 3.3.1 Membuat senarai kosong

procedure Create(output L: Senarai) {membuat senarai kosong}

{K. Awal: - }

{K.Akhir: tercipta sebuah list kosong, L.First = Nil} Deklarasi:

Deskripsi: L.First = Nil

3.3.2 Traversal

Ada dua skema, yaitu skema repeat-until yang memeriksa apakah senarai kosong dan skema while-do tidak memeriksa apakah senarai kosong atau tidak.

Traversal dengan skema repeat - until

procedure Traversal1(input L: Senarai) {traversal list dengan kasus senarai kosong} {K. Awal: L terdefinisi, mungkin kosong}

{K.Akhir: Semua elemen senarai dikunjungi dan diproses} Deklarasi:

P: Address Deskripsi:

if L.First = Nil then write (“senarai kosong”) else Inisialisasi P  L.First repeat Proses(P) P  Next(P) until P = Nil endif

Algoritma 3.3. Traversal Dengan Kasus Kosong Traversal dengan skema while-do

procedure Traversal2(input L: Senarai)

{traversal list tanpa penanganan kasus senarai kosong} {K. Awal: L terdefinisi, mungkin kosong}

{K.Akhir: Semua elemen senarai dikunjungi dan diproses} Deklarasi: P: Address Deskripsi: Inisialisasi P  L.First while P ≠ Nil do Proses(P) P  Next(P) endwhile {P = Nil}

Contoh 3.1: Mencetak semua info elemen senarai

Untuk mencetak semua info elemen senarai berarti harus dilakukan traversal terhadap senarai mulai dari elemen pertama sampai elemen terakhir. Proses yang dilakukan adalah pencetakan.

procedure Cetak(input L: Senarai)

{Mencetak semua info elemen senarai. Jika senarai kosong cetak pesan “senarai kosong”}

{K. Awal: L terdefinisi, mungkin kosong}

{K.Akhir: Semua elemen senarai dikunjungi dan info-nya dicetak}

Deklarasi: P: Address Deskripsi:

if L.First = Nil then write (“senarai kosong”) else P  L.First repeat write (Info(P)) P  Next(P) until P = Nil endif

Algoritma 3.5. Mencetak Info Semua Elemen Contoh 3.2: Menghitung banyak elemen

Traversal senarai dan menghitung banyak elemen. Setiap kali sebuah elemen dikunjungi berarti banyak elemen bertambah 1.

Perhatikan ilustrasi berikut: First First

NEl = 3 NEl = 0

procedure HitElemen(input L: Senarai, output NEl: integer) {Menghitung banyak elemen senarai}

{K. Awal: L terdefinisi, mungkin kosong}

{K.Akhir: NEl terdefinisi, yaitu banyak elemen senarai } Deklarasi: P: Address Deskripsi: NEl  0 P  L.First while P ≠ Nil do NEl  NEl + 1 P  Next(P) endwhile

Algoritma 3.6. Menghitung Banyak Elemen Contoh 3.3

Buat algoritma untuk menghitung banyak elemen senarai yang info-nya ganjil Perhatikan ilustrasi berikut:

First NGj = -99 First NGj = 2 First NGj = 0 58 73 47 74 60 80

procedure HitGanjil(input L: Senarai, output NGj: integer) {Menghitung banyak elemen senarai yang info-nya ganjil} {K. Awal: L terdefinisi, mungkin kosong}

{K.Akhir: NGj terdefinisi, yaitu banyak elemen senarai yang bernilai ganjil. Jika senarai kosong,

maka NGj = -99 } Deklarasi:

P: Address Deskripsi:

if L.First = Nil then NGj  -99

else

NGj  0; P  L.First repeat

if Info(P) mod 2 = 1 then NGj  NGj + 1

endif

P  Next(P) until P = Nil endif

Algoritma 3.7. Menghitung Banyak Elemen yang Info-nya Ganjil Contoh 3.4 : Pencarian

Pencarian adalah menelusuri (traversal) elemen senarai mulai dari elemen pertama sampai elemen yang dicari ditemukan atau sampai elemen terakhir jika yang dicari tidak ditemukan. Proses yang dilakukan selama penelusuran adalah membandingkan apakah info elemen senarai yang dikunjungi sama dengan yang dicari. Jika sama berarti yang dicari ditemukan dan penelusuran dihentikan. Jika info elemen yang dikunjungi tidak sama dengan yang dicari maka penelusuran dilanjutkan ke elemen berikutnya. Ada dua macam algoritma pencarian, yaitu (1) hasil pencarian berupa nilai boolean, true jika yang dicari ditemukan dan false yang dicari tidak ditemukan. (2) Hasil pencarian berupa alamat elemen yang dicari tersebut ditemukan, nil jika yang dicari tidak ditemukan.

(1) Keluaran berupa nilai boolean First Found = false First Found = true First Found = false 58 73 47 74 60 80

Misalkan X yang dicari = 73

(2) Keluaran berupa alamat

First PX = Nil First PX First 58 73 47 74 60 80

Misalkan X yang dicari = 73

PX = Nil

Gambar 3.6. Pencarian

procedure Search1(input L: Senarai, input X: TInfo, output Found: boolean)

{Mencari apakah X ada di dalam elemen senarai}

{K. Awal: L terdefinisi, mungkin kosong, X terdefinisi yaitu info yang dijadikan dasar pencarian}

{K.Akhir: Jika X ditemukan maka Found = true,

Jika X tidak ditemukan maka Found = false} Deklarasi:

P: Address Deskripsi: Found  false

P  L.First

while not Found and P ≠ Nil do if Info(P) = X then Found  true else P  Next(P) endif endwhile

Algoritma 3.8. Pencarian Dengan Keluaran Boolean

procedure Search2(input L: Senarai, input X: TInfo, output PX: Address)

{Mencari apakah X ada di dalam elemen senarai}

{K. Awal: L terdefinisi, mungkin kosong, X terdefinisi yaitu info yang dijadikan dasar pencarian}

{K.Akhir: Jika X ditemukan maka PX adalah alamat elemen tempat X ditemukan

Jika X tidak ditemukan maka PX = Nil} Deklarasi:

P: Address Deskripsi:

Found  false; P  L.First while not Found and P ≠ Nil do if Info(P) = X then Found  true else P  Next(P) endif endwhile if Found then PX  P else PX  Nil endif

Algoritma 3.9. Pencarian Dengan Keluaran Alamat 3.3.3 Penyisipan Elemen

1. Penyisipan sebagai elemen pertama 2. Penyisipan sebagai elemen tengah 3. Penyisipan sebagai elemen terakhir

Penyisipan Sebagai Elemen Pertama First P First 58 73 60 58 73 60

Sebelum Penyisipan Setelah Penyisipan

Gambar 3.7. Penyisipan Sebagai Elemen Pertama

procedure InsertFirst(input/output L: Senarai, input P: Address)

{Menyisipkan P sebagai elemen pertama senarai}

{K. Awal: L terdefinisi, mungkin kosong, P terdefinisi yaitu alamat elemen yang akan disisipkan}

{K.Akhir: P menjadi elemen pertama senarai} Deklarasi:

Deskripsi:

Next(P)  L.First L.First  P

Algoritma 3.10. Menyisipkan Sebagai Elemen Pertama Penyisipan Sebagai Elemen Tengah

First

P

First

60 73 60 58 73

58

Sebelum Penyisipan Setelah Penyisipan

Prev Prev

P

procedure InsertAfter(input/output P, Prev: Address) {Menyisipkan P setelah elemen dengan alamat Prev} {K. Awal: Prev terdefinisi, P terdefinisi yaitu alamat elemen yang akan disisipkan}

{K.Akhir: P menjadi elemen setelah elemen dengan alamat Prev} Deklarasi: Deskripsi: Next(P)  Next(Prev) Next(Prev)  P

Algoritma 3.11. Menyisipkan Sebagai Elemen Tengah Penyisipan Sebagai Elemen Terakhir

First

P

First

60 73 60 73 50

58

Sebelum Penyisipan Setelah Penyisipan

Last Last

P

Gambar 3.9. Penyisipan Sebagai Elemen Terakhir

procedure InsertLast(input/output L: Senarai, input P: Address)

{Menyisipkan P sebagai elemen terakhir}

{K. Awal: L terdefinisi, mungkin kosong P terdefinisi yaitu alamat elemen yang akan disisipkan}

{K.Akhir: P menjadi elemen terakhir senarai} Deklarasi:

Deskripsi:

if L.First = Nil then L.First  P else

Last  L.First

while Next(Last) ≠ Nil do Last  Next(Last) endwhile

Next(Last)  P endif

Algoritma 3.12. Menyisipkan Sebagai Elemen Terakhir 3.3.4 Menghapus Elemen

1. Menghapus Elemen Pertama 2. Menghapus Elemen Tengah 3. Menghapus Elemen Terakhir

Menghapus Elemen Pertama

First 60 58 73 Setelah Penghapusan First 60 58 73 P

Gambar 3.13. Menghapus Elemen Pertama

procedure DeleteFirst(input/output L: Senarai, output P:Address)

{menghapus elemen pertama senarai} {K. Awal: L terdefinisi, tidak kosong}

{K.Akhir: P adalah alamat elemen yang dihapus} Deklarasi:

Deskripsi: P  L.First

L.First  Next(L.First)

Menghapus Elemen Tengah

First

60 58 73

Sebelum Penghapusan Setelah Penghapusan

First

60 58 73

P Prev

Prev

Gambar 3.11. Menghapus Elemen Tengah

procedure DeleteAfter(input/output P, Prev: Address) {menghapus elemen setelah elemen dengan alamat Prev} {K. Awal: Prev terdefinisi}

{K.Akhir: P adalah alamat elemen yang dihapus} Deklarasi:

Deskripsi:

P  Next(Prev)

Next(Prev)  Next(Next(Prev))

Algoritma 3.14. Menghapus Elemen Tengah

Menghapus Elemen Terakhir

First

60 58 73

Sebelum Penghapusan Setelah Penghapusan

First

60 58 73

P PrevLast

PrevLast Last Last

procedure DeleteLast(input/output L: Senarai, output P:Address)

{menghapus elemen terakhir senarai} {K. Awal: L terdefinisi, tidak kosong}

{K.Akhir: P adalah alamat elemen yang dihapus} Deklarasi:

Last, PrevLast: Address Deskripsi:

PrevLast  Nil Last  L.First

while Next(Last) ≠ Nil do PrevLast  Last

Last  Next(Last) endwhile

P  Last

Next(PrevLast)  Nil

Algoritma 3.15. Menghapus Elemen Terakhir Contoh 5: Pencarian dan Penyisipan

Buat algoritma untuk mencari keberadaan X di dalam senarai. Jika X tidak ditemukan, maka alokasikan sebuah elemen dengan alamat P, simpan X sebagai Info(P) dan sisipkan P sebagai elemen pertama senarai. Perhatikan Gambar 3.13.

First P First 58 73 60 58 73 K. Awal K.Akhir Mis. X = 60 Kasus (1) jika X tidak ditemukan

First First

58 73 58 73

K. Awal K.Akhir

Mis. X = 73 Kasus (2) jika X ditemukan

procedure CaridanSisip(input/output L: Senarai, input X: TInfo)

{mencari keberadaan X, jika tidak ditemukan maka alokasikan sebuah elemen dengan alamat P, simpan X sebagai Info(P) dan sisipkan P sebagai elemen pertama senarai}

{K. Awal: L terdefinisi, X terdefinisi}

{K.Akhir: Jika X tidak ditemukan, maka X menjadi elemen pertama senarai} Deklarasi: P, Q: Address Found: boolean Deskripsi: Q  L.First Found  false

while not Found and Q ≠ Nil do if Info(Q) = X then Found  true else Q  Next(Q) endif endwhile

if not Found then Alokasi(P) Info(P)  X Next(P)  Nil InsertFirst(L, P) endif

Algoritma 3.16. Pencarian dan Penyisipan Contoh 6: Hapus X

Buat algoritma untuk elemen yang info-nya = X. Perhatikan Gambar 3.14.

First

60 58 73

K. Awal K.Akhir

Kasus (1) jika X tidak ditemukan

Kasus (2) jika X ditemukan First 60 58 73 First 60 58 73 Mis. X = 70 Mis. X = 58 P First 60 58 73

procedure HapusX(input/output L: Senarai,

input X: TInfo, output P: Address) {mencari keberadaan X, jika ditemukan maka hapus elemen X} {K. Awal: L terdefinisi, X terdefinisi}

{K.Akhir: Jika X ditemukan P adalah alamat elemen yang dihapus. Jika X ditemukan, maka P = Nil}

Deklarasi:

PrevQ, Q: Address Found: boolean Deskripsi:

Q  L.First; PrevQ  Nil Found  false

while not Found and Q ≠ Nil do if Info(Q) = X then Found  true else PrevQ  Q Q  Next(Q) endif endwhile

if Found then {X ditemukan} if PrevQ = Nil then

DeleteFirst(L,P) else

DeleteAfter(P, PrevQ) endif

else {X tidak ditemukan} P  Nil

endif

Algoritma 3.17. Mencari dan Menghapus 3.3.5 Bekerja Dengan Dua atau Lebih Senarai

1. Penyambungan Senarai (Konkat) 2. Penggabungan Senarai (Merger) 3. Salin Senarai (Copy)

4. Balik Senarai (Reverse)

Penyambungan Senarai (Konkat)

Menyambung senarai L1 dengan senarai L2. Senarai L1 berada “di depan”

L2.First 42 29 K. Awal K.Akhir L1.First 60 58 73 L1.First 60 58 73 42 29

Gambar 3.15. Penyambungan Senarai procedure Konkat(input/output L1: Senarai, input L2: Senarai)

{menyambung senarai L1 dengan senarai L2, dengan senarai L1 berada di depan}

{K. Awal: L1, L2 terdefinisi} {K.Akhir: L2 tersambung dengan L1} Deklarasi:

P: Address Deskripsi: P  L1.First

while Next(P) ≠ Nil do P  Next(P)

endwhile

Next(P)  L2.First

Algoritma 3.18. Menghapus Elemen Tengah Penggabungan Senarai (Merger)

Menggabung senarai L1 dan L2 yang info-nya terurut dari kecil ke besar, L3 adalah hasil penggabungan dan info-nya tetap terurut.

L2.First 50 75 K. Awal K.Akhir L1.First 45 60 80 L3.First 45 50 60 75 80

Gambar 3.16. Penggabungan Senarai

procedure Merger(input L1,L2: Senarai, output L3: Senarai) {Menggabung senarai L1 dengan L2 yang info-nya terurut dari kecil ke besar. Senarai L3 merupakan penggabungan, tetap terurut}

{K. Awal: L1, L2 terdefinisi, info-nya terurut dari kecil ke besar}

{K.Akhir: L3 terdefinisi merupakan hasil penggabungan L1 dengan L2 dan tetap terurut}

Deklarasi: P1,P2,Q: Address Deskripsi: P1  L1.First P2  L2.First Create(L3)

while P1 ≠ Nil and P2 ≠ Nil do Alokasi(Q)

Next(Q)  Nil

if Info(P1) < Info(P2) then Info(Q)  Info(P1) P1  Next(P1) else Info(Q)  Info(P2) P2  Next(P2) endif InsertLast(L3,Q) endwhile while P1 ≠ Nil do Alokasi(Q) Next(Q)  Nil

Info(Q)  Info(P1) InsertLast(L3,Q) P1  Next(P1) endwhile while P2 ≠ Nil do Alokasi(Q) Next(Q)  Nil Info(Q)  Info(P1) InsertLast(L3,Q) P2  Next(P2) endwhile

Algoritma 3.19. Penggabungan Senarai Salin Senarai (Copy)

Membuat salinan senarai L1 ke L2

K. Awal K.Akhir

L1.First

45 60 80

L2.First

45 60 80

Gambar 3.17. Menyalin Senarai

procedure Copy(input L1: Senarai, output L2: Senarai) {menyalin senarai L1 ke senarai L2}

{K. Awal: L1terdefinisi}

{K.Akhir: L2 terdefinisi, merupakan salinan dari L1} Deklarasi: P,Q: Address Deskripsi: Create(L2) P  L1.First while P ≠ Nil do Alokasi(Q) Next(Q)  Nil Info(Q)  Info(P) InsertLast(L2,Q) P  Next(P) endwhile

Balik Senarai (Reverse)

Membalik senarai L1, hasilnya adalah senarai L2

K. Awal K.Akhir

L1.First

45 60 80

L2.First

80 60 45

Gambar 3.18. Balik Senarai

procedure Reverse(input L1: Senarai, output L2: Senarai) {menyalin senarai L1 ke senarai L2 secara terbalik} {K. Awal: L1terdefinisi}

{K.Akhir: L2 terdefinisi, merupakan balikan dari L1} Deklarasi: P,Q: Address Deskripsi: Create(L2) P  L1.First while P ≠ Nil do Alokasi(Q) Next(Q)  Nil Info(Q)  Info(P) InsertFirst(L2,Q) P  Next(P) endwhile

Algoritma 3.21. Membalik Senarai Mengambil Info Tertentu (Query)

Contoh: diketahui senarai L1, akan diambil elemen senarai yang info-nya < X, hasilnya disimpan di senarai L2

K. Awal K.Akhir L1.First 70 53 80 L2.First 53 40 54 54 40 65 Mis. X = 55

Gambar 3.20. Mengambil Info Tertentu

procedure QueryX(input L1: Senarai, input X: TInfo, output L2: Senarai)

{menyalin senarai L1 yang info-nya < X ke senarai L2 } {K. Awal: L1terdefinisi}

{K.Akhir: L2 terdefinisi, merupakan hasil query, semua infonya < X} Deklarasi: P,Q: Address Deskripsi: Create(L2) P  L1.First while P ≠ Nil do if Info(P) < X then Alokasi(Q) Next(Q)  Nil Info(Q)  Info(P) InsertLast(L2,Q) endif P  Next(P) endwhile

3.3.6 Senarai yang Info-nya Terstruktur

Tipe informasi yang disimpan di dalam elemen senarai dapat merupakan tipe terstruktur, seperti terlihat pada Algoritma 3.23.

Deklarasi global:

type DataMhs = record

<Nama: string[20], NIM: string[12], IPK: real> type Address = pointer to Elemen

type Elemen = record <Info: DataMhs, Next: Address> type Senarai = record <First: Address>

L: Senarai

P: Address

{First menyimpan alamat elemen pertama senarai}

{P adalah variabel yang menyimpan alamat sebuah elemen} {Cara akses:

Info(P).Nama: mengakses Nama dari elemen yang alamatnya P Info(P).NIM: mengakses NIM dari elemen yang alamatnya P Info(P).IPK: mengakses IPK dari elemen yang alamatnya P Next(P): mengakses alamat elemen setelah elemen dengan alamat P}

procedure Alokasi(output P: Address)

{memesan satu unit penyimpan untuk dijadikan elemen senarai} {K. Awal: - }

{K.Akhir: P terdefinisi, siap digunakan sebagai elemen list} procedure DeAlokasi(input P: Address)

{K. Awal: P terdefinisi}

{K.Akhir: P dikembalikan ke sistem}

Contoh 3.6:

Diketahui senarai yang info elemennya bertipe data mahasiswa. Buat algoritma untuk mencetak semua data mahasiswa yang IPK-nya ≥3.0. Jika senarai kosong, cetak pesan “senarai kosong”. Jika tidak ada mahasiswa yang IPK-nya ≥3.0 maka cetak pesan “tidak ada mahasiswa yang IPK-nya≥3.0”

procedure Cetak3(input L: Senarai)

{mencetak semua data mahasiswa yang IPK-nya ≥ 3.0} {K. Awal: L terdefinisi, mungkin kosong}

{K.Akhir: Semua data mahasiswa yang IPK-nya ≥ 3.0 dicetak Jika senarai kosong cetak “senarai kosong”

Jika tidak ada data mahasiswa yang IPK-nya ≥ 3.0, cetak “tidak ada mahasiswa yang IPK-nya ≥ 3.0” } Deklarasi:

P: Address Cetak: boolean Deskripsi:

if L.First = Nil then write (“Senarai Kosong”) else P  L.First Cetak  false repeat if (Info(P).IPK ≥ 3.0) then write (Info(P)) Cetak  true endif P  Next(P) until P = Nil if not Cetak then

write (“tidak ada mahasiswa yang IPK-nya≥ 3.0”) endif

endif

Dalam dokumen BAB 1 PENGANTAR KE STRUKTUR DATA (Halaman 21-42)

Dokumen terkait