• Tidak ada hasil yang ditemukan

BAB 1 PENGANTAR KE STRUKTUR DATA

N/A
N/A
Protected

Academic year: 2021

Membagikan "BAB 1 PENGANTAR KE STRUKTUR DATA"

Copied!
92
0
0

Teks penuh

(1)

BAB 1

PENGANTAR KE STRUKTUR DATA

1.1 Mengapa Struktur Data Diperlukan?

Struktur data adalah cara mengorganisakan data di memori komputer. Bagaimana data diorganisasikan (struktur data) akan menentukan unjuk kerja program yang memroses data tersebut.

Struktur data akan membuat program yang dibangun menjadi lebih efisien. Setiap tahun teknologi perangkat keras makin baik, unjuk kerja komputer makin baik, pemrosesan makin cepat, memori tersedia makin besar. Mengapa efisiensi diperlukan?

Diskusikan!

Struktur data selalu berkaitan dengan program. Membahas program berarti membahas algoritma. Sehingga dalam setiap bahasan struktur data pasti ada bahasan algoritma.

Untuk lebih memudahkan belajar struktur data, berikut akan dibahas mengenai tinjauan instruksi dan notasi algoritma secara ringkas.

1.2 Tinjauan Algoritma

Algoritma adalah urutan langkah untuk menyelesaikan masalah. Dalam konteks pemrograman algoritma adalah rancangan urutan instruksi yang nantinya akan diterjemahkan ke bahasa pemrograman dan dieksekusi oleh komputer.

Secara sederhana algoritma terdiri dari tiga bagian, yaitu:

1. Judul algoritma: memuat identitas algoritma berupa nama algoritma, keterangan mengenai proses apa yang dilakukan dalam algoritma. Jika algoritma tersebut berupa procedure atau function harus dinyatakan data yang berinteraksi dengan procedure atau function tersebut

2. Bagian deklarasi memuat deklarasi nama dan tipe data serta subprogram (procedure dan atau function) yang digunakan di dalam algoritma.

(2)

3. Bagian deksripsi berisi rancangan instruksi yang harus dieksekusi oleh komputer.

1.3 Tipe Data

Tipe data menentukan himpunan nilai yang terkandung di dalam data tersebut serta operasi apa saja yang berlaku terhadap data tersebut,

Secara garis besar ada dua macam tipe data, yaitu tipe data dasar dan tipe data bentukan. Tipe data dasar adalah tipe yang dapat langsung dipakai sedangkan tipe data bentukan harus didefinisikan terlebih dahulu dari tipe dasar yang ada. Tipe bentukan didefinisikan jika persoalan yang akan diprogram tidak dapat didefinisikan dengan tipe dasar yang ada. Tabel I memuat tipe data dasar secara ringkas.

TABEL I TIPE DATA DASAR

Nama Tipe Rentang Nilai Operasi

boolean benar (true), dinyatakan dengan angka 1

salah (false), dinyatakan dengan angka 0

Operasi logika: and, or, not, xor menghasilkan nilai bertipe boolean

integer Secara teoritis tidak terbatas, ditentukan oleh komputer dan compiler yang digunakan.

Operasi aritmatika: +, -, *, div, mod menghasilkan nilai bertipe integer

Operasi perbandingan: =, ≠, >, <, ≥, ≤ menghasilkan nilai bertipe boolean

(3)

Tabel I. Tipe Data Dasar (Lanjutan)

Nama Tipe Rentang Nilai Operasi

real Secara teoritis tidak terbatas, ditentukan oleh komputer dan compiler yang digunakan.

Operasi aritmatika: +, -, *, /

menghasilkan nilai bertipe real Operasi perbandingan:

≠, >, <, ≥, ≤ menghasilkan nilai bertipe boolean

character Semua karakter yang dikenal oleh komputer. Lihat tabel kode ASCII

Operasi perbandingan: =, ≠, >, <, ≥, ≤ menghasilkan nilai bertipe boolean

string Rangkaian karakter dengan panjang tertentu

Operasi penyambungan: +

menghasilkan nilai bertipe string

Operasi perbandingan =, ≠, >, <, ≥, ≤ menghasilkan nilai bertipe boolean

Tipe Data Bentukan

Didefinisikan sendiri oleh pemrogram (user defined data type), dibentuk dari satu atau lebih tipe dasar, disebut rekaman. Setiap rekaman terdiri dari satu atau lebih field. Tiap field menyimpan data dari tipe dasar atau tipe bentukan lain yang sudah didefinisikan.

(4)

Contoh 1.1: Tipe data bentukan

type Date = record <Tgl: integer, Bln: integer, Thn: integer, type DataMhs = record <Nama: string[25],

NIM: string[12], Tgl_Lahir: Date, IPK: real>

Algoritma 1.1 Contoh Tipe Data Bentukan 1.4 Instruksi

Ada tiga macam instruksi di dalam algoritma, yaitu: runtunan (sequence), pemilihan dan pengulangan.

Instruksi Runtunan

Rangkaian instruksi yang diproses secara berurutan, mulai dari instruksi pertama sampai instruksi terakhir.

Contoh 1.2:

Algoritma menukar dua bilangan bulat X dengan Y. Algoritma MenukarXY

{membaca masukan X dengan Y, kemudian mempertukarkan X dengan Y} Deklarasi: X,Y: integer temp: integer Deskripsi: read(X) read(Y) temp  X X  Y Y  temp

(5)

Instruksi Pemilihan

Ada tiga macam, yaitu pemilihan dengan satu kasus, pemilihan dengan dua kasus komplementer, dan pemilihan dengan dua atau lebih kasus.

Contoh 1.3: Pemilihan dengan satu kasus

Algoritma untuk membaca sebuah bilangan bulat dan mencetak kata “kelipatan 3” jika bilangan yang dibaca tersebut merupakan kelipatan 3.

Algoritma Kelipatan3

{membaca masukan X kemudian mencetak kata “kelipatan 3” jika bilangan tersebut merupakan kelipatan 3}

Deklarasi: X: integer Deskripsi: read(X) if X mod 3 = 0 then write (“kelipatan 3”) endif

Algoritma 1.3 Mencetak “kelipatan 3” jika data masukan kelipatan tiga Contoh 1.4: Pemilihan dengan dua kasus komplementer.

Algoritma untuk membaca sebuah bilangan bulat dan mencetak pesan “bilangan ganjil” jika bilangan yang dibaca tersebut bernilai ganjil dan mencetak pesan “bilangan genap” jika sebaliknya.

Algoritma GanjilGenap

{membaca masukan X kemudian mencetak kata “bilangan ganjil” jika bilangan tersebut bernilai ganjil dan mencetak

“bilangan genap” jika sebaliknya} Deklarasi:

X: integer Deskripsi: read(X)

if X mod 2 = 1 then

write (“bilangan ganjil”) else

write(“bilangan genap”) endif

(6)

Contoh 1.5: Pemilihan dengan 2 atau lebih kasus

Algoritma yang membaca bilangan bulat kemudian menentukan apakah bilangan tersebut positif atau negatif atau sama dengan nol.

Algoritma ApakahPositif

{membaca masukan X kemudian menentukan apakah bilangan tersebut positif, atau negatif atau sama dengan 0}

Deklarasi: X: integer Deskripsi: read(X) if X > 0 then write (“positif”) else if X < 0 then write (“negatif”) else write (“nol”) endif endif

Algoritma 1.5 Menentukan apakah bilangan positif atau negatif atau nol Instruksi Pengulangan

Ada 3 macam, yaitu dengan for-to-do, dengan while-do dan dengan repeat-until. Contoh 1.6: Pengulangan dengan for-to-do

Algoritma untuk mencetak bilangan 1 sampai dengan 10 secara berurutan. Algoritma CetakFor

{mencetak bilangan 1 s.d 10 secara berurutan dengan for-to-do} Deklarasi: k: integer Deskripsi: for k  1 to 10 do write(k) endfor

(7)

Contoh 1.7: Pengulangan dengan while-do

Algoritma untuk mencetak bilangan 1 sampai dengan 10 secara berurutan. Algoritma CetakWhile

{mencetak bilangan 1 s.d 10 secara berurutan dengan while-do} Deklarasi: k: integer Deskripsi: k  1 while k ≤ 10 do write (k) k  k + 1 endwhile

Algoritma 1.7 Mencetak 1 s.d.10 dengan while-do Contoh 1.8: Pengulangan dengan repeat-until

Algoritma untuk mencetak bilangan 1 sampai dengan 10 secara berurutan. Algoritma CetakRepeat

{mencetak bilangan 1 s.d 10 secara berurutan dengan repeat-until} Deklarasi: k: integer Deskripsi: k  1 repeat write(k) k  k + 1 until k > 10

(8)

BAB 2 LARIK

Salah satu alasan mengapa komputer digunakan untuk mengolah data adalah karena data yang diolah banyak dan dari tipe yang sama.

Larik (array) adalah tempat menyimpan sekumpulan elemen data dengan tipe yang sama. Setiap elemen data diacu menggunakan indeks. Indeks menunjukkan posisi relatif elemen data tersebut di dalam kumpulannya.

2.1 Deklarasi Larik

Sebelum dapat digunakan untuk menyimpan data, terlebih dulu larik harus dideklarasikan. Mendeklarasikan larik artinya memesan sejumlah tempat di memori sesuai dengan ukuran larik yang dideklarasikan. Larik bersifat statis, artinya ukuran larik harus sudah diketahui sebelum program dieksekusi dan ukuran larik tidak berubah selama program dieksekusi.

Deklarasi larik artinya mendefinisikan nama lariknya, ukuran dan tipe elemen larik tersebut. Tipe elemen larik dapat bertipe dasar atau bertipe bentukan. Contoh 2.1: deklarasi larik sebagai variabel

A: array[1..100] of integer

Algoritma 2.1 Deklarasi larik sebagai variabel

Algoritma 2.1 menunjukkan deklarasi larik A dengan 100 elemen larik, semua elemen larik bertipe integer.

Contoh 2.2: deklarasi larik sebagai tipe

type Larik = array[1..100] of integer A: Larik

(9)

Contoh 2.3: deklarasi larik menggunakan konstanta const NMAX = 100

type Larik = array[1..NMAX] of integer A: Larik

Algoritma 2.3 Deklarasi larik menggunakan konstanta

Algoritma 2.1, Algoritma 2.2 dan Algoritma 2.3 sama-sama mendeklarasikan larik A bertipe integer dengan 100 elemen. Namun pada Algoritma 2.2 deklarasi larik melalui tipe bentukan, sedangkan pada Algoritma 2.3, banyak elemen larik tidak dideklarasikan secara langsung dengan angka melainkan menggunakan konstanta. Dengan deklarasi seperti Algoritma 2.3, jika diperlukan ukuran larik diubah maka kita hanya mengubah nilai konstanta NMAX.

Setelah mendeklarasikan larik, komputer akan menyediakan lokasi memori sebanyak yang dideklarasikan. Gambar 2.1 mengilustrasikan lokasi memori untuk larik A. [1] [2] [3] [4] [5] [6] [7] ... ... ... ... [99] [NMAX]

(10)

Untuk mengacu elemen larik digunakan indeks. Nilai indeks harus terdefinisi. Indeks merupakan tipe yang memiliki keterurutan (integer atau karakter)

Contoh 2.4: mengacu elemen larik

A[17], artinya mengacu elemen ke-17 dari larik A

A[k], artinya mengacu elemen ke-k dari larik A, tentu saja harga k harus sudah terdefinisi

A[k+1], artinya mengacu elemen ke-k+2 dari larik A

2.2 Pemrosesan Larik Secara Sekuensial

Pemrosesan terhadap elemen larik dilakukan secara berurutan (sekuensial) sesuai dengan indeksnya. Elemen larik diproses mulai dari elemen pertama sampai elemen terakhir (elemen dengan indeks terbesar) atau sampai elemen tertentu yang diinginkan secara berurutan.

Skema umum pemrosesan larik adalah dapat dilihat pada Algoritma 2.4 Algoritma PemrosesanLarik

{Skema pemrosesan larik secara beruntun} Deklarasi:

const NMAX = 100 {maksimum elemen larik} type Larik = array[1..NMAX] of integer A: Larik

k: integer {indeks larik} Deskripsi:

for k  1 to NMAX do Proses(A[k])

endfor

Algoritma 2.4 Skema Umum Pemrosesan Larik

Proses(A[k]) adalah aksi tertentu terhadap elemen A[k], tergantung persoalan yang akan diselesaikan.

(11)

Konstanta NMAX menyatakan maksimum banyaknya elemen larik. Terkadang banyak data yang akan disimpan tidak mencapai NMAX. Misalnya ada N elemen data yang akan disimpan di dalam larik, maka dari NMAX elemen larik yang efektif terpakai untuk menyimpan ada hanya N elemen. N disebut indeks efektif larik. Tentu saja N <= NMAX. Pada Gambar 2.2, bagian larik yang diarsir adalah bagian yang digunakan untuk menyimpan data.

[1] [2] [3] [4] [5] [6] [7] ... ... ... ... [N] [99] [NMAX]

Gambar 2.2 Larik A[1..N] elemen

Contoh 2.5: mengisi larik melalui pembacaan

Larik yang sudah dideklarasi belum terdefinisi nilainya. Kita dapat menyimpan data ke dalam larik tersebut. Data yang akan disimpan dapat diperoleh dari operasi pembacaan melalui piranti masukan (keyboard). Algoritma 2.5 adalah proses mengisi larik melalui operasi pembacaan.

Untuk menyederhanakan penulisan, maka pada contoh-contoh selanjutnya larik yang akan digunakan adalah larik seperti deklarasi pada Algoritma 2.4. Selain itu semua contoh algoritma pemrosesan larik akan disajikan dalam bentuk sub program baik dalam prosedur maupun fungsi.

(12)

procedure BacaLarik(output A: Larik, input N: integer) {mengisi elemen larik A[1..N] melalui pembacaan}

{K. Awal: N terdefinisi, yaitu banyak elemen efektif larik} {K.Akhir: Larik A[1..N] terdefinisi

Deklarasi:

k: integer {indeks larik} Deskripsi:

for k  1 to N do read(A[k]) endfor

Algoritma 2.5 Mengisi elemen larik melalui pembacaan Gambar 2.3 mengilustrasikan keadaan larik sebelum dan setelah pembacaan. Misalkan terdefinisi N = 10 [1] [1] 67 [2] [2] 75 [3] [3] 56 [4] [4] 89 [5] [5] 45 [6] [6] 66 [7] [7] 77 .... [8] 69 [9] 59 [N] 72 ... [NMAX] [NMAX] (a) (b) Gambar 2.5 (a) K.Awal (b) Keadaan Akhir dari Algoritma 2.5

(13)

Contoh 2.6: menentukan harga maksimum larik

Diketahui larik A[1..N] yang sudah terdefinisi nilainya. Algoritma akan menentukan harga maksimum elemen larik.

procedure TentukanMaks(input A: Larik, input N: integer, output Maks: integer)

{menentukan harga maksimum elemen larik A[1..N] } {K. Awal: Larik A[1..N] terdefinisi}

{K.Akhir: Maks terdefinisi, yaitu harga maksimum larik} Deklarasi:

k: integer {indeks larik} Deskripsi:

Maks  A[1] for k  2 to N do if A[k] > Maks then Maks  A[k] endif

endfor

Algoritma 2.6 Menentukan harga maksimum elemen larik 2.4 Larik Bertipe Terstruktur

Pada contoh-contoh yang sudah dibahas digunakan larik bertipe sederhana, yaitu larik bertipe integer. Elemen larik juga dapat bertipe .

Contoh 2.7: larik yang elemennya bertipe terstruktur const NMHS = 100

type DataMhs = record <NIM: string[12], Nama: string[20], IPK: real>

type LarikMhs = array[1..NMHS] of DataMhs AMhs: LarikMhs

(14)

Gambar 2.6 mengilustrasikan larik AMhs[1..N]. Misalkan terdefinisi N = 8 [1] 6789 Tiger Woods 2.8 [2] 7890 Ronaldo 3.1 [3] 5678 Roger Federer 3.0 [4] 2345 Serena Williams 2.9 [5] 1234 Taufik Hidayat 3.7 [6] 3456 Valentino Rossi 2.9 [7] 8901 Michael Jordan 3.2 [N] 4567 Schummacher 3.3 [NMAX]

Gambar 2.6 Contoh Larik Bertipe Terstruktur

Contoh 2.7: mencari data mahasiswa dengan IPK tertinggi.

Algoritma akan memberikan keluaran berupa data mahasiswa dengan IPK tertinggi. gunakan prinsip Algoritma 2.6. Jika mengacu ke Gambar 2.6, maka keluaran MhsTerbaik = <”1234”, “Taufik Hidayat”, 3.7>

procedure CariMhsTerbaik(input AMhs: LarikMhs, input N: integer,

output MhsTerbaik: DataMhs) {mencari data mahasiswa dengan IPK tertinggi } {K. Awal: Larik AMhs[1..N] terdefinisi}

{K.Akhir: MhsTerbaik terdefinisi, yaitu data mahasiswa dengan IPK tertinggi}

Deklarasi:

k: integer {indeks larik} Deskripsi:

(15)

for k  2 to N do

if AMhs[k].IPK > MhsTerbaik.IPK then MhsTerbaik  A[k]

endif endfor

Algoritma 2.8 Mencari data mahasiswa dengan IPK tertinggi 2.4 Pencarian Pada Larik

Proses sekuensial lain yang sering dilakukan adalah pencarian terhadap elemen data tersebut.

Contoh 2.8: mencari keberadaan X di dalam larik integer A[1..N] versi 1. Jika diketahui larik A[1..N], algoritma akan mencari keberadaan X di dalam larik. Jika X ada di dalam larik maka algoritma akan memberikan keluaran true, jika tidak maka akan memberikan keluaran false.

Mengacu ke Gambar 2.5(b), misalkan X yang dicari = 60, maka Found = false, misalkan X yang dicari = 77, maka Found = true

procedure CariX(input A:: Larik, input N: integer, output Found: boolean)

{mencari keberadaan X di dalam larik integer A[1..N] } {K. Awal: Larik A[1..N] terdefinisi, X terdefinisi} {K.Akhir: Jika X ditemukan maka Found = true, jika tidak maka Found = false}

Deklarasi:

k: integer {indeks larik} Deskripsi:

Found  false k  1

while not Found and k ≤ N do if A[k] = X then Found  true else k  k + 1 endif endwhile

(16)

Contoh 2.9: mencari keberadaan X di dalam larik integer A[1..N] versi 2. Jika diketahui larik A[1..N], algoritma akan mencari keberadaan X di dalam larik. Jika X ada di dalam larik maka algoritma akan memberikan keluaran IdX berupa nilai integer yaitu indeks tempat X ditemukan.Jika tidak maka IdX = -1. Mengacu ke Gambar 2.5(b), misalkan X yang dicari = 60, maka IdX = -1, misalkan X yang dicari = 77, maka IdX = 7

procedure CariIdX(input A:: Larik, input N: integer, output IdX: integer)

{mencari keberadaan X di dalam larik integer A[1..N] } {K. Awal: Larik A[1..N] terdefinisi, X terdefinisi} {K.Akhir: Jika X ditemukan maka IdX adalah tempat X ditemukan, jika tidak maka IdX = -1} Deklarasi:

k: integer {indeks larik} Found: boolean

Deskripsi: Found  false k  1

while not Found and k ≤ N do if A[k] = X then Found  true else k  k + 1 endif if Found then IdX  k else IdX  -1 endif

Algoritma 2.10 Mencari keberadaan X di dalam larik integer A[1..N] versi 2

2.5 Pengurutan Data

Mengurutkan data adalah pekerjaan yang sering dilakukan dalam pemrosesan data. Ada berbagai metode pengurutan data seperti metode gelembung, metode seleksi, metode sisip dan metode-metode lain yang memerlukan kajian struktur

(17)

data lanjutan. Pada buku ini akan dibahas metode pengurutan yang paling sederhana, yaitu metode gelembung.

procedure Pengurutan(input/output A: Larik, input N: integer)

{mengurutkan elemen larik A[1..N]dari kecil ke besar dengan metode gelembung }

{K. Awal: Larik A[1..N] terdefinisi}

{K.Akhir: Larik A[1..N] terurut dari kecil ke besar} Deklarasi:

i,k: integer temp: integer

Deskripsi:

for i  1 to N-1 do for k  N downto i+1 do if A[k] < A[k-1] then temp  A[k] A[k]  A[k-1] A[k-1]  temp endif endfor endfor

Algoritma 2.11 Mengurutkan data dari kecil ke besar dengan metode gelembung Soal Latihan

1. Buat algoritma untuk mencari harga minimum larik A[1..N]

2. Buat algoritma untuk menentukan indeks tempat harga minimum larik A[1..N] berada.

3. Buat algoritma untuk mengurutkan elemen larik A[1..N] dari besar ke kecil 4. Buat algoritma untuk mengurutkan elemen larik mahasiswa dari kecil ke

(18)

BAB 3 SENARAI

3.1 Alasan Menggunakan Senarai

Misalkan satu perusahaan besar akan mengadakan pertemuan antar kantor cabang perusahaan. Ada 500 orang yang akan menjadi peserta pertemuan yang akan tinggal di lima hotel yang berbeda. Setiap peserta diberi kebebasan untuk memilih hotel tempatnya menginap. Mungkin saja ke-500 peserta akan tinggal di satu hotel yang sama (ke-4 hotel lainnya kosong), atau 500 peserta tersebut akan tersebar di 5 hotel yang berbeda. Panitia pertemuan perlu membuat daftar peserta menurut hotel dan meminta kita untuk membuat program untuk keperluan tersebut. Kita dapat menggunakan larik untuk masing-masing hotel, jadi diperlukan lima larik yang masing-masing didefinisikan untuk menampung jumlah maksimum peserta.

Penggunaan larik untuk setiap hotel akan menghabiskan tempat sia-sia, karena 5 hotel dikalikan 500 peserta = 2500 elemen larik. Akan data 2000 elemen larik yang tidak terpakai. Idealnya, informasi mengenai peserta harus disimpan sedemikian rupa sehingga hanya yang diperlukan saja yang dideklarasikan. Perhatikan Gambar 3.1. H1 H2 H3 H4 H5 [1] [1] [1] [1] [1] [2] [3] [500] [500] [500] [500] [500]

(19)

Jika persoalan tersebut direpresentasikan dengan senarai seperti terlihat pada Gambar 3.2.

H1 H2 H3 H4 H5

2 3 4 5 6 7 8 9 10 11 12

1 . . . 499 500

Gambar 3.2. Senarai dari Gambar 1

Dengan senarai cukup disediakan sebuah larik dengan 500 elemen yang digunakan untuk merepresentasikan lima daftar (list) peserta yang menginap di lima hotel.

3.2 Definisi Senarai

Dari Gambar 2 terlihat bahwa setiap elemen larik, selain menyimpan data juga menyimpan “alamat” (dalam Gambar 2 berupa indeks) sebagai penunjuk (pointer) posisi elemen larik yang mengikutnya. Elemen yang menyimpan data dan “alamat” seperti ini disebut elemen senarai. Jadi senarai adalah sekumpulan elemen bertipe sama, setiap elemen terdiri dari dua bagian, yaitu bagian yang menyimpan informasi dan bagian yang menyimpan alamat elemen berikutnya. Gambar 3.3 menunjukkan senarai secara lojik

Info Next

First (a)Elemen Senarai

(b) Senarai Kosong First

(c) Senarai Dengan 3 Elemen

Gambar 3.3. (a) Elemen Senarai, (b) Senarai Kosong, (c)Senarai Dengan 3 Elemen

(20)

Secara algoritmik, definisi senarai dapat dilihat pada Algoritma 3.1. Deklarasi global:

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = pointer to Elemen

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

P: Address L: Senarai

{First menyimpan alamat elemen pertama senarai}

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

Info(P): mengakses info 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}

Algoritma 3.1. Deklarasi Senarai

TInfo adalah tipe terdefinisi yang merepresentasikan informasi yang akan disimpan di dalam elemen .

Tipe Address adalah tipe yang menyimpan alamat elemen, bisa berupa indeks larik ataupun alamat memori, tergantung nanti bagaimana senarai direpresentasikan.

Senarai dikenali melalui alamat elemen pertamanya. Dengan demikian jika didefinisikan First adalah alamat elemen pertama, maka elemen berikut dapat diakses secara berurutan melalui Next.

Mengapa harus senarai? Senarai adalah struktur data yang dinamis, ukurannya (banyak elemen) dapat berubah selama eksekusi program. Menghemat memori

(21)

3.2 Tipe Pointer

Setiap elemen menyimpan “alamat” elemen berikutnya. Ada dua cara untuk merepresentasikan alamat. Jika senarai dibangun menggunakan larik, maka alamat adalah indeks larik. Jika senarai dibangun langsung dari memori, maka alamat adalah alamat memori.

Tipe pointer adalah fasilitas bahasa yang digunakan untuk menangkap ekivalensi dari alamat memori.

Notasi algoritmik untuk tipe pointer adalah sebagai berikut:

Nama tipe: pointer to

Rentang nilai: alamat sel memori

Konstanta: Nil, untuk menyatakan alamat tidak terdefinisi Operator perbandingan: = dan ≠, menghasilkan nilai boolean

3.3 Operasi Dasar Terhadap Senarai 1. Create: membuat senarai kosong

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

(22)

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}

(23)

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

(24)

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

(25)

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.

(26)

(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

(27)

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

(28)

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

(29)

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:

(30)

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)

(31)

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

(32)

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

(33)

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

(34)

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)

(35)

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.

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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}

(41)

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

(42)

3.4 Multi Linked List

Senarai yang elemennya senarai.

Contoh 3.7: senarai data pegawai anak-anaknya

type DataAnak = record <Id_Anak: string[9], Nama: string[25], Tgl_Lahir: Date> type AddressA = pointer to CellAnak

type CellA = record <InfoA: DataAnak, NextA: AddressA> type DataPeg = record <NIP: string[12],

Nama: string[25], Tgl_Lahir: Date, Departemen: character> type AddressP = pointer to CellP

type CellP = record <InfoP: DataPeg, NextA: AddressA, NextP: AddressP>

type ListPeg = record <FirstP: AddressP>

L: ListPeg {L adalah senarai pegawai} Algoritma 3.25 Deklarasi senarai pegawai dengan anak-anaknya

Gambar 3.21 memberikan ilustrasi mengenai senarai pegawai dan anak-anaknya. Bahan diskusi:

Apakah identitas orang tua (NIP) perlu disimpan juga di dalam DataAnak? Berikan alasannya

(43)

N e x tP NextA Elemen CellP InfoP NextA Elemen CellA InfoA N e x tP Pegawai1 N e x tP N e x tP FirstP . . . Anak1Pegawai1

Pegawai2 Pegawai3 PegawaiN

Anak2Pegawai1

Anak1Pegawai3 Anak1PegawaiN

Anak2PegawaiN

Anak3PegawaiN

(44)

Soal Latihan

1. Buat algoritma untuk mencetak semua info elemen senarai yang bernilai genap. Jika senarai kosong, maka cetak pesan “tidak ada elemen”. Jika senarai tidak kosong maka semua info yang bernilai genap dicetak. Jika tidak ada info yang bernilai genap, maka cetak pesan “tidak ada info bernilai genap”.

2. Buat algoritma untuk memperoleh info maksimum elemen senarai

3. Sama seperti Soal No. 2, tetapi keluarannya adalah alamat tempat info maksimum berada.

4. Buat algoritma untuk menukar info maksimum dengan info elemen pertama senarai.

5. Buat algoritma untuk menghitung total info elemen senarai

6. Buat algoritma untuk menghitung harga rata-rata info elemen senarai. Untuk menghitung harga rata-rata pastikan bahwa senarai tidak kosong, supaya tidak ada pembagian dengan 0.

7. Diketahui senarai yang info elemennya terurut dari kecil ke besar. Buat algoritma untuk menyisipkan sebuah elemen dengan tetap menjaga keterurutan.

8. Buat algoritma untuk menyisipkan sebuah elemen sebagai elemen ke-k dari senarai.

9. Buat algoritma untuk menghapus semua elemen senarai yang info-nya = X. 10. Buat algoritma untuk menghapus elemen senarai yang menyimpan info

terkecil (minimum)

11. Buat algoritma untuk menyambung senarai S1 dengan senarai S2, dengan senarai S2 berada” di depan” senarai S1.

12. Diketahui senarai S1 dan S2 yang info-nya terurut dari besar ke kecil. Buat algoritma untuk menggabung senarai S1 dengan S2, dan hasil penggabungan tetap terurut dari besar ke kecil.

13. Diketahui senarai S1 dan S2 yang info-nya terurut dari kecil ke besar. Buat algoritma untuk menggabung senarai S1 dengan S2, dan hasil penggabungan terurut dari besar ke kecil.

(45)

14. Buat algoritma untuk mengambil info yang bernilai ganjil dari senarai S1 dan menyimpannya di senarai S2

15. Diketahui senarai yang info elemennya bertipe DataMhs (deklarasi Algoritma 20), buat algoritma untuk memperoleh data mahasiswa dengan IPK tertinggi. Keluaran bertipe DataMhs.

16. Buat algoritma untuk mencari keberadaan data mahasiswa yang NIM-nya = NIMX. Algoritma akan memberikan keluaran bertipe boolean, true jika data ditemukan dan false jika data tidak ditemukan.

17. Dengan deklarasi yang sama seperti Soal No. 15, buat algoritma untuk menghitung IPK rata-rata seluruh mahasiswa.

18. Diketahui senarai yang info elemennya bertipe mahasiswa, terurut dari kecil ke besar berdasarkan NIM. Buat algoritma untuk menyisipkan elemen yang alamatnya P, setelah penyisipan senarai tetap terurut.

19. Buat algoritma untuk menghapus elemen senarai mahasiswa yang NIM-nya = NIMX

20. Buat algoritma untuk menghapus semua elemen senarai mahasiswa yang IPK-nya < 2.0

21. Buat algoritma untuk mengambil semua data mahasiswa dengan IPK ≤ 2.0 dan menyimpannya di senarai L2.

22. Berdasarkan deklarasi data pegawai beserta anak-anaknya (Gambar 3.21), tuliskan algoritma untuk mencetak data pegawai beserta anak-anaknya. 23. Tuliskan algoritma untuk mencetak semua data pegawai yang tidak

memiliki anak.

24. Buat algoritma untuk menentukan data orang tua jika diberi masukan identitas anaknya.

(46)

BAB 4 ANTRIAN 4.1 Pengertian Dasar

Secara lojik antrian (queue) adalah senarai yang penyisipan elemen hanya dilakukan sebagai elemen terakhir dan penghapusan elemen hanya dilakukan terhadap elemen pertama. Struktur data antrian digunakan memodelkan antrian, misalnya antrian proses pada sistem multiprogramming, antrian nasabah di bank, antrian paket data yang akan dilewatkan di jaringan, antrian dokumen yang akan dicetak di printer bersama, dan sebagainya.

Seperti layaknya antrian di dunia nyata, maka elemen baru disisipkan sebagai elemen terakhir dan elemen yang dihapus adalah elemen paling depan. Berlaku prinsip FIFO (first in first out). Secara algoritmik, deklarasi antrian seperti terlihat pada Algoritma 4.1.

Deklarasi:

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = pointer to Elemen

type Elemen = record <Info: TInfo, Next: Address> type Antrian = record <Head: Address, Tail: Address> Q: Antrian

Algoritma 4.1 Deklarasi Antrian

Antrian dikenali melalui alamat elemen pertama (Head) dan alamat elemen terakhir (Tail).

Antrian kosong adalah antrian yang tidak memiliki elemen, Head = Nil dan Tail = Nil.

Head

(a) Antrian Kosong Head

(b) Antrian Dengan 3 Elemen Tail

Tail Head

(c) Antrian Dengan 1 Elemen Tail

Gambar 4.1. (a) Antrian Kosong, (b) Antrian Dengan 3 Elemen, (c) Antrian Dengan 1 Elemen

(47)

4.2 Operasi Dasar Terhadap Antrian 1. Membuat Antrian Kosong (CreateQ) 2. Menyisipkan Elemen (EnQueue) 3. Menghapus Elemen (DeQueue) 4. Memeriksa Apakah Antrian Kosong 4.2.1 Membuat Antrian Kosong

Antrian kosong adalah Head = Nil, Tail = Nil procedure CreateQ(output Q: Antrian) {membuat antrian kosong}

{K. Awal: - }

{K.Akhir: Antrian Q terdefinisi} Deklarasi:

Deskripsi: Q.Head  Nil Q.Tail  Nil

Algoritma 4.2. Membuat Antrian Kosong 4.2.2 Memeriksa Apakah Antrian Kosong

Fungsi IsEmptyQ mengembalikan true jikaantrian Q kosong function IsEmptyQ(input Q: Antrian)

{mengembalikan true jika antrian Q kosong} Deklarasi:

Deskripsi:

return (Q.Head = Nil and Q.Tail = Nil)

(48)

4.2.3 Menyisipkan Elemen Antrian (EnQueue)

Head Head

58 73 58 73 X

X

Sebelum Penyisipan Setelah Penyisipan

Tail Tail

Gambar 4.2. Penyisipan Elemen Antrian (EnQueue)

procedure EnQueue(input/output Q:Antrian, input X: TInfo) {menyisipkan X sebagai elemen antrian}

{K. Awal: Q terdefinisi, mungkin kosong, X terdefinisi} {K.Akhir: X menjadi elemen antrian}

Deklarasi: P: Address Deskripsi: Alokasi(P) Next(P)  Nil Info(P)  X if IsEmptyQ(Q) then Q.Head  P Q.Tail  P else Next(Q.Tail)  P Q.Tail  P endif

(49)

4.2.4 Menghapus Elemen Antrian (DeQueue) Head Head 73 60 58 73 60 X = 58 Setelah Penghapusan Tail Tail

Gambar 4.3. Menghapus Elemen Antrian (DeQueue)

procedure DeQueue(input/output Q:Antrian, output X: TInfo) {menghapus elemen antrian}

{K. Awal: Q terdefinisi, tidak kosong}

{K.Akhir: X adalah elemen yang dihapus, antrian mungkin jadi kosong}

Deklarasi: Deskripsi:

X  Info(Q.Head)

if Q.Head = Q.Tail then {antrian dengan satu elemen} Q.Head  Nil

Q.Tail  Nil else

Q.Head  Next(Q.Head) endif

(50)

4.3 Representasi Fisik Antrian Dengan Larik

Antrian dapat direpresentasi secara fisik dengan dua cara, yaitu menggunakan pointer dan menggunakan larik

Algoritma 4.6 menunjukkan antrian yang direpresentasi menggunakan larik Deklarasi:

const NMAX = 100 {maksimum elemen larik}

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = integer[0..NMAX]

type Antrian = record <Head: Address, Tail: Address, ArrQ: array[1..NMAX] of TInfo> Q: Antrian

Algoritma 4.6. Deklarasi Antrian Representasi Larik Q.Head = 1 Q.Tail = 4

75 56 68 48 82 . . .

[1] [2] [3] [4] [5] [99] [100]

(a) Antrian Dengan 4 Elemen Q.Head = 4, Q.Tail = 4

75 56 68 48 82 . . .

[1] [2] [3] [4] [5] [99] [100]

(b) Antrian Dengan 1 Elemen Q.Head = 0, Q.Tail = 0

75 56 68 48 82 . . .

[1] [2] [3] [4] [5] [99] [100]

(c) Antrian Kosong

(51)

4.3.1 Membuat Antrian Kosong, Representasi Fisik Larik procedure CreateQ(output Q: Antrian)

{membuat antrian kosong, representasi fisik larik} {K. Awal: - }

{K.Akhir: Q terdefinisi, Q.Head = 0, Q.Tail = 0} Deklarasi:

Deskripsi: Q.Head  0 Q.Tail  0

Algoritma 4.7. Membuat Antrian Kosong, Representasi Fisik Larik 4.3.2 Fungsi Untuk Memeriksa Antrian Kosong

function EmptyQ(input Q: Antrian) boolean

{mengembalikan true jika antrian kosong, Q.Head = 0 and Q.Tail = 0}

Deklarasi: Deskripsi:

return (Q.Head = 0 and Q.Tail =0)

Algoritma 4.8. Memeriksa Antrian Kosong 4.3.3 Menyisipkan Elemen Antrian, Representasi Fisik Larik Kasus (1) K. Awal Q.Head = 0 Q.Tail = 0 X = 77 . . . [1] [2] [3] [4] [5] [99] [100] K.Akhir Q.Head = 1 Q.Tail = 1 77 . . . [1] [2] [3] [4] [5] [99] [100]

(52)

Kasus (2) K. Awal Q.Head = 1 Q.Tail = 3 X = 77 75 56 68 . . . [1] [2] [3] [4] [5] [99] [100] K.Akhir Q.Head = 1 Q.Tail = 4 75 56 68 77 . . . [1] [2] [3] [4] [5] [99] [100] Kasus (3) K. Awal Q.Head = 1 Q.Tail = 100 X = 77 75 56 68 72 54 . . . 82 37 [1] [2] [3] [4] [5] [99] [100] K.Akhir

Q.Head = 1 Q.Tail = 100 Overflow

75 56 68 72 54 . . . 82 37

[1] [2] [3] [4] [5] [99] [100]

(53)

procedure EnQueue(input/output Q: Antrian, input X: TInfo) {menyisipkan X sebagai elemen antrian yang direpresentasi secara fisik menggunakan larik}

{K. Awal: Q terdefinisi, X terdefinisi} {K.Akhir: X menjadi elemen antrian} Deklarasi: Deskripsi: if EmptyQ(Q) then Q.Head  1 Q.Tail  1 Q.ArrQ[Q.Tail]  X else

if Q.Tail < NMAX then Q.Tail  Q.Tail + 1 Q.ArrQ[Q.Tail]  X else write (“overflow”) endif endif

Algoritma 4.9 Menyisipkan Elemen Antrian, Representasi Fisik Larik 4.4.4 Menghapus Elemen Antrian, Representasi Fisik Larik

Ada dua alternatif, yaitu:

1. Elemen bergeser maju, seperti layaknya antrian 2. Head bergeser maju

Menghapus Elemen Antrian: Elemen bergeser maju Kasus (1) K. Awal Q.Head = 1 Q.Tail = 4 75 56 68 48 82 . . . [1] [2] [3] [4] [5] [99] [100] K.Akhir Q.Head = 1 Q.Tail = 3 X = 75 56 68 48 . . . [1] [2] [3] [4] [5] [99] [100]

(54)

Kasus (2) K. Awal Q.Head = 1 Q.Tail = 1 57 . . . [1] [2] [3] [4] [5] [99] [100] K.Akhir Q.Head = 0 Q.Tail = 0 X = 57 . . . [1] [2] [3] [4] [5] [99] [100]

Gambar 5. DeQueue, Elemen Bergeser Maju

procedure DeQueue(input/output Q: Antrian, output X: TInfo) {menghapus elemen antrian yang direpresentasi dengan larik, elemen bergeser maju}

{K. Awal: Q terdefinisi, tidak kosong}

{K.Akhir: X adalah elemen yang dihapus, elemen bergeser maju, antrian mungkin jadi kosong}

Deklarasi: k: integer Deskripsi:

X  Q.ArrQ[Q.Head]

if (Q.Tail ≠ Q.Head) then {geser maju elemen} for k  2 to Q.Tail do

Q.ArrQ[k-1]  Q.ArrQ[k] endfor

Q.Tail  Q.Tail – 1

else {hanya memiliki satu elemen, antrian jadi kosong} Q.Tail  0

Q.Head  0 endif

(55)

5.4.2 Menghapus Elemen Antrian: Head Bergeser Maju Kasus (1) K. Awal Q.Head = 1 Q.Tail = 4 75 56 68 48 . . . [1] [2] [3] [4] [5] [99] [100] K.Akhir Q.Head = 2 Q.Tail = 4 X = 75 56 68 48 . . . [1] [2] [3] [4] [5] [99] [100] Kasus (2) K. Awal Q.Head = 3 Q.Tail = 3 34 . . . [1] [2] [3] [4] [5] [99] [100] K.Akhir Q.Head = 0 Q.Tail = 0, X = 34 . . . [1] [2] [3] [4] [5] [99] [100]

(56)

procedure DeQueue(input/output Q: Antrian, output X: TInfo) {menghapus elemen antrian yang direpresentasi dengan larik, head bergeser maju}

{K. Awal: Q terdefinisi, tidak kosong}

{K.Akhir: X adalah elemen yang dihapus, Head bergeser maju, antrian mungkin jadi kosong}

Deklarasi: k: integer Deskripsi:

X  Q.ArrQ[Q.Head]

if (Q.Tail ≠ Q.Head) then Q.Head  Q.Head + 1 else Q.Tail  0 Q.Head  0 endif

Algoritma 4.11. Menghapus Elemen Antrian, Head Bergeser Maju Persoalan Head Maju, Menyisipkan Elemen

Persoalan: pada saat penyisipan, mungkin terjadi Q.Tail > NMAX, tetapi masih ada elemen belum terpakai,

Solusi: reorganisasi elemen pada saat penyisipan

Q.Head =98 Q.Tail = 100 . . . 43 78 56 [1] [2] [3] [4] [5] [98] [99] [100] Setelah reorganisasi Q.Head = 1 Q.Tail = 3 43 78 56 . . . [1] [2] [3] [4] [5] [98] [99] [100] Gambar 4.7. Persoalan DeQueue Dengan Head Maju

(57)

procedure EnQueue(input/output Q: Antrian, input X: TInfo) {menyisipkan X sebagai elemen antrian yang direpresentasi fisik larik}

{K. Awal: Q terdefinisi, X terdefinisi} {K.Akhir: X menjadi elemen antrian} Deklarasi: k: integer Deskripsi: if Empty(Q) then Q.Head  1 Q.Tail  1 Q.ArrQ[Q.Tail]  X else if (Q.Tail < NMAX) Q.Tail  Q.Tail + 1 Q.ArrQ[Q.Tail]  X else

if (Q.Head ≠ 1) then {reorganisasi elemen} for k  Q.Head to Q.Tail do

Q.ArrQ[k - Q.Head + 1]  Q.ArrQ[k] endfor

Q.Tail  Q.Tail – Q.Head + 2 Q.Head  1 Q.ArrQ[Q.Tail]  X else write (“overflow”) endif endif endif

(58)

Soal Latihan

1. Untuk menyelesaikan soal, gunakan deklarasi antrian berikut: Deklarasi:

const NMAX = 5 {maksimum elemen larik}

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = integer[0..NMAX]

type Antrian = record <Head: Address, Tail: Address, ArrQ: array[1..NMAX] of TInfo> Q: Antrian

Catatan:

 Sebagian nilai di dalam larik mungkin bukan merupakan elemen antrian. Arsir yang bukan elemen antrian

 Penghapusan elemen dilakukan dengan “head maju” (a) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] Q.Head = 2, Q.Tail = 4, X = 82 Q.Head = Q.Tail =

EnQueue(Q,X) Overflow? (b) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] Q.Head = 1, Q.Tail = 4 Q.Head = Q.Tail = X = DeQueue(Q,X) EmptyQ(Q)?

(c) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] Q.Head = 1, Q.Tail = 4, X = 28 Q.Head = Q.Tail =

EnQueue(Q,X) Overflow? (d) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] Q.Head = 4, Q.Tail = 5, Q.Head = Q.Tail = X = DeQueue(Q,X) EmptyQ(Q)?

(59)

(e) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] Q.Head = 1, Q.Tail = 5, X = 37 Q.Head = Q.Tail =

EnQueue(Q,X) Overflow? (f) Keadaan awal Keadaan akhir 45 78 56 64 37

[1] [2] [3] [4] [5] [1] [2] [3] [4] [5] Q.Head = 2, Q.Tail = 2 Q.Head = Q.Tail = X = DeQueue(Q,X) EmptyQ(Q)?

2. Buat algoritma untuk menyalin antrian Q1 ke antrian Q2

3. Buat algoritma untuk memecah (split) antrian Q menjadi antrian Q1 yang menyimpan info ganjil dan antrian Q2 yang menyimpan info genap.

Antrian Prioritas

Pada antrian dengan prioritas setiap elemen menyimpan informasi prioritas yang menentukan urutan keberadaan elemen dalam antrian. Aturan penyisipan menjadi tidak murni sesuai dengan aturan penyisipan antrian, melainkan sesuai prioritas. Penghapusan elemen tetap dilakukan terhadap elemen yang ditunjuk oleh Head.

Deklarasi antrian prioritas seperti terlihat pada Algoritma 4.13. Deklarasi:

type TInfo = {tipe terdefinisi, sesuai dengan kebutuhan} type Address = pointer to Elemen

type Elemen = record <Info: TInfo, Prio: integer, Next: Address>

type AntrianP = record <Head: Address, Tail: Address> QPrio: AntrianP

procedure EnQueueP(input/output QPrio: AntrianP, input PIns: Address)

{Menyisipkan PIns sebagai elemen antrian QPrio sesuai dengan Prio(PIns)}

{K. Awal: QPrio terdefinisi, PIns terdefinisi} {K.Akhir: PIns menjadi elemen antrian QPrio}

(60)

Proses penyisipan elemen antrian prioritas seperti terlihat pada Algoritma 4.14 procedure EnQueuePrio(input/output QPrio: AntrianP, input PIns: Address)

{Menyisipkan PIns sebagai elemen antrian QPrio sesuai dengan Prio(PIns)}

{K. Awal: QPrio terdefinisi, PIns terdefinisi} {K.Akhir: PIns menjadi elemen antrian QPrio} Deklarasi: P, Prev: Address Found: boolean Deskripsi: P  QPrio.Head; Prev  Nil Found  false

while (P ≠ Nil and not Found) do if (Prio(P) < Prio(PIns)) then Found  true else Prev  P P  Next(P) endif endwhile

if Prev = Nil then {disisipkan sebagai elemen ke-1} Next(PIns)  QPrio.Head

QPrio.Head  PIns else

if (Found) then {disisipkan di tengah} Next(PInst)  Next(Prev)

Next(Prev)  PIns

else {disisipkan sebagai elemen terakhir} Next(QPrio.Tail)  PIns

QPrio.Tail  PIns endif

endif

Algoritma 4.14. Penyisipan Elemen Antrian Prioritas

Aturan penghapusan elemen antrian prioritas tidak mengalami perubahan, yaitu pada kepala antrian.

(61)

BAB 5 TUMPUKAN 5.1 Pengertian Dasar

Secara lojik tumpukan (stack) adalah senarai yang penyisipan elemen hanya dilakukan sebagai elemen pertama dan penghapusan elemen hanya dilakukan terhadap elemen pertama. Struktur data tumpukan digunakan merepresentasi pemanggilan prosedur, perhitungan ekspresi aritmatika, penelusuran balik dan algoritma lanjut lainnya.

Seperti layaknya tumpukan di dunia nyata, maka elemen baru disisipkan sebagai elemen paling atas dan elemen yang dihapus adalah elemen paling atas. Berlaku prinsip LIFO (last in first out). Secara algoritmik, deklarasi tumpukan seperti terlihat pada Algoritma 1.

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = pointer to Elemen

type Elemen = record <Info: TInfo, Next: Address> type Stack = record <Top: Address>

S: Stack

Algoritma 5.1. Deklarasi Tumpukan Stack dikenali melalui alamat elemen pertamanya Top.

Stack kosong adalah stack yang tidak memiliki elemen, Top = Nil.

Top

(a) Stack Kosong Top

(b) Stack Dengan 3 Elemen

(62)

5.2 Operasi dasar terhadap tumpukan: 1. Membuat stack kosong

2. Menyisipkan elemen pada stack 3. Menghapus elemen stack 4. Memeriksa apakah stack kosong Membuat Stack Kosong

procedure CreateStack(output S: Stack) {membuat stack kosong, S.Top = Nil} {K. Awal : - }

{K.Akhir: Stack S terdefinisi, S.Top = Nil} Deklarasi:

Deskripsi: S.Top  Nil

Algoritma 5.2. Membuat Stack Kosong Menyisipkan Elemen Pada Stack

procedure Push(input/output S: Stack, input X: TInfo) {Menyisipkan X sebagai elemen pada puncak stack} {K. Awal: S terdefinisi, X terdefinisi}

{K.Akhir: X menjadi elemen puncak stack} Deklarasi: P: Address Deskripsi: Alokasi(P); Next(P)  Nil; Info(P)  X Next(P)  S.Top S.Top  P

(63)

Menghapus Elemen Stack

procedure Pop(input/output S: Stack, output X: TInfo) {Menghapus elemen stack}

{K. Awal: S terdefinisi, tidak kosong} {K.Akhir: X adalah info elemen yang dihapus} Deklarasi:

Deskripsi:

X  Info(S.Top) S.Top  Next(S.Top)

Algoritma 5.4. Menghapus Elemen Stack Memeriksa Apakah Stack Kosong

function EmptyStack(input S: Stack)  boolean {mengembalikan true jika stack S kosong} Deklarasi:

Deskripsi:

return (S.Top = Nil)

Algoritma 5.5 Memeriksa Apakah Stack Kosong 5.3 Representasi Fisik Tumpukan Dengan Larik

Stack dapat drepresentasi secara fisik menggunakan larik dengan NMAX elemen, dimana NMAX merupakan konstanta yang diperkirakan sebagai jumlah maksimum tumpukan. Deklarasi tumpukan yang direpresentasi menggunakan larik seperti pada Algoritma 5.6.

const NMAX = 100

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = integer [0..NMAX]

type Stack = record <Top: Address,

ArrStack: array[1..NMAX] of TInfo> S: Stack

(64)

S.Top = 4

75 56 68 48 82 . . .

[1] [2] [3] [4] [5] [99] [100]

(a) Tumpukan Dengan 4 Elemen S.Top = 1

75 . . .

[1] [2] [3] [4] [5] [99] [100]

(b) Tumpukan Dengan 1 Elemen S.Top = 0

. . .

[1] [2] [3] [4] [5] [99] [100]

(c) Tumpukan Kosong

Gambar 5.2. Tumpukan yang Direpresentasi Menggunakan Larik

Menyisipkan Elemen Tumpukan: Representasi Larik Kasus (1) K. Awal S.Top = 4, X = 23 75 56 68 48 . . . [1] [2] [3] [4] [5] [99] [100] K. Akhir S.Top = 5 75 56 68 48 23 . . . [1] [2] [3] [4] [5] [99] [100]

(65)

Kasus (2)

K. Awal X = 46, S.Top = 100

75 56 68 48 23 . . . 73 84

[1] [2] [3] [4] [5] [99] [100]

K. Akhir Overflow! S.Top = 100

75 56 68 48 23 . . . 73 84

[1] [2] [3] [4] [5] [99] [100]

Gambar 5.3. Menyisipkan Elemen Tumpukan: Representasi Larik procedure Push(input/output S: Stack, input X: TInfo) {Menyisipkan X sebagai elemen tumpukan X}

{K. Awal: S terdefinisi, mungkin kosong, X terdefinisi} {K.Akhir: Jika masih tersedia tempat maka X menjadi elemen paling baru dari stack S.

Jika tidak tersedia tempat lagi maka tampilkan pesan “overflow”}

Deklarasi: Deskripsi:

if (S.Top < NMAX) then S.Top  S.Top + 1 S.ArrStack[S.Top]  X else

write (“overflow”) endif

(66)

Menghapus Elemen Tumpukan: Representasi Larik K. Awal S.Top = 4 75 56 68 48 . . . [1] [2] [3] [4] [5] [99] [100] K. Akhir S.Top = 3, X = 48 75 56 68 . . . [1] [2] [3] [4] [5] [99] [100]

Gambar 5.3. Menghapus Elemen Tumpukan: Representasi Larik procedure Pop(input/output S: Stack, output X: TInfo) {Menyisipkan X sebagai elemen tumpukan X}

{K. Awal: S terdefinisi, tidak koson}

{K.Akhir: X adalah elemen tumpukan yang dihapus S.Top berkurang 1} Deklarasi: Deskripsi: X  S.ArrStack[S.Top] S.Top  S.Top – 1

Algoritma 5.8. Menghapus Elemen Tumpukan: Representasi Larik Bagaimana algoritma untuk membuat stack kosong dan fungsi untuk memeriksa stack kosong dengan representasi larik? Selesaikan!

Soal Latihan

1. Buat fungsi yang mengembalikan true jika stack kosong

2. Buat fungsi yang mengembalikan true jika stack penuh (overflow) 3. Untuk menyelesaikan Soal No. 3, gunakan deklarasi stack berikut:

Deklarasi:

const NMAX = 5 {maksimum elemen larik}

type TInfo = integer {atau tipe terdefinisi lainnya} type Address = integer[0..NMAX]

type Stack =record <Top: Address,

ArrStack: array[1..NMAX] of TInfo> S: Stack

Gambar

TABEL I TIPE DATA DASAR
Gambar 2.2 Larik A[1..N] elemen
Gambar 2.6 mengilustrasikan larik AMhs[1..N]. Misalkan terdefinisi N = 8  [1]  6789  Tiger Woods  2.8  [2]  7890  Ronaldo  3.1  [3]  5678  Roger Federer  3.0  [4]  2345  Serena Williams  2.9  [5]  1234  Taufik Hidayat  3.7  [6]  3456  Valentino Rossi  2.9
Gambar 3.1. Lima larik untuk merepresentasi 5 hotel
+7

Referensi

Dokumen terkait

Class generic jika digunakan haruslah dikhususkan untuk tipe data tertentu sehingga tidak perlu proses casting untuk mengakses unsur collection.. Berikut contoh

1. Menjelaskan alur pengulangan dalam bentuk Flowchart. Menuliskan tabel perubahan nilai pembentuk loop dan nilai-nilai yang terjadi akibat loop. Contoh program untuk

Algoritma CPAR menghasilkan Class Association Rules (CARs), selanjutnya CARs digunakan untuk mendeskripsikan karakteristik laka lantas yang berhubungan dengan

Analisis data berdasarkan metode yang dipilih Setelah menentukan metode statistik yang akan digunakan selanjutnya menerjemahkan ke dalam algoritma yang sesuai untuk mendapatkan

Algoritma CPAR menghasilkan Class Association Rules (CARs), selanjutnya CARs digunakan untuk mendeskripsikan karakteristik laka lantas yang berhubungan dengan

value). Data integration and transformationi, untuk meningkatkan akurasi dan efisiensi algoritma. Data yang digunakan dalam penulisan ini bernilai kategorikal. Data

Mirip dengan cara kita menggunakan this untuk merujuk ke konstruktor pertama pada contoh Point, ada variabel khusus lain dalam Java yang disebut super yang merujuk

Pada contoh diatas, deklarasi akan memberitahukan kepada compiler Java, bahwa identifier ages akan digunakan sebagai nama array yang berisi data-data integer, dan kemudian