23.10.2014 Views

STRUKTUR DATA

STRUKTUR DATA

STRUKTUR DATA

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<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


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 29


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 30


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 31


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 32


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 33


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 34


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 35


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 36


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 37


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 38


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 39


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 40


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 41<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 42


{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 43


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 44


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 45


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 46


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 47


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 48


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 49


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 50


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 51


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 52


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 53


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 54


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 55


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 56


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 57


Procedure InsertLast(Input/output L :List, Input E : Infotype)<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<br />

: Insert sebuah elemen beralamat P sebagai<br />

elemen terakhir dari list linier L yang mungkin<br />

kosong }<br />

Deklarasi<br />

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

Deskripsi<br />

Alokasi (P)<br />

If (P ≠ Nil) then<br />

Info(P) ←E<br />

InsertLast@(L,P)<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 59


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 60


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 61


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 62


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 63


{ 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 64


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 65


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 66


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 67


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 68


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 69


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 70


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 71


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 72


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 73


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 74


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 75


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 76


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 77


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 78


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 79


. 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 80


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 81


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 82


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 83


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 84


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 85


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 86


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 87


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 88


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 89


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 90


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 91


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 92


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 93


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 94


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 95


. 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 96


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 97


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 98


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 99


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 100


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 101


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 102


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 103


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 104


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 105


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 106


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 107


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 108


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 109


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 110


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 111


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 112


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 113


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 114


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 115


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 116


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 117


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 118


Notasi Prefiks, Infiks dan Postfiks<br />

1. Notasi Prefiks<br />

Notasi Prefiks ditulis dengan cara mengikuti<br />

alur sebagai berikut :<br />

Halaman 119


2. Notasi Infiks<br />

Notasi ini ditulis dengan cara mengikuti alur<br />

sebagai berikut :<br />

Halaman 120


3. Notasi Posfiks<br />

Notasi ini ditulis dengan cara mengikuti alur<br />

sebagai berikut :<br />

Halaman 121


Rekonstruksi Algoritma<br />

{Deklarasi Type}<br />

Type Infotype = … {terdefinisi}<br />

Type node = record <br />

Type BinTree : address<br />

{Primitif}<br />

Halaman 122


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 123


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 124


{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 125


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 126


{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 127


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 128


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 129


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 130


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 131


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 132

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

Saved successfully!

Ooh no, something went wrong!