06.02.2014 Views

STRUKTUR DATA

STRUKTUR DATA

STRUKTUR DATA

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>STRUKTUR</strong> <strong>DATA</strong><br />

Pengajar<br />

Jaidan Jauhari, , MT<br />

Alamat Email<br />

jaidan_j@ilkom.unsri.ac.id<br />

jaidan_j@yahoo.com<br />

Disarikan Dari Berbagai Sumber, Terutama Dari Diktat Struktur Data Informatika<br />

ITB Karangan Dr. Inggriani Liem<br />

Halaman 1


SILABUS MATERI KULIAH<br />

• Pengantar Struktur Data<br />

• Review Record dan Array<br />

• Stack (Tumpukan)<br />

• Queue (Antrian)<br />

• Linked List dan Variasi List<br />

• MultiList<br />

• Pohon Biner<br />

• Graph<br />

Halaman 2


BUKU SUMBER<br />

1. Inggriani Liem. 1997. Diktat Kuliah Algoritma dan<br />

Pemrograman Prosedural. Bandung : ITB<br />

2. Inggriani Liem. 2003. Diktat Kuliah Struktur Data.<br />

Bandung : ITB<br />

3. Rinaldi Munir. 2003. Algoritma dan Pemrograman II.<br />

Bandung : Penerbit Informatika<br />

4. Bambang Wahyudi. 2004. Struktur Data dan Algoritma.<br />

Yogyakarta : Andi Offset<br />

5. Dwi Sanjaya. 2001. Bertualang dengan Struktur Data di<br />

Planet Pascal. Yogyakarta : JJ Learning<br />

6. P. Insap Santoso.1997. Struktur Data dengan Turbo<br />

Pascal. Yogyakarta : Andi Offset<br />

Halaman 3


Komponen Penilaian<br />

• Tugas 20%<br />

• Ujian 1 20 % (Pertemuan ke-4)<br />

• Ujian 2 20% (Pertemuan ke-8)<br />

• Ujian 3 20% (Pertemuan ke-12)<br />

• Ujian Akhir Semester 20%<br />

Halaman 4


Aturan dan Sanksi-sanksi<br />

sanksi<br />

• Kehadiran minimal 80%, kurang dari 80%<br />

tidak lulus (mendapat nilai E)<br />

• Keterlambatan maksimal 10 menit (Lebih dari 10 menit tidak<br />

diijinkan memasuki ruangan)<br />

• Pengumpulan Tugas yang melebihi waktu yang telah ditentukan<br />

akan diberikan nilai nol<br />

• Kecurangan dalam bentuk apapun akan mendapatkan nilai E<br />

• Mahasiswa berpakaian rapi dan sopan, yang ditunjukkan antara lain<br />

1. Memakai sepatu tertutup<br />

2. Memakai baju berkerah<br />

3. Tidak memakai aksesoris yang tidak diijinkan<br />

4. Tidak memakai pakaian yang kurang dasar atau lebih dasar<br />

5. dan lain-lain<br />

• Selama perkuliahan berlangsung mahasiswa tidak diijinkan<br />

meninggalkan ruang kuliah kecuali sangat terpaksa dan itupun<br />

harus membuat surat ijin dan hanya boleh satu kali<br />

Halaman 5


PENGERTIAN <strong>STRUKTUR</strong> <strong>DATA</strong><br />

Struktur data adalah cara menyimpan atau<br />

merepresentasikan data di dalam komputer<br />

bisa dipakai secara efisien<br />

agar<br />

Sedangkan data adalah representasi dari<br />

nyata.<br />

fakta dunia<br />

Fakta atau keterangan tentang kenyataan yang<br />

disimpan, direkam atau direpresentasikan dalam<br />

bentuk tulisan, suara, gambar, sinyal atau<br />

simbol<br />

Halaman 6


Secara garis besar type data dapat dikategorikan<br />

menjadi :<br />

1. Type data sederhana<br />

a. Type data sederhana tunggal, misalnya<br />

Integer, real, boolean dan karakter<br />

b. Type data sederhana majemuk, misalnya<br />

String<br />

2. Struktur Data, meliputi<br />

a. Struktur data sederhana, misalnya array dan<br />

record<br />

Halaman 7


. Struktur data majemuk, yang terdiri<br />

dari<br />

Linier : Stack, Queue, serta List dan<br />

Multilist<br />

Non Linier : Pohon Biner dan Graph<br />

Pemakaian struktur data yang tepat di dalam<br />

proses pemrograman akan menghasilkan<br />

algoritma yang lebih jelas dan tepat,<br />

sehingga menjadikan program secara<br />

keseluruhan lebih efisien dan sederhana.<br />

Halaman 8


Struktur data yang ″standar″ yang biasanya<br />

digunakan dibidang informatika adalah :<br />

• List linier (Linked List) dan variasinya<br />

• Multilist<br />

• Stack (Tumpukan)<br />

• Queue (Antrian)<br />

• Tree ( Pohon )<br />

• Graph ( Graf )<br />

Halaman 9


REVIEW RECORD (REKAMAN)<br />

Disusun oleh satu atau lebih field. Tiap field<br />

menyimpan data dari tipe dasar tertentu atau dari<br />

tipe bentukan lain yang sudah didefinisikan<br />

sebelumnya. Nama rekaman ditentukan oleh<br />

pemrogram.<br />

Rekaman disebut juga tipe terstruktur.<br />

Contoh :<br />

1. type Titik : record <br />

jika P dideklarasikan sebagai Titik maka<br />

mengacu field pada P adalah P.x dan P.y.<br />

Halaman 10


2. Didefinisikan tipe terstruktur yang mewakili Jam<br />

yang dinyatakan sebagai jam (hh), menit (mm)<br />

dan detik (ss), maka cara menulis type Jam<br />

adalah :<br />

type JAM : record<br />

<br />

Jika J adalah peubah (variabel) bertipe Jam<br />

maka cara mengacu tiap field adalah J.hh, J.mm<br />

dan J.ss<br />

Halaman 11


Terjemahan dalam bahasa C :<br />

1. type Titik : record <br />

diterjemahkan menjadi :<br />

typedef struct { float x;<br />

float y;<br />

} Titik;<br />

2. type JAM : record<br />

<br />

Diterjemahkan menjadi :<br />

typedef struct<br />

{ int hh; /*0…23*/<br />

int mm; /*0…59*/<br />

int ss; /*0…59*/<br />

} Jam;<br />

Halaman 12


REVIEW ARRAY (LARIK)<br />

1. Pendahuluan<br />

• Larik adalah struktur data statik yang<br />

menyimpan sekumpulan elemen yang bertipe<br />

sama.<br />

• Setiap elemen diakses langsung melalui<br />

indeksnya.<br />

• Indeks larik harus tipe data yang menyatakan<br />

keterurutan misalnya integer atau karakter.<br />

Halaman 13


• Banyaknya elemen larik harus sudah diketahui<br />

sebelum program dieksekusi.<br />

• Tipe elemen larik dapat berupa tipe sederhana,<br />

tipe terstruktur atau tipe larik lain.<br />

• Nama lain array adalah Larik, tabel atau vektor<br />

Halaman 14


Cara Pendefinisian Array<br />

1. Sebagai Peubah<br />

Contoh :<br />

L : array[1..50] of integer<br />

NamaMhs : array[‘a’..’j’] of string<br />

2. Sebagai tipe baru<br />

Contoh :<br />

type LarikInt : array[1..100] of integer<br />

P : LarikInt<br />

Halaman 15


3. Mendefinisikan ukuran maksimum<br />

elemen larik sebagai konstanta<br />

Contoh :<br />

Const Nmaks = 100<br />

type Larikint : array[1..Nmaks] of integer<br />

P : LarikInt<br />

Cara menterjemahkan ke bahasa C :<br />

#define Nmaks 100<br />

typedef int Larikint[Nmaks+1];<br />

Larikint P;<br />

Halaman 16


Cara Mengacu Elemen Larik<br />

• Elemen larik diacu melalui indeksnya.<br />

Nilai indek harus terdefinisi.<br />

• Contoh cara mengacu elemen larik adalah :<br />

L[4] {mengacu elemen keempat dari larik L }<br />

NamaMhs[‘b’]<br />

{mengacu elemen kedua<br />

dari larik NamaMhs}<br />

P[k] {mengacu elemen ke-k dari larik P,<br />

asalkan nilai k sudah terdefinisi }<br />

Halaman 17


Menginisialisasi Larik<br />

• menginisialisasi elemen larik adalah memberikan<br />

harga awal untuk seluruh elemen larik, misalnya<br />

menginisialisasi dengan nilai 0 seperti di bawah ini :<br />

Procedure InisDgn0(output A:larik, input N:integer)<br />

{menginisialisasi setiap elemen larik A[1..N] dengan nol}<br />

{K. Awal : N adalah banyak elemen efektif larik,<br />

nilainya terdefinisi}<br />

{K. Akhir : seluruh elemen larik A bernilai nol}<br />

Deklarasi :<br />

K : integer<br />

Deskripsi :<br />

for k 1 to N do<br />

A[k] 0<br />

endfor<br />

Halaman 18


Mengisi elemen larik dari piranti masukan<br />

• Elemen larik dapat diisi dengan nilai yang dibaca dari<br />

piranti masukan seperti contoh di bawah ini :<br />

Procedure BacaLarik(output A:larik, input N:integer)<br />

{mengisi elemen larik A[1..N] dengan nilai yang<br />

dibaca dari piranti masukan}<br />

{K. Awal : N adalah jumlah elemen efektif larik, nilainya<br />

terdefinisi}<br />

{K. Akhir : seluruh elemen larik A berisi nilai-nilai yang dibaca dari<br />

piranti masukan}<br />

Deklarasi :<br />

K : integer<br />

Deskripsi :<br />

for k 1 to N do<br />

read (A[k])<br />

endfor<br />

Halaman 19


Larik Bertype Terstruktur<br />

Larik tidak hanya dapat berisi data bertype tunggal,<br />

tapi dapat juga berisi data yang bertipe<br />

terstruktur<br />

Contoh :<br />

const Nmaks = 100<br />

type Mahasiswa : record<br />

<br />

TabMhs : array[1..Nmaks] of Mahasiswa<br />

Halaman 20


Contoh Cara mengacu elemen TabMhs :<br />

1. TabMhs[2].Nim<br />

mengacu field Nim dari elemen kedua<br />

larik<br />

2. Write(TabMhs[k].KodeMK)<br />

menuliskan field KodeMK dari elemen<br />

ke k dari larik<br />

Halaman 21


Tugas 1<br />

Buatlah dalam notasi algoritma atau bahasa C :<br />

1.Definisikan sebuah type terstruktur untuk<br />

menyatakan data nasabah disebuah bank. Data<br />

nasabah terdiri atas field Nomor Account, Nama<br />

Nasabah, Alamat Nasabah, Kota Nasabah, dan<br />

Nomor Telpon Nasabah.<br />

Untuk setiap field definisikan type data yang cocok<br />

Halaman 22


2.Dari soal nomor 1 buatlah program dalam<br />

bahasa pemrograman berbasis bahasa C, untuk<br />

memasukkan data nasabah sebanyak N, dengan<br />

N diinputkan dari papan ketik, kemudian<br />

menuliskan kembali semua data nasabah dalam<br />

bentuk matrik.<br />

Petunjuk :<br />

Gunakan notasi pengulangan untuk<br />

menyelesaikan permasalahan tersebut<br />

Tugas dikumpulkan pada pertemuan<br />

berikutnya disertai listing program dan<br />

contoh keluarannya<br />

Halaman 23


ADT (Abstract Data Type)<br />

• ADT adalah definisi type dan sekumpulan<br />

primitif (operasi dasar) terhadap type<br />

tersebut.<br />

• Type diterjemahkan menjadi type terdefinisi<br />

dalam bahasa pemrograman yang<br />

bersangkutan, misalnya menjadi record dalam<br />

Pascal/Ada dan Struct dalambahasaC<br />

Halaman 24


Primitif dalam konteks pemrograman<br />

prosedural, diterjemahkan menjadi<br />

fungsi dan prosedur.<br />

Primitif dikelompokkan menjadi :<br />

1. Konstruktor/Kreator, pembentuk nilai<br />

type. Biasanya namanya diawali dengan<br />

Make.<br />

2. Selektor, untuk mengakses komponen type.<br />

Biasanya namanya diawali dengan<br />

Get.<br />

Halaman 25


3. Prosedur Pengubah nilai komponen<br />

4. Validator komponen type, yang<br />

dipakai untuk mengetes apakah dapat<br />

membentuk type sesuai batasan.<br />

5. Destruktor/Dealokator, yaitu untuk<br />

menghancurkan nilai objek, sekaligus<br />

memori penyimpannya<br />

6. Baca/tulis, untuk interface dengan<br />

input/output device<br />

Halaman 26


7. Operator Relasional terhadap type<br />

tersebut untuk mendefinisikan lebih<br />

besar, lebih kecil, sama dengan dan<br />

sebagainya.<br />

8. Aritmatika terhadap type tersebut,<br />

dalam pemrograman biasanya hanya<br />

terdefinisi untuk bilangan numerik.<br />

9. Konversi dari type tersebut ke type<br />

dasar dan sebaliknya<br />

Halaman 27


ADT biasanya diimplementasi menjadi dua buah<br />

modul, yaitu :<br />

1. Definisi/spesifikasi type dan primitif<br />

- Spesifikasi type sesuai dengan<br />

bahasa yang dipakai<br />

- Spesifikasi dari primitif sesuai dengan kaidah<br />

dalam konteks prosedural, yaitu :<br />

a. Fungsi : nama, domain, range, dan pre kondisi<br />

jika ada<br />

b. Prosedur : Keadaan Awal, Keadaan Akhir dan<br />

proses yang dilakukan<br />

2. Body/realisasi dari primitif, berupa kode program dalam<br />

bahasa yang bersangkutan. Realisasi fungsi dan prosedur<br />

harus sedapat mungkin memanfaatkan Selektor dan<br />

Konstruktor<br />

Halaman 28


Halaman 29


4. Linked List (List Linier)<br />

4.1. Definisi<br />

List linier adalah sekumpulan elemen<br />

bertype sama, yang mempunyai<br />

keterurutan tertentu, yang setiap<br />

elemennya terdiri dari 2 bagian :<br />

Type Elmtlist = record<br />

< Info : InfoType,<br />

Next : address ><br />

Halaman 30


Dengan Info Type adalah sebuah type<br />

terdefenisi yang menyimpan informasi<br />

sebuah elemen list ; Next adalah address<br />

dari elemen berikutnya ( suksesor ).<br />

Dengan demikian, jika didefinisikan First<br />

adalah alamt elemen pertama list, maka<br />

elemen berikutnya dapat diakses secara<br />

suksesif dari elemen pertama tersebut<br />

Halaman 31


Jadi, sebuah list linier dikenali :<br />

• elemen pertamanya, biasanya melalui alamat<br />

elemen pertama yang disebut : First<br />

• alamat elemen berikutnya ( suksesor ), jika<br />

kita mengetahui alamat sebuah elemen , yang<br />

dapat diakses melalui field NEXT<br />

• setiap elemen mempunyai alamat, yaitu<br />

tempat elemen disimpan dapat diacu.Untuk<br />

mengacu sebuah elemen , alamat harus<br />

terdefenisi . Dengan alamat tersebut Informasi<br />

yang tersimpan pada elemen list dapat diakses<br />

.<br />

• elemen terakhirnya. Ada berbagai cara untuk<br />

mengenali elemen akhir<br />

Halaman 32


Jika L adalah list , dan P adalah address :<br />

Alamat elemen pertama list L dapat diacu<br />

dengan notasi :<br />

First (L)<br />

Elemen yang diacu oleh P dapat dikonsultasi<br />

informasinya dengan notasi :<br />

Info(P)<br />

Next(P)<br />

Halaman 33


Beberapa defenisi :<br />

1. List L adalah List kosong , jika First (L) = Nil<br />

2. Elemen terakhir dikenali, dengan salah satu<br />

cara adalah karena Next(Last) =Nil<br />

Halaman 34


II. Skema traversal untuk list<br />

linier<br />

List terdiri dari sekumpulan elemen.<br />

Seringkali diperlukan untuk memproses<br />

setiap elemen list dengan cara yang sama.<br />

Karena itu salah primitif operasi konsultasi<br />

dasar pada struktur list adalah traversal,<br />

yaitu “mengunjungi” setiap elemen list<br />

untuk diproses.<br />

Halaman 35


Karena Urutan akses adalah dari elemen<br />

pertama sampai dengan elemen<br />

terakhir,<br />

maka traversal list secara<br />

natural dilakukan dari elemen pertama,<br />

suksesornya, dan seterusnya sampai<br />

dengan elemen terakhir.<br />

Halaman 36


Skema traversal yang dipakai adalah Sbb :<br />

Procedure SKEMAListTransversal1( Input L : List )<br />

{K. Awal : List L terdefinisi , mungkin kosong }<br />

{K. Akhir : semua elemen list L dikunjungi dan telah<br />

diproses }<br />

{Proses : Traversal sebuah list linier. Dengan MARK,<br />

tanpa pemrosesan khusus pada list kosong}<br />

Deklarasi<br />

Halaman 37


Deklarasi :<br />

P : address { address untuk traversal , type<br />

terdefenisi }<br />

Deskripsi :<br />

Inisialisasi<br />

P ← First ( L ) { First Element }<br />

While ( P ≠Nil ) do<br />

Proses ( P )<br />

P ← Next ( P ) { Next element }<br />

endwhile<br />

Terminasi<br />

Halaman 38


Procedure SKEMAListTransversal 2( Input L :<br />

List )<br />

{ K. Awal : List L terdefenisi , mungkin kosong }<br />

{ K. Akhir : semua elemen list L “dikunjungan “<br />

dan telah diproses }<br />

{ Proses : Transversal sebuah list linier yang<br />

diidentifikasi oleh elemen pertama L ,<br />

Dengan MARK dan pemrosesan<br />

khusus pada list kosong }<br />

Deklarasi :<br />

Halaman 39


Deklarasi<br />

P : address<br />

Deskripsi<br />

{ address untuk traversal , type<br />

terdefenisi }<br />

If (First ( L ) = Nil) then<br />

else<br />

Write ( ‘List kosong ‘ )<br />

Halaman 40


Insialisasi<br />

P ← First ( L ) { First Element }<br />

Repeat<br />

Proses ( P )<br />

P ← Next ( P ) { Next element }<br />

until P=Nil<br />

Terminasi<br />

Halaman 41


III. Skema Sequential Search untuk list<br />

linier<br />

Selain traversal, proses pencarian suatu elemen<br />

list adalah primitif yang sering kali<br />

didefinisikan pada struktur list. Pencarian<br />

dapat berdasarkan nilai, atau berdasarkan<br />

alamat.<br />

III.1. Search suatu Nilai, output adalah address<br />

Search ini sering dipakai untuk mengenali<br />

suatu elemen list berdasarkan nilai informasi<br />

yang disimpan pada elemen yang dicari.<br />

Biasanya dengan alamat yang ditemukan,<br />

akan dilakukan suatu proses terhadap elemen<br />

Halaman 42<br />

list tersebut.


Procedure SKEMAListSearch1 ( Input L : List,<br />

X : InfoType, Output P :<br />

address, Found: Boolean )<br />

{ K. Awal : List linier L sudah terdefinisi dan siap<br />

dikonsultasi, X terdefenisi }<br />

{ K.Akhir : P : address pada pencarian beurutan,<br />

dimana X diketemukan, P = Nil jika<br />

tidak ketemu, Found berharga true jika<br />

harga X yang dicari ketemu, false jika<br />

tidak }<br />

Halaman 43


{Proses : Sequential Search harga X pada sebuah<br />

list linier L, Semua elemen diperiksa<br />

dengan intruksi yang sama, versi<br />

dengan Boolean}<br />

Deklarasi<br />

Deskripsi<br />

Halaman 44


P ← First ( L )<br />

Found ← false<br />

While ( P ≠ Nil ) and ( not found ) do<br />

if X = Info (P) then<br />

Found ←True<br />

else<br />

P ← Next (P)<br />

endif<br />

endwhile { P = Nil or Found}<br />

{Jika Found maka P adalah address dimana<br />

harga yang dicari diketemukan}<br />

Halaman 45


III. 2. Search suatu Elemen yang<br />

beralamat tertentu<br />

Procedure SKEMAList Search@( Input L : List, P :<br />

address, Found: Boolean )<br />

{K. Awal : List linier L sudah terdefinisi dan siap<br />

dikonsultasi, X terdefenisi }<br />

{K.Akhir : Jika ada elemen list beralamat P, Found<br />

berharga true, Jika tidak ada elemen list<br />

beralamat P, Found berharga false }<br />

{Proses : Sequential Search @ P pada sebuah list linier<br />

L, Semua elemen diperiksa dengan intruksi<br />

yang sama }<br />

Halaman 46


Deklarasi<br />

Pt : address<br />

Deskripsi<br />

Pt ← First ( L )<br />

Found ← false<br />

While ( Pt ≠ Nil ) and ( not found ) do<br />

if Pt = P then<br />

Found ← true<br />

else<br />

Pt ← Next (Pt)<br />

endif<br />

endwhile { Pt = Nil or Found}<br />

{ Jika Found maka P adalah elemen list}<br />

Halaman 47


IV. Definisi fungsional list linier dan<br />

algoritmanya<br />

Secara fungsional, pada sebuah list linier<br />

biasanya dilakukan pembuatan,<br />

penambahan atau penghapusan elemen yang<br />

dapat ditulis sebagai berkut :<br />

Jika diberikan L, L1 dan L2 adalah list<br />

linier dengan elemen ElmtList, maka<br />

operasi yang dapat dilakukan :<br />

ListEmpty, CreateList, Insert,<br />

Delete, Concat dan UpdateList<br />

Halaman 48


IV. 1. Pengetesan List Kosong<br />

Pemeriksaan apakah sebuah list kosong sangat<br />

penting, karena Keadaan Awal dan<br />

Keadaan Akhir beberapa prosedur harus<br />

didefinisikan berdasarkan keadaan list.<br />

Operasi pada list kosong sering kali<br />

membutuhkan penanganan khusus<br />

Realisasi algoritmik dari definisi<br />

fungsional ini adalah sebuah fungsi<br />

sebagai berikut.<br />

Halaman 49


Function IsEmptyList (L : List ) → boolean<br />

{ Test apakah sebuah list L kosong,<br />

Mengirimkan true jika list kosong, false<br />

jika tidak kosong}<br />

Deklarasi<br />

Deskripsi<br />

return(First (L) = Nil)<br />

Halaman 50


IV.2 Pembuatan sebuah elemen pada<br />

list linier<br />

Pembuatan sebuah list berarti membuat<br />

sebuat list KOSONG, yang selanjutnya<br />

siap diproses (ditambah elemennya,<br />

dsb). Realisasi algoritmik dari<br />

defenisi funfsional ini adalah sebuah<br />

prosedur sebagai berikut.<br />

Halaman 51


Procedure CreateList( Output L : List )<br />

{K. Awal : Sembarang }<br />

K. Akhir : terbentuk list L yang kosong : First<br />

(L) diinisialisasi dengan NIL )<br />

Proses : Membuat list kosong}<br />

Deklarasi<br />

Deskripsi<br />

First (L) ← Nil<br />

Halaman 52


IV. 3 Penyisipan sebuah elemen<br />

pada list linier<br />

Fungsi insert (penyisipan) harus dijabarkan lebih<br />

rinci, karena dapat menjadi penyisipan sebagai<br />

elemen pertama, setelah sebuah address P atau<br />

penyisipan menjadi elemen terakhir atau<br />

bahkan menjadi elemen ditengah<br />

Penyisipan sebuah elemen dapat dilakukan<br />

terhadap sebuah elemen yang sudah dialokasi<br />

(diketahui address-nya ), atau sebuah elemen<br />

yang hanya diketahui nilai Info-nya (berarti<br />

belum dialokasi).<br />

Halaman 53


IV. 2.1. INSERT-First (Address)<br />

Menambahkan sebuah elemen yang diketahui<br />

alamatnya sebagai elemen pertama list.<br />

Procedure InsertFirst (Input/Output L:List, Input<br />

P: address)<br />

{K. Awal : List L mungkin kosong<br />

{K. Akhir : P adalah elemen pertama list L}<br />

{Proses<br />

: Insert sebuah elemen beralamat P sebagai<br />

elemen pertama list linier L yang mungkin<br />

kosong}<br />

Deklarasi<br />

Deskripsi<br />

Next (P) ← First (L)<br />

First (L) ← P<br />

Halaman 54


IV.2.2 INSERT-First (Nilai)<br />

Menambahkan sebuah elemen yang diketahui nilainya sebagai elemen pertama<br />

list.<br />

Procedure InsFirst (Input/output L :List, Input E : infotype )<br />

{ K. Awal : List L mungkin kosong }<br />

{ K. Akhir : Sebuah elemen dialokasikan dan menjadi elemen<br />

pertama list L, jika alokasi berhasil. Jika alokasi gagal<br />

list tetap seperti semula }<br />

{ Proses : Insert sebuah elemen sebagai elemen pertama list}<br />

Deklarasi<br />

P : address<br />

Deskripsi<br />

Alokasi (P)<br />

If P ≠ Nil then<br />

Info (P) ← E<br />

Next (P) ← First (L)<br />

First (L) ← P<br />

Halaman 55


IV.2.2. INSERT-AFTER<br />

Menyisipkan sebuah elemen beralamat P sebagai<br />

suksesor dari sebuah elemen list linier yang beralamat<br />

Prec<br />

Procedure InsertAfter ( Input P, Prec: address )<br />

{K. Awal : Prec adalah elemen list, prec ≠ Nil, P sudah<br />

dialokasikan, P ≠ Nil, Next (P) = Nil<br />

K. Akhir : P menjadi suksesor Prec<br />

Proses<br />

: Insert sebuah elemen beralamat P pada List<br />

linier L}<br />

Deklarasi<br />

Deskripsi<br />

Next (P) ← Next (Prec)<br />

Next (Prec) ← P<br />

Halaman 56


IV. 2.3. INSERT – Last<br />

Menyisipkan sebuah elemen beralamat P sebagai elemen<br />

terakhir sebuah list linier. Ada dua kemungkinan list<br />

kosong atau tidak kosong<br />

Procedur InsertLast@(Input/Output L: List, Input P :<br />

address)<br />

{K. Awal : List L mungkin kosong, P sudah dialokasi,<br />

P ≠ Nil, Next (P) = Nil<br />

K. Akhir : P adalah elemen terakhir list L<br />

Proses : Insert sebuah elemen beralamat P sbg elemen<br />

terakhir dari list linier L yg mungkin kosong }<br />

Halaman 57


Deklarasi<br />

Last : address<br />

{ address untuk traversal}<br />

Deskripsi<br />

If Fisrt (L) = Nil then { insert sebagai elemen pertama}<br />

InsertFirst(L, P)<br />

Else<br />

{ Traversal list sampai address terakhir}<br />

Last ← First (L)<br />

While (Next (Last ) ≠ Nil ) do<br />

Last ← Next (Last )<br />

endwhile {Next ( Last) = Nil, Last adalah elemen terakhir;<br />

insert P after last }<br />

InsertAfter (P, Last)<br />

endif<br />

Halaman 58


IV.3. Penghapusan sebuah elemen pada list<br />

linier<br />

Penghapusan harus dijabarkan lebih rinci, Karena<br />

penghapusan elemen dapat merupakan<br />

pertama, setelah sebuah address P atau<br />

penghapusan elemen terakhir. Perbedaan ini<br />

melehirkan 3 operasi dasar penghapusan<br />

elemen list yang diturunkan dari definisi<br />

fungsional inimenjadi realisasi algoritma.<br />

Operasi penghapusan dapat mengakibatkan list<br />

kosong, jika list semula hanya terdiri dari satu<br />

elemen.<br />

Halaman 60


IV.3.1. DELETFirst : menghapus elemen pertama<br />

list linier<br />

a. Elemen yang dihapus dicatat alamatnya<br />

Procedure DeleteFirst@ (Input/Output L : List, Output<br />

P : address)<br />

{K. Awal : List L tidak kosong, minimal 1 elemen<br />

pertama pasti ada }<br />

{K. Akhir : menghapus elemen pertama L<br />

P adalah @ elemen pertama L sebelum<br />

penghapusan, L yang baru adalah Next (L)<br />

Deklarasi<br />

Deskripsi<br />

P ← First (L)<br />

First (L) ← Next ( First (L) )<br />

Halaman 61


Procedure DeleteFirst (Input/Output L : List, Output E :<br />

InfoType)<br />

{K. Awal : List L tidak kosong, minimal 1 elemen<br />

pertama pasti ada }<br />

{K. Akhir : menghapus elemen pertama L<br />

E adalah Nilai elemen pertama L sebelum<br />

penghapusan, L yang baru adalah Next (L)<br />

Deklarasi<br />

Deskripsi<br />

P ← First (L)<br />

E ← Info (P)<br />

First (L) ← Next ( First (L) )<br />

Dealokasi (P)<br />

Halaman 62


IV. 3.2. Delete After :<br />

Penghapusan suksesor sebuah elemen :<br />

Procedure DeleteAfter ( Input Prec : adrress, Output<br />

P : address )<br />

{ K. Awal : List tidak kosong, Prec adalah elemen list<br />

, Next (Prec) ≠ Nil } Prec ≠elemen terakhir<br />

K. Akhir : Menghapus suksesor Prec, P adalah @<br />

suksesor Prec sebelum penghapusan, Next<br />

(Prec) yang baru adalah suksesor dari<br />

suksesor Prec sebelum penghapusan }<br />

Deklarasi<br />

Deskripsi<br />

P ← Next (Prec)<br />

Next (Prec) ← Next (Next (Prec))<br />

Halaman 63


Dengan primitip ini, maka penghapusan sebuah<br />

beralamat P dapat dilakukan dengan : mencari<br />

predesesor dari P, yaitu alamat Prec memakai<br />

DeleteAfter (Prec)<br />

Procedure DeleteP ( Input/Output L ; List, Output<br />

P : address )<br />

{ K. Awal : List L tidak kosong , P adalah elemen list<br />

L K. Akhir : Menghapus P dari list, P mungkin<br />

elemen pertama, “tengah” atau terakhir }<br />

Deklarasi<br />

Prec : address { alamat predesesor }<br />

Deskripsi<br />

Halaman 64


{ Cari predesesor P }<br />

if (P = First (L) then {Delete list dengan<br />

satu elemen }<br />

DeleteFirst (L,P)<br />

else<br />

Prec ← First (L)<br />

While (Next(Prec) ≠ P ) do<br />

Prec ← Next (Prec)<br />

endwhile { Next (Prec) = P , hapus P }<br />

DeleteAfter (Prec , P)<br />

endif<br />

Halaman 65


IV. 3.3. DELETELast :<br />

Menghapus elemen terakhir list dapat dilakukan jika<br />

alamat dari elemen sebelum elemen terakhir<br />

diketahui. Persoalan selanjutnya menjadi persoalan<br />

DeleteAfter, kalau last bukan satu- satunya elemen<br />

list linier. Ada dua kasus, yaitu list menjadi kosong<br />

atau tidak.<br />

Procedure DeleteLast (Input L : List, Output P :<br />

address)<br />

{K. Awal : List L tidak kosong, minimal mengandung<br />

1 elemen<br />

K. Akhir : menghapus elemen terakhir dari list, list<br />

mungkin menjadi kosong<br />

Proses : P adalah alamat elemen terakhir list<br />

sebelum penghapusan }<br />

Halaman 66


Deklarasi<br />

Last , preclast :address { address untuk traversal }<br />

Deskripsi<br />

{ Find last dan address sebelum last }<br />

Last ← First (L)<br />

Preclast ← Nil { predesesor dari L tak terdefenisi }<br />

While ( Next ( Last ) ≠ Nil do { Traversal list sampai @ terakhir<br />

}<br />

Preclast ← Last ; Last ← Next ( last )<br />

endwhile { Next ( Last ) = Nil, Last adalah elemen terakhir;<br />

preclast = sebelum last }<br />

P ← Last<br />

If Preclast = Nil then { list dg 1 elemen, jadi kosong }<br />

First(L) ← Nil<br />

Else<br />

Next ( preclast )← Nil<br />

endif<br />

Halaman 67


IV. 5. Konkatenasi dua buah list linier<br />

Concat adalah menggabungkan dua list. Dalam contoh<br />

berikut list kedua disambungkan ke list pertama. Jadi<br />

Last (L1) menjadi predesesor First (L2). Realisasi<br />

algoritma adalah sebuah prosedur sebagai berikut :<br />

Procedure CONCAT (Input L1, L2 : List, Output :<br />

L3 : List )<br />

{K. awal : L1 ≠ L2, L1 ≠ L3,dan L3 ≠ L2; L1, L2<br />

mungkin kosong<br />

K. Akhir : L3 adalah hasil konkatenasi (menyambung)<br />

dua buah list linier, L2 ditaruh dibelakang<br />

L1 }<br />

Halaman 68


Deklarasi<br />

Last1 : address { alamat elemen terakhir list pertama }<br />

Deskripsi<br />

Cratelist (L3) {inisialisasi list hasil }<br />

If Fist (L1) = Nil then<br />

Else<br />

endif<br />

First (L3) ← First (L2)<br />

{ Traversal list 1 sampai address terakhir,<br />

Hubungkan last dengan Fisrt 2}<br />

First (L3) ← First (L1)<br />

Last1 ← First (L1)<br />

While ( Next (Last 1 ) ≠ Nil ) do<br />

Last1 ← Next (Last 1)<br />

endwhile {Next ( Last 1) ← First (L2)}<br />

Next(Last1) ← First (L2)}<br />

Halaman 69


Bagian Deklarasi dari algoritma pada List Linier :<br />

Deklarasi<br />

type InfoType = … {Sebuah type terdefinisi}<br />

type Address pointer to ElmtL<br />

type ElmtL = record<br />

<br />

type List = record <br />

{Deklarasi Nama Peubah}<br />

L : List<br />

P : Address<br />

Halaman 70


Soal-Soal<br />

Latihan<br />

I. Apakah perbedaan struktur data list linier<br />

ditinjau dari sudut pandang operasinya, jika<br />

dibandingkan dengan struktur data stack<br />

dan queue?<br />

II.<br />

Untuk data yang bagaimanakah yang dapat<br />

direpresentasikan dengan menggunakan<br />

struktur data list linier?<br />

III. Diketahui sebuah list linier dengan elemen<br />

bertipe integer, buatlah :<br />

1. Sebuah prosedur untuk menghitung<br />

jumlah elemen list yang genap<br />

2. Prosedur untuk menghitung rata-rata<br />

elemen list yang ganjil<br />

Halaman 71


3. Prosedur untuk menghitung banyaknya<br />

elemen list yang positif (lebih besar dari<br />

nol)<br />

4. Prosedur untuk mencetak elemen list yang<br />

genap<br />

IV. Diketahui sebuah list dengan elemen bertype<br />

integer terurut membesar, buatlah :<br />

1. Fungsi untuk mengirimkan elemen pertama<br />

list<br />

2. Fungsi untuk mencari elemen list yang<br />

minimum<br />

3. Fungsi untuk menghitung banyaknya<br />

elemen yang lebih besar dari 100<br />

Halaman 72


Halaman 73


5. Stack (Tumpukan(<br />

Tumpukan)<br />

5.1. Definisi<br />

STACK (Tumpukan) adalah list linier yang :<br />

1. Dikenali elemen puncaknya (TOP)<br />

2. Aturan penyisipan dan penghapusan<br />

elemennya tertentu :<br />

-Penyisipan selalu dilakukan “di atas “ TOP<br />

-Penghapusan selalu dilakukan pada TOP<br />

Halaman 74


Karena aturan penyisipan dan penghapusan semacam<br />

itu, TOP adalah satu-satunya alamat tempat terjadi<br />

operasi. Elemen yang ditambahkan paling akhir akan<br />

menjadi elemen yang akan dihapus.Dikatakan<br />

bahwa elemen Stack akan tersusun secara LIFO<br />

(Last In First Out).<br />

Maka secara lojik, sebuah STACK dapat<br />

digambarkan sebagai list linier yang setiap<br />

elemennya adalah<br />

Type ElmtS = record<br />

<br />

Halaman 75


dengan InfoType terdefinisi yang menentukan<br />

informasi yang disimpan pada setiap<br />

elemen stack, dan address adalah<br />

“alamat” dari elemen<br />

Selain itu alamat elemen terbaru (TOP) dicatat,<br />

sedangkan alamat elemen yang paling<br />

“bawah”, yaitu yang paling lama biasanya<br />

diebut BOTTOM.<br />

TOP adalah elemen pertama list, supaya<br />

penambahan dan penghapusan dengan<br />

mudah dan efisien dapat dilakukan.<br />

Halaman 76


Sehingga jika S adalah sebuah Stack, dan P<br />

adalah address maka<br />

‣ Top (S) adalah alamat elemen TOP, dimana<br />

operasi penyisipan/penghapusan dilakukan.<br />

‣ Info (P) adalah informasi yang disimpan pada<br />

alamat P<br />

‣ Next (P) adalah alamat suksesor P<br />

‣ ElmtS (P) adalah sebuah elemen stack yang<br />

beralamat P<br />

‣ Stack kosong adalah Stack dengan Top (S) =<br />

Nil ( tidak terdefinisi )<br />

Halaman 77


Bagian Deklarasi dari algoritma pada Stack :<br />

Deklarasi<br />

type InfoType = … {Sebuah type terdefinisi}<br />

type Address pointer to ElmtS<br />

type ElmtS = record<br />

<br />

type Stack = record <br />

{Deklarasi Nama Peubah}<br />

S : Stack<br />

P : Address<br />

Halaman 78


5.2. Traversal pada Stack<br />

Pada stack, jarang sekali dilakukan<br />

traversal, karena keunikan Stack justru<br />

pada operasi yang hanya menyangkut<br />

elemen TOP. Namun dibutuhkan<br />

traversal misalnya untuk mencetak isi<br />

Stack.<br />

5.3. Search pada Stack<br />

Pada stack, elemen yang diproses hanyalah<br />

elemen pada TOP. Maka hampir tidak pernah<br />

dilakukan search.<br />

Halaman 79


5.4. Operasi dan fungsi dasar<br />

pada STACK.<br />

a. Test STACK kosong<br />

Mengetahui bahwa stack kosong atau<br />

tidak sangat penting, sebab semua operasi<br />

akan dilakukan berdasarkan kosong atau<br />

tidaknya suatu Stack. Realisasi algoritma<br />

dari definisi fungsional ini adalah sebuah<br />

fungsi yang melakukan test terhadap Stack<br />

sebagai berikut :<br />

Halaman 80


function StackEmpty (S : STACK) →<br />

Boolean<br />

{ TEST stack kosong : Mengirim true, jika<br />

tumpukan kosong, false jika tumpukan tidak<br />

kosong}<br />

Deklarasi<br />

Deskripsi<br />

return (Top (S) = Nil)<br />

Halaman 81


. Pembuatan STACK kosong<br />

Membuat Stack kosong diperlukan untuk memulai<br />

memakai stack. Realisasi algoritma dari definisi<br />

fungsional ini adalah sebuah prosedur yang<br />

melakukan inisialisasi stack sebagai berikut<br />

Procedure CreateEmptyS (Output S : STACK)<br />

{K. Awal : sembarang,<br />

K. Akhir : sebuah stack S yang kosong siap dipakai<br />

terdefinisi<br />

Proses : Membuat stack kosong }<br />

Deklarasi<br />

Deskripsi<br />

Top (S) ← Nil<br />

Halaman 82


c.Penambahan sebuah elemen pada<br />

STACK (Push)<br />

Penambahan selalu dilakukan pada TOP, dan<br />

karena alamat TOP diketahui maka prosesnya<br />

sederhana. Berikut ini akan diberikan skema<br />

prosedur penyisipan tersebut. Realisasi algoritma<br />

dari definisi fungsional ini adalah salah satu dari<br />

dua buah prosedur yang melakukan penambahan<br />

elemen stack sebagai berikut. Prosedur pertama<br />

menambahkan suatu ElmtS yang diketahui<br />

alamatnya dan yang kedua menambahkan suatu<br />

nilai ElmtS yang diberikan.<br />

Halaman 83


procedure Push@ (Input/Output S : STACK Input P :<br />

address)<br />

{Menambahkan sebuah elemen baru pada TOP sebuah<br />

stack, dengan elemen yang diketahui alamatnya}<br />

{K.Awal : Stack mungkin kosong, P terdefinisi (berarti<br />

terdefinisi informasinya, Next (P) = Nil}<br />

{K.Akhir : Top (S) adalah P}<br />

Deklarasi<br />

Deskripsi<br />

{ insert sebagai elemen pertama }<br />

Next (P) ← TOP (S)<br />

TOP (S) ← P<br />

Halaman 84


procedure Push( Input / Output S:STACK Input E: InfoType )<br />

{ Menambahkan sebuah elemen baru pada TOP sebuah stack,<br />

dengan elemen yang diketahui informasinya }<br />

{ K. Awal : Stack mungkin kosong , E terdefenisi , alokasi alamat<br />

selalu berhasil }<br />

{ K. Akhir : TOP (S) berisi E )<br />

Deklarasi<br />

P : address<br />

Deskripsi<br />

Alokasi ( P ) { alokasi selau berhasil }<br />

Info(P) ← E<br />

{ insert sebagai elemen pertama }<br />

Next(P) ← TOP(S)<br />

TOP(S) ← P<br />

Halaman 85


d. Penghapusan sebuah elemen pada<br />

STACK (Pop)<br />

Penghapusan elemen Stack selalu dilakukan pada<br />

TOP , hanya saja harus diperhitungkan bahwa<br />

mugkin Stack akan menjadi kosong akibat<br />

terjadinya penghapusan. Jika Stack menjadi<br />

kosong , maka harga TOP harus diganti . Realisasi<br />

algoritma dari definisi funsional ini adalah salah<br />

satu dari dua buah prosedur yang melakukan<br />

pengambilan elemen stack sebagai berikut .<br />

Prosedur pertama mengambil suatu Elmts dengan<br />

menyimpan alamatnya dan yang kedua mengambil<br />

nilai , dan membebaskan alamat ( dealokasi ) yang<br />

tadinya dipakai<br />

Halaman 86


procedure PopStack@(Input/Output S : STACK<br />

Output P : address)<br />

{K.Awal : Stack tidak kosong<br />

K.Akhir : Alamat elemen Top (S) disimpan pada<br />

P, sehingga informasinya dapat diakses<br />

melalui P<br />

Proses : Menghapus elemen stack, stack tidak boleh<br />

kosong dan mungkin menjadi kosong }<br />

Deklarasi<br />

Deskripsi<br />

P ← TOP (S)<br />

TOP (S) ← Next(TOP(S))<br />

Halaman 87


procedure PopStack(Input/Output S : STACK<br />

Output E : InfoType)<br />

{K.Awal : Stack tidak kosong<br />

K.Akhir : Alamat elemen Top (S) disimpan pada<br />

E, alamat TOP yang lama didealokasi<br />

Proses : Menghapus elemen stack, stack tidak boleh<br />

kosong dan mungkin menjadi kosong }<br />

Deklarasi<br />

P : address<br />

Deskripsi<br />

P ← TOP (S)<br />

E ← Info(P)<br />

TOP (S) ← Next(TOP(S))<br />

Dealokasi (P)<br />

Halaman 88


Soal-Soal<br />

Latihan<br />

1. Mengapa cara penyusunan elemen pada<br />

Stack sering disebut tersusun secara<br />

LIFO?<br />

2. Mengapa pada Stack Traversal dan Search<br />

jarang dilakukan?<br />

3. Penghapusan elemen pada Stack selalu<br />

dilakukan pada elemen yang paling atas,<br />

bagaimana jika terpaksa harus menghapus<br />

elemen yang paling bawah?<br />

Halaman 89


4. Buatlah sebuah fungsi untuk menghitung jumlah<br />

elemen stack yang genap, jika diketahui sebuah<br />

stack dengan elemen bertype integer.<br />

5. Buatlah fungsi/prosedur untuk mencetak elemen<br />

stack yang ganjil<br />

6. Buatlah juga fungsi untuk menghitung rata-rata<br />

elemen Stack yang genap<br />

7. Buatlah sebuah fungsi untuk mengirimkan<br />

elemen pertama Stack<br />

8. Buatlah sebuah fungsi untuk mengirimkan<br />

elemen Stack yang maksimum jika diketahui<br />

elemen Stack terurut mengecil bertype integer<br />

Halaman 90


Halaman 91


6. Queue (Antrian(<br />

Antrian)<br />

6.1. Definisi<br />

Queue (Antrian) adalah list linier yang :<br />

1. Dikenali elemen pertama (Head) dan elemen<br />

terakhirnya (Tail)<br />

2. Aturan penyisipan dan penghapusan elemennya<br />

disefinisikan sebagai berikut :<br />

- Penyisipan selalu dilakukan setelah elemen<br />

terakhir<br />

- Penghapusan selalu dilakukan pada elemen<br />

pertama<br />

3. Satu elemen dengan elemen lain dapat diakses<br />

melalui informasi Next<br />

Halaman 92


Struktur data ini banyak dipakai dalam<br />

informatika misalnya untuk merepresentasi :<br />

1. Antrian job dalam sistem operasi<br />

2. Antrian dalam dunia nyata<br />

Maka secara lojik, sebuah Queue dapat<br />

digambarkan sebagai list linier yang setiap<br />

elemennya adalah :<br />

Type ElmtQ = record<br />

<br />

Halaman 93


dengan InfoType terdefinisi yang menentukan<br />

informasi yang disimpan pada setiap elemen<br />

queue, dan address adalah “alamat” dari<br />

elemen<br />

Selain itu alamat elemen Pertama (Head) dan<br />

elemen terakhir (Tail) dicatat.<br />

Maka jika Q adalah Queue dan P adalah Address,<br />

penulisan untuk Queue adalah :<br />

Head(Q)<br />

Tail(Q)<br />

Next(P)<br />

Info(P)<br />

Halaman 94


Bagian Deklarasi dari algoritma pada Queue :<br />

Deklarasi<br />

type InfoType = … {Sebuah type terdefinisi}<br />

type Address pointer to ElmtQ<br />

type ElmtQ = record<br />

<br />

type Queue = record <br />

{Deklarasi Nama Peubah}<br />

Q : Queue<br />

P : Address<br />

Halaman 95


6.2. Traversal pada Queue<br />

Pada queue, jarang sekali dilakukan<br />

traversal, karena keunikan Queue justru<br />

pada operasi yang hanya menyangkut<br />

elemen pertama dan terakhir. Namun<br />

dibutuhkan traversal misalnya untuk<br />

mencetak isi Antrian.<br />

6.3. Search pada Queue<br />

Pada Queue, elemen yang diproses hanyalah<br />

elemen pada pertama dan terakhir. Maka<br />

hampir tidak pernah dilakukan search.<br />

Halaman 96


6.4. Operasi dan fungsi dasar<br />

pada Queue.<br />

a. Test Queue kosong<br />

Mengetahui bahwa Queue kosong atau tidak<br />

sangat penting, sebab semua operasi akan<br />

dilakukan berdasarkan kosong atau tidaknya<br />

suatu Queue. Realisasi algoritma dari definisi<br />

fungsional ini adalah sebuah fungsi yang<br />

melakukan test terhadap Queue sebagai<br />

berikut :<br />

Halaman 97


function IsQEmpty (Q : Queue) → Boolean<br />

{ TEST Queue kosong : Mengirim true, jika<br />

antrian kosong, false jika antrian tidak<br />

kosong}<br />

Deklarasi<br />

Deskripsi<br />

return ((Head(Q) = Nil) and (Tail(Q) = Nil))<br />

Halaman 98


. Pembuatan Queue kosong<br />

Membuat Queue kosong diperlukan untuk memulai<br />

memakai Queue. Realisasi algoritma dari definisi<br />

fungsional ini adalah sebuah prosedur yang<br />

melakukan inisialisasi Queue sebagai berikut :<br />

Procedure CreateEmptyQ (Output Q : Queue)<br />

{K. Awal : sembarang,<br />

K. Akhir : sebuah queue Q yang kosong terbentuk<br />

Proses : Membuat queue kosong }<br />

Deklarasi<br />

Deskripsi<br />

Head(Q) ← Nil<br />

Tail(Q) ← Nil<br />

Halaman 99


c.Penambahan sebuah elemen pada<br />

Queue<br />

Penambahan selalu dilakukan pada ekor,<br />

dan karena alamat ekor diketahui maka<br />

prosesnya sederhana, yaitu hanya<br />

InsertLast.<br />

Berikut ini akan diberikan skema prosedur<br />

penyisipan tersebut.<br />

Halaman 100


Realisasi algoritma dari definisi fungsional ini<br />

adalah salah satu dari dua buah prosedur<br />

yang melakukan penambahan elemen<br />

Queue sebagai berikut :<br />

Prosedur pertama menambahkan suatu<br />

Elemen Queue yang diketahui alamatnya<br />

dan yang kedua menambahkan suatu nilai<br />

Elemen queue yang diberikan.<br />

Halaman 101


procedure InsertQ@ (Input/Output Q : Queue<br />

Input P : address)<br />

{K.Awal : Queue mungkin kosong, P terdefinisi<br />

(berarti terdefinisi informasinya, Next<br />

(P) = Nil<br />

K.Akhir : P menjadi elemen Tail dari Q dan<br />

Tail yang baru adalah P<br />

Proses : Insert sebuah elemen beralamat P<br />

pada Tail dari antrian Q }<br />

Deklarasi<br />

Halaman 102


Deskripsi<br />

If IsQEmpty(Q) then<br />

Head(Q) ← P<br />

Tail(Q) ← P<br />

else<br />

Next(Tail(Q)) ← P<br />

Tail(Q) ← P<br />

endif<br />

Halaman 103


procedure InsertQ(Input/Output Q : Queue<br />

Input E : InfoType)<br />

{K.Awal : Queue mungkin kosong, E<br />

terdefinisi<br />

K.Akhir : Elemen Tail dari Q yang baru<br />

bernilai E<br />

Proses<br />

: Insert sebuah elemen nilai pada<br />

Tail dari antrian Q }<br />

Deklarasi<br />

Halaman 104


Deskripsi<br />

Alokasi (P)<br />

Info (P) ← E<br />

If IsQEmpty(Q) then<br />

Head(Q) ← P<br />

Tail(Q) ← P<br />

else<br />

Next(Tail(Q)) ← P<br />

Tail(Q) ← P<br />

endif<br />

Halaman 105


d. Penghapusan Elemen Pada QueuE<br />

Penghapusan elemen pada queue selalu<br />

dilakukan pada elemen pertama, hanya saja<br />

perlu diperhitungkan bahwa mungkin queue<br />

menjadi kosong akibat terjadinya<br />

penghapusan. Jika queue menjadi kosong,<br />

maka harga Tail harus diganti. Jika akibat<br />

penghapusan queue tidak kosong, maka<br />

elemen terakhir tidak berubah.<br />

Halaman 106


Berikut adalah skema penghapusan tersebut.<br />

Prosedur pertama melakukan penghapusan<br />

ElmtQ yang berada di Head danyang dicatat<br />

adalah alamatnya, yaitu P. Prosedur yang<br />

kedua menghapus elemen Head dari queue dan<br />

menyimpannya pada suatu elmtQ serta<br />

membebaskan alamat yang tadinya dipakai<br />

oleh elemen Head tersebut.<br />

Halaman 107


procedure DeleteQ@(Input/Output Q : Queue<br />

Output P : address)<br />

{K.Awal : Queue tidak kosong<br />

K.Akhir : P bukan lagi elemen dari Q, P ≠ Nil,<br />

Next(P) = Nil<br />

Proses : Menghapus elemen Head dari antrian,<br />

antrian tidak boleh kosong dan<br />

mungkin menjadi kosong }<br />

Deklarasi<br />

Deskripsi<br />

Halaman 108


P ← Head(Q)<br />

Head(Q) ← Next(Head(Q))<br />

if (Head(Q) = Nil) then<br />

Tail(Q) ← Nil<br />

endif<br />

Next(P) ← Nil<br />

Halaman 109


procedure DeleteQ(Input/Output Q : Queue<br />

Output E : InfoType)<br />

{K.Awal : Queue tidak kosong<br />

K.Akhir : Jika P adalah Head(Q). P bukan lagi<br />

elemen dari Q, P ≠ Nil,<br />

Next(P) = Nil<br />

Proses<br />

Deklarasi<br />

Deskripsi<br />

: Menghapus elemen Head dari antrian,<br />

antrian tidak boleh kosong dan<br />

mungkin menjadi kosong }<br />

Halaman 110


P ← Head(Q)<br />

E ← Info(Head(Q))<br />

Head(Q) ← Next(Head(Q))<br />

if (Head(Q) = Nil) then<br />

Tail(Q) ← Nil<br />

endif<br />

Next(P) ← Nil<br />

Dealokasi(P)<br />

Halaman 111


Soal-Soal<br />

1. Mengapa cara penyusunan elemen pada<br />

Queue Sering disebut tersusun secara<br />

FIFO?<br />

2. Mengapa pada Queue Traversal dan<br />

Search jarang dilakukan?<br />

3. Penghapusan elemen pada Queue selalu<br />

dilakukan pada elemen yang paling depan,<br />

bagaimana jika terpaksa harus menghapus<br />

elemen yang paling belakang?<br />

Halaman 112


4. Buatlah sebuah fungsi untuk menghitung jumlah<br />

elemen queue yang ganjil, jika diketahui sebuah<br />

queue dengan elemen bertype integer.<br />

5. Buatlah fungsi/prosedur untuk mencetak elemen<br />

queue yang genep<br />

6. Buatlah juga fungsi untuk menghitung rata-rata<br />

elemen queue yang ganjil<br />

7. Buatlah sebuah fungsi untuk mengirimkan elemen<br />

pertama queue<br />

8. Buatlah sebuah fungsi untuk mengirimkan elemen<br />

queue yang maksimum jika diketahui elemen queue<br />

terurut membesar dan bertype integer<br />

Halaman 113


Halaman 114


7. Pohon (Tree)<br />

7.1. Definisi Rekurens Dari Pohon<br />

Sebuah pohon adalah himpunan terbatas tidak<br />

kosong, dengan elemen yang dibedakan<br />

sebagai berikut :<br />

1. Sebuah elemen yang dibedakan dari yang<br />

lain yang disebut sebagai AKAR (root) dari<br />

pohon<br />

2. Elemen yang lain (jika masih ada) dibagibagi<br />

menjadi beberapa sub himpunan yang<br />

disjoint dan masing-masing sub himpunan<br />

tersebut adalah pohon yang disebut sebagai<br />

sub pohon dari pohon tersebut.<br />

Halaman 115


Beberapa Istilah<br />

1. Hutan<br />

Hutan adalah sequence (list) dari pohon<br />

2. Simpul (Node)<br />

Simpul adalah elemen dari pohon yang<br />

memungkinkan akses pada sub pohon dimana<br />

simpul tersebut berfungsi sebagai Akar<br />

3. Cabang<br />

Cabang adalah hubungan antara Akar dengan<br />

sub pohon<br />

Halaman 116


4. Ayah<br />

Akar dari sebuah pohon adalah Ayah dari<br />

sub pohon<br />

5. Anak<br />

Anak dari sebuah pohon adalah Sub pohon<br />

6. Saudara<br />

Saudara adalah simpul-simpul yang<br />

mempunyai Ayah yang sama<br />

7. Daun<br />

Daun adalah simpul terminal dari pohon.<br />

Semua simpul selain Daun adalah simpul<br />

bukan terminal<br />

Halaman 117


8. Jalan (Path)<br />

Jalan adalah suatu urutan tertentu dari<br />

Cabang<br />

9. Derajat<br />

Derajat sebuah pohon adalah banyaknya<br />

anak dari dari pohon tersebut.<br />

Jika sebuah simpul berderajat N disebut<br />

pohon N-aire<br />

1 disebut pohon 1-aire/uner<br />

2 disebut pohon 2-aire/biner<br />

Halaman 118


10. Tingkat (Level)<br />

Level pohon adalah panjangnya jalan dari<br />

Akar sampai dengan simpul yang<br />

bersangkutan. Panjang dari jalan adalah<br />

banyaknya simpul yang dikandung pada<br />

jalan tersebut. Akar mempunyai tingkat sama<br />

dengan 1.<br />

Dua buah simpul disebut sebagai Sepupu jika<br />

mempunyai tingkat yang sama dalam sebuah<br />

pohon.<br />

Halaman 119


11. Kedalaman (Tinggi)<br />

Kedalaman (Tinggi) dari pohon adalah nilai<br />

maksimum dari tingkat simpul yang ada pada<br />

pohon tersebut. Kedalaman adalah panjang<br />

maksimum jalan dari Akar menuju ke sebuah<br />

daun<br />

12. Lebar<br />

Lebar sebuah Pohon adalah maksimum<br />

banyaknya simpul yang ada pada suatu<br />

Tingkat (Level)<br />

Halaman 120


7.2. Struktur Pohon Biner<br />

Definisi<br />

Sebuah pohon biner (Binary Tree) adalah<br />

himpunan terbatas yang :<br />

‣ Mungkin kosong atau<br />

‣ Terdiri dari sebuah simpul yang disebut<br />

sebagai Akar dan dua buah himpunan lain<br />

yang disjoint yang merupakan pohon biner<br />

yang disebut sebagai Sub Pohon Kiri (Left)<br />

dan Sub Pohon Kanan (Right) dari pohon biner<br />

tersebut.<br />

Halaman 121


Pohon biner merupakan tipe yang sangat penting<br />

dari struktur data dan banyak dijumpai<br />

dalam berbagai terapan. Karakteristik yang<br />

dimiliki oleh pohon biner adalah bahwa<br />

setiap simpul paling banyak hanya<br />

memiliki dua buah anak, dan mungkin<br />

tidak punya anak.<br />

Istilah-istilah yang digunakan sama dengan<br />

istilah pada pohon secara umum.<br />

Halaman 122


Notasi Prefiks, Infiks dan Postfiks<br />

1. Notasi Prefiks<br />

Notasi Prefiks ditulis dengan cara mengikuti<br />

alur sebagai berikut :<br />

Halaman 123


2. Notasi Infiks<br />

Notasi ini ditulis dengan cara mengikuti alur<br />

sebagai berikut :<br />

Halaman 124


3. Notasi Posfiks<br />

Notasi ini ditulis dengan cara mengikuti alur<br />

sebagai berikut :<br />

Halaman 125


Rekonstruksi Algoritma<br />

{Deklarasi Type}<br />

Type Infotype = … {terdefinisi}<br />

Type node = record <br />

Type BinTree : address<br />

{Primitif}<br />

Halaman 126


function Akar (P : BinTree)→ infotype<br />

{Mengirimkan nilai Akar pohon biner P}<br />

function Left (P : BinTree)→ infotype<br />

{Mengirimkan anak kiri pohon biner P}<br />

function Right (P : BinTree)→ infotype<br />

{Mengirimkan anak kanan pohon biner P}<br />

Halaman 127


function IsEmpty(P : BinTree)→boolean<br />

{ Test apakah sebuah pohon kosong,<br />

mengirimkan True jika kosong dan False jika<br />

tidak}<br />

procedure MakeTree(input Akar : infotype, L :<br />

BinTree, R : BinTree, output P : BinTree)<br />

{ K. Awal : sembarang<br />

K. Akhir: Terbentuk sebuah pohon biner<br />

Proses : Menghasilkan sebuah pohon biner<br />

dari Akar, L dan R}<br />

Halaman 128


{Traversal}<br />

Procedur PreOrder(input P : BinTree)<br />

{K. AWAL : P terdefinisi<br />

K. AKHIR : Semua simpul P sudah<br />

diproses secara preorder}<br />

Procedure InOrder(input P : BinTree)<br />

{K. AWAL : P terdefinisi<br />

K. AKHIR : Semua simpul P sudah<br />

diproses secara inorder}<br />

Halaman 129


Procedure PostOrder(input P : BinTree)<br />

{K. AWAL : P terdefinisi<br />

K. AKHIR : Semua simpul P sudah<br />

diproses secara postorder}<br />

Procedure PrintTree(input P : BinTree, h : integer)<br />

{K. AWAL : P terdefinisi, h adalah jarak indentasi<br />

K. AKHIR : Semua simpul P sudah ditulis dengan<br />

indentasi}<br />

Halaman 130


{Search}<br />

function Search(P : BinTree, X : infotype)→boolean<br />

{Mengirimkan True jika ada node P bernilai X, false<br />

jika tidak}<br />

{fungsi lain}<br />

function NbElmt(P : BinTree)→integer<br />

{Mengirimkan banyaknya elemen (node) pohon<br />

biner P}<br />

Halaman 131


function NbDaun(P : BinTree) →integer<br />

{ Mengirimkan banyaknya daun pohon biner P}<br />

function IsUnerLeft(P : BinTree) →boolean<br />

{ Mengirimkan True jika pohon biner tidak<br />

kosong P adalah pohon unerleft yaitu hanya<br />

mempunyai sub pohon kiri}<br />

function IsUnerRight(P : BinTree) →boolean<br />

{ Mengirimkan True jika pohon biner tidak<br />

kosong P adalah pohon unerright yaitu hanya<br />

mempunyai sub pohon kanan}<br />

Halaman 132


function IsBin(P : BinTree)→boolean<br />

{ Mengirimkan True jika pohon biner tidak<br />

kosong P adalah pohon biner yaitu mempunyai<br />

sub pohon kanan dan sub pohon kiri}<br />

function IsSkewLeft(P : BinTree)→boolean<br />

{ Mengirimkan True jika pohon biner P adalah<br />

pohon condong kiri}<br />

function IsSkewRight(P : BinTree)→boolean<br />

{ Mengirimkan True jika pohon biner P adalah<br />

pohon condong kanan}<br />

Halaman 133


function Tinggi(P : BinTree)→integer<br />

{ Mengirimkan tinggi dari pohon biner P}<br />

function Level(P : BinTree, X : infotype)→integer<br />

{ Mengirimkan level dari node X yang merupakan<br />

salah satu simpul dari pohon biner P}<br />

{Operasi Lain}<br />

Halaman 134


Procedure AddDaunTerkiri(input/output P:BinTree,<br />

input X: infotype)<br />

{K. AWAL : P boleh kosong<br />

K. AKHIR : P bertambah simpulnya, dengan X<br />

adalah simpul daun terkiri}<br />

Procedure AddDaun(input/output P:BinTree, input<br />

X, Y : infotype, input Kiri : boolean)<br />

{K. AWAL : P tidak boleh kosong, X adalah salah<br />

satu daun pohon Biner P<br />

K. AKHIR : P bertambah simpulnya, dengan Y<br />

adalah anak kiri X (jika kiri) atau<br />

sebagai anak kanan X (jika not kiri)}<br />

Halaman 135


Procedure DelDaunTerkiri(input/output<br />

P:BinTree, output X: infotype)<br />

{K. AWAL : P tidak kosong<br />

K. AKHIR: P dihapus daun terkirinya dan<br />

didealokasi, dengan X adalah info<br />

yang semula disimpan pada daun<br />

terkiri yang dihapus}<br />

Procedure DelDaun(input/output P:BinTree,<br />

output X: infotype)<br />

{K. AWAL : P tidak kosong, X adalah salah satu<br />

daun<br />

K. AKHIR : X dihapus dari P}<br />

Halaman 136

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!