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