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