Modul Algoritma & Struktur Data
Modul Algoritma & Struktur Data
TEKNIK INFORMATIKA
FAKULTAS TEKNIK UNIVERSITAS SILIWANGI
Jl. Siliwangi No. 24 Tasikmalaya Kotak Pos 164 Tlp. (0265) 323537
E-Mail : [email protected];
URL : http://if.unsil.ac.id/
1 PEMROSESAN FILE
Data yang disimpan pada tipe-tipe data yang telah dipelajari pada bab-bab sebelumnya
bersifat sementara. Artinya, sewaktu program selesai dijalankan, data tersebut akan
hilang. Pada banyak aplikasi, data yang dimasukkan, meskipun program telah selesai,
harus disimpan. Contohnya aplikasi pemesanan tiket kereta api atau transaksi
perbankan. Data pesanan tiket dan data transaksi keuangan harus tetap disimpan sampai
diinginkan dihapus.
Untuk memecahkan masalah penyimpanan data yang seperti itu digunakan file. Data
yang dioutputkan oleh program dapat disimpan dalam sebuah file(file output). Data
pada file juga dapat dibaca lagi(file input). Jenis file ada dua macam yaitu file teks dan
nonteks.
FILE TEKS
File teks adalah sebuah file yang terdiri dari karakter-karakter. Karakter-karakter
tersebut dapat dianggap sebagai data yang bertipe karakter, integer, real, atau string
tergantung tipe data yang digunakan untuk menyimpan hasil pembacaan dari file.
Deklarasi File
Supaya dapat menggunakan file teks, maka file tersebut harus dideklarasikan terlebih
dahulu. Cara mendeklarasikan file teks adalah
contoh :
F : text
Instruksi Baku
Untuk pemrosesan file, Pascal telah menyediakan sejumlah instruksi baku berupa
prosedur atau fungsi yang dapat langsung digunakan dengan cara memanggil prosedur
atau fungsi tersebut. Beberapa instruksi baku untuk pemrosesan File yang sudah
tersedia antara lain :
Assign, berfungsi untuk membuka file untuk siap dibaca atau ditulis. Cara
memanggil prosedur ini dengan perintah Assign(Nama File, File Fisik). Nama
File digunakan untuk menampung isi dari File Fisik
Assign(F, data.txt);
Rewrite(F);
{File dibuka untuk ditulisi}
Assign(F, data.txt);
Reset(F);
{File dibuka untuk dibaca}
Read, berfungsi untuk membaca isi file kemudian ditampung dalam sebuah
variabel. Tipe data variable disesuaikan dengan hasil pembacaan dari file, bisa
bertipe integer, character, string, atau record. Isi dari file akan dikonversi sesuai
dengan tipe variabel tempat menyimpan data yang dibaca jika memungkinkan.
Jika isi file bertipe string sedangkan variabel bertipe integer tidak dapat
dilakukan karena tidak memungkinkan. Jika file berisi angka maka variabel
dapat bertipe integer, karakter atau string. Variabel tersebut harus sudah
dideklarasikan sebelumnya.
Cara memanggil prosedur ini dengan perintah Read(Nama File, Nama Variabel)
Jika deklarasi programnya sebagai berikut :
var
F : text;
i : integer;
c : char;
kalimat : string
Maka contoh perintah yang menggunakan statement Read antara lain
contoh :
Read(F, i)
{membaca isi file F yang bertipe integer
disimpan di i}
Read(F, c)
{membaca isi file yang bertipe karakter disimpan di c}
Read(F, kalimat){membaca isi file yang bertipe string disimpan di
kalimat}
Write, berfungsi untuk menulis nilai atau isi variable ke dalam file. Cara
memanggil prosedur ini dengan perintah Write(Nama File, Nama Variabel)
contoh :
i := 5;
Write(MyFile, i)
{menuliskan isi variable i ke dalam file MyFile}
kalimat := Pemrosesan File;
Write(MyFile, kalimat)
{ menuliskan isi variable kalimat ke MyFile}
Write(MyFile, Informatika); { menuliskan Informatika ke MyFile}
: Close(F)
Berikut ini beberapa contoh program untuk memperjelas pemahaman tentang file teks :
Program 1.1 :
program Tulis_Jurusan;
var
fjurusan : text;
begin
assign(fjurusan,'jurusan.txt');
rewrite(fjurusan);
writeln(fjurusan,'Jurusan Teknik Informatika');
writeln(fjurusan,'Fakultas Teknik');
writeln(fjurusan,'Universitas Siliwangi');close(fjurusan);
end.
Jika ingin menggunakan file yang sudah ada dan menambahkan isinya gunakan
prosedure append(Nama File)
Program 1.2 : Program Pembacaan isi file teks dan menuliskannya di layar
program Baca_Jurusan;
uses
crt;
var
fjurusan : text;
temp
: string;
begin
clrscr;
assign(fjurusan,'jurusan.txt');
reset(fjurusan);
while not eof (fjurusan) do
begin
readln(fjurusan,temp);
writeln(temp);
end;
close(fjurusan);
readln;
end.
FILE SEKUENSIAL
File sekuensial atau file beruntun termasuk file non teks. File Sekuensial adalah
sekumpulan elemen data bertipe sama yang diakses secara berurutan mulai dari elemen
data pertama sampai elemen data terakhir. Data di dalam file sekuensial diakses satu
persatu secara searah. Struktur file sekuensial tidak jauh berbeda dengan struktur array,
perbedaannya array disimpan di memori sedangkan file sekuensial disimpan di dalam
HardDisk sehingga tidak akan hilang setelah program selesai dijalankan dan dapat
diakses kembali. Selain itu pengaksesan elemen file tidak dapat diakses langsung
melalui indeksnya.
Deklarasi File
Cara mendeklarasikan file sekuensial di dalam bagian deklarasi adalah sebagai
berikut:
Nama_File : file of tipe_elemen_data
{PENULISAN FILE}
assign(FInt,'Integer.txt');
rewrite(FInt);
i:=1;
repeat
write('Data - ',i,' : '); readln(bil);
write(FInt,Bil);
i:=i+1;
until (i>10);
close(FInt);
clrscr;
{PEMBACAAN FILE}
assign(FInt,'Integer.txt');
reset(FInt);
while not eof(FInt) do
begin
read(FInt, bil);
writeln(bil);
end;
close(FInt);
readln;
end.
Program 1.5 : Program Penulisan File bertipe terstruktur(record)
Program BuatArsipMahasiswa;
uses crt;
begin
clrscr;
writeln(' PENULISAN FILE'); writeln;
assign(Mhs,'Mhs.dat');
rewrite(Mhs);
repeat
write('NIM : '); readln(MSiswa.NIM);
write('Nama : '); readln(MSiswa.Nama);
write('IP : '); readln(MSiswa.IP);
write(Mhs,MSiswa); {data yang ditampung var MSiswa dimasukkan ke file
Mhs}
write('Input Data Lagi? ');readln(answer);writeln;
until (answer='t') or (answer='T');
close(Mhs);
end.
Program 1.6 : Program Pembacaan File bertipe terstruktur(record)
Program BacaArsipMahasiswa;
uses crt;
type
DataMhs = record
NIM : longint;
Nama: string[25];
IP : real;
end;
var
MSiswa : DataMhs;
Mhs : File of DataMhs;
begin
clrscr;
writeln('
PEMBACAAN FILE');
writeln('-----------------------------------');
writeln('
NIM
Nama
IP');
writeln('-----------------------------------');
assign(Mhs,'Mhs.dat');
reset(Mhs);
while not eof(Mhs) do
begin
read(Mhs,MSiswa); {hasil pembacaan file ditampung di var MSiswa}
writeln(MSiswa.NIM:10,MSiswa.Nama:16,MSiswa.IP:8:2);
end;
close(Mhs);
LATIHAN SOAL
1. Dengan memperhatikan contoh pemrosesan file teks seperti contoh program 1.1,
1.2 dan 1.3 yang sudah dibahas, buatlah program untuk biodata/ daftar riwayat
hidup anda masing-masing
2. Dengan memperhatikan contoh pemrosesan file teks seperti contoh program 1.4,
1.5 dan 1.6 yang sudah dibahas, buatlah program untuk biodata/daftar riwayat
hidup anda dan senua teman-teman sekelas anda.
3. Dari contoh-contoh diatas, implementasikan kedalam bahasa pemrograman turbo
C/ C++
MESIN ABSTRAK
Mesin adalah mekanisme yang terdefinisi dan mengerti serta mampu untuk
mengekseskusi aksi-aksi primitif yang terdefinisi untuk mesin tersebut. Mesin abstrak
adalah mesin yang dianggap ada, dan diasumsikan mampu melakukan mekanisme yang
didefinisikan untuk mesin tersebut. Mesin abstrak memodelkan suatu semesta (universe)
tertentu.
Dalam pemrograman, seringkali pemrogram harus mendefinisikan mesin-mesin abstrak
sebelum menuliskan kode program karena mesin abstrak memungkinkan pemrogram
untuk melakukan pemecahan masalah secara bertahap. Mesin abstrak yang diciptakan
pada tahap konseptual bahkan memungkinkan pemrogram untuk berfikir tahap demi
tahap, sampai akhirnya dijabarkan dalam terminologi mesin riil.
Mesin Riil
Mesin Abstrak
Mesin Abstrak
Sebetulnya, bahasa tingkat tinggi adalah mesin abstrak bagi asembler, dan lebih abstrak
bagi mesin rill yaitu komputer.
Mendefinisikan mesin abstrak, berarti mendefinisikan.
sekumpulan state yang mungkin
sekumpulan aksi primitif yang diasumsikan dapat dimengerti dan dieksekusi mesin
bersangkutan.
Contoh macam-macam mesin abstrak misalnya: mesin gambar, mesin karakter, mesin
integer, mesin rekam, dan lain-lain. Pada diktat ini, akan diberikan contoh mesin abstrak
untuk mesin integer dan mesin karakter.
MESIN INTEGER (PENCACAH)
Mesin integer adalah mesin abstrak yang terdiri dari : tombol RESET dan INC. Seperti
halnya mesin karakter, mesin ini sebuah jendela yang menunjukan sebuah angka integer
INC
dimajukan satu
harga
harga + 1
START yang berfungsi untuk memulai pembacaan pita karakter dan meempatkan
head/CC pada karakter pertama dalam pita
procedure START
{mesin siap dioperasikan. Pita disiapkan untuk dibaca. Karakter pertama pada pita
posisinya ada pada jendela sebagai Current Character
2)
procedure ADV
{Pita dimajukan.
IS : karakter pada jendela = CC, CC .
FS : CC adalah karakter berikutnya dari CC yang lama, CC mungkin
. maka lampu EOP akan menyala}
= . jika CC =
Catatan : EOP diwakili oleh tipe boolean., bernilai true jika menyala, atau false jika
tidak menyala. Jika EOP menyala, mesin sudah tidak bisa dioperasikan lagi
MESIN GAMBAR
Mesin gambar adalah mesin abstrak yang terdiri dari : bidang gambar dan pena.
Keduanya menyatakan keadaan (State) dari mesin.
Bidang gambar yaitu sekumpulan titik yang membentuk sebuah permukaan terbatas
yang posisinya dikenali melalui koordinat kartesian dengan (0.0,0.0) di kiri atas bidang
gambar. Keadaan bidang gambar dinyatakan oleh titik-titik koordinat yang hitam atau
putih Setiap titik koordinat (x,y) pada bidang gambar dapat berada dalam keadaan hitam
atau putih.
(500.0, 500.0)
(0.0, 0.0)
Y
Pena :
Pena mempunyai 3 atribut yaitu :
Posisi penulisan (disingkat Pen) : bisa "on" atau "off". Hanya pada posisi "on",
pena dapat menghitamkan titik bidang gambar. Pena tidak pernah bisa
memutihkan titik bidang gambar.
Posisi pada permukaan (disingkat Posxy) : posisinya pada koordinat bidang
gambar bertype:
type Point : <X:real,Y:real>
LATIHAN SOAL
1. Diberikan empat pita sebagai berikut, hitung karakter dari pita-pita sebagai berikut
I
.
Deretan aksi (penekanan tombol) pada kedua mesin untuk menghitung banyaknya
huruf pada pita :
1.a)
START; RESET
{ CC=I, CI = 0}
1.b.)
START; RESET
{CC=L,CI=1}
{CC= ,CI=2}
{CC=F,CI=3}
{CC=A,CI=4}
{CC=I,CI=5}
{CC=T,CI=6}
{CC= ,CI=7}
{CC=B,CI=8}
{CC=E,CI=9}
{CC=A,CI=10}
{CC=U,CI=11}
{CC=.,CI=12}
2) START; RESET
ADV; INC
ADV; INC
ADV; INC
ADV; INC
{ CC=Y, CI = 0}
{CC=A,CI=1}
{CC= ,CI=2}
{CC= ,CI=3}
{CC=.,CI=4}
3)
{ CC=T, CI = 0}
{CC=.,CI=1}
START; RESET
ADV; INC
4)
START; RESET
INC;ADV
INC;ADV
INC;ADV
INC;ADV
INC;ADV
INC;ADV
INC;ADV
INC;ADV
INC;ADV
INC;ADV
INC;ADV
INC;ADV
{ CC=., CI = 0}
U
A
A
N
T
S
K
I
I
A
L
.
.
.
3. Buatlah algoritma yang membaca titik awal sebuah topi dan panjang sisi miringnya,
kemudian menggambarkan barisan topi sebagai berikut :
5.
60.0
60.0
(0.0, 0.0
3 PROGRAM REKURSIF
Program rekursif adalah program yang memanggil dirinya sendiri. Oleh karena itu,
program rekursif harus dinyatakan dalam prosedur atau fungsi, karena hanya prosedur
dan fungsi yang dapat dipanggil dalam sebuah program.
Fungsi atau Prosedur Rekursif disusun oleh dua komponen :
1. Basis(komponen basis)
fungsi : Menghentikan rekursif dan memberi nilai yang terdefinisi
2. Aturan rekursif(komponen induksi)
fungsi : mendefinisikan dengan dirinya sendiri
Aturan rekursif dapat memungkinkan komputasi tak berhingga bila komputasi tidak
mencapai komponen basis. Pemrogram harus berhati-hati dalam membuat definisi
rekursif. Definisi harus menunjukkan pergerakan yang semakin menuju ke objek yang
lebih sederhana sehingga memungkinkan deinisi tersebut berhenti.
Studi Kasus Rekursif :
1. Perhitungan jumlah deret integer
Permasalahan : Diberikan sebuah integer non-negatif, n, buatlah algoritma untuk
menghitung jumlah deret integer mulai dari 1 sampai n
Permasalahan tersebut dapat diselesaikan dengan pengulangan dan rekursif
Algoritma Perhitungan jumlah deret integer dengan pengulangan
Algoritma Jumlah_Deret
Kamus
i,n, sum : integer
Deskripsi
read(n)
{n = banyaknya deret}
sum 0
for i 1 to n do
sum sum + i
endfor
write(sum)
2.
Perhitungan Faktorial
Definisi secara iterasi :
n! = 1 x 2 x x n dan didefinisikan 0! = 1
contoh : 5! = 1 * 2 * 3 * 4 * 5
n! = 1
n! = n x (n-1)!
, jika n = 0
{komponen basis}
, jika n > 0
{komponen induksi}
{Plus(x,y)}
Hal yang harus diperhatkan dalam melakukan proses rekursif aitu memastikan batas
atau kondisi berhenti proses rekursif. Pada fungsi fact di atas kondisi berhenti jika n=0.
Sebellum mengimplementasikan suatu proses rekursif yakinkan bahwa syarat berhenti
dapat dicapai. Jangan sampai proses berhenti tidak pernah dapat tercapai.
Untuk itu, berbagai kondisi yang dapat menyebabkan rekursif tak berujung harus dapat
ditangani (contohnya jika kita masukkan n<0). Proses rekursif yang tak berujung akan
menyebabkan memori system habis, dengan kata lain komputer hang,
LATIHAN
1. Tuliskanlah sebuah fungsi yang menghitung Fibonacci dari n , dengan definisi
rekursif
2. Tuliskanlah sebuah fungsi yang menjumlahkan dua buah integer, dan menghasilkan
sebuah integer, dengan membuat definisi rekursif dari penjumlahan
3. Tuliskanlah sebuah fungsi yang mengalikan dua buah integer, dan menghasilkan
sebuah integer, dengan membuat definisi rekursif dari perkalian.
4 KOLEKSI OBJEK
Seringkali kita harus mengelola sekumpulan (koleksi) objek, dan tidak hanya sebuah
objek secara individual. Setiap elemen dalam suatu koleksi objek harus bertype sama
(mungkin type dasar, atau suatu ADT yang pernah didefinisikan, atau suatu objek dari
kelas tertentu), dan biasanya mempunyai keterurutan tertentu.
Definisi koleksi dan elemen dapat dilakukan dengan dua cara:
Definisi iteratif: dengan mendefinisikan setiap elemen
Definisi rekursif: suatu koleksi objek bahkan dapat mengandung elemen berupa
koleksi itu sendiri
Koleksi objek :
Diberi nama kolektif, dan nama elemennya
Diorganisasi elemennya baik secara linier, maupun tidak linier
Dapat diakses setiap elemen koleksinya secara individual, lewat nama atau address.
Bagaimana mengakses elemen yang lain berdasarkan individu elemen terdefinisi
yang sedang current Diproses per elemen atau seluruh koleksi
Banyaknya elemen suatu koleksi objek dapat tidak ada, berrati koleksi objeknya
kosong, atau bertambah/berkurang secara dinamik.
Alokasi Memori untuk seluruh koleksi dapat dilakukan:
Sekaligus (statik)
Type koleksi
Primitif :
terhadap koleksi
Pada bidang komputer, beberapa koleksi objek didefinisikan secara persis aturan- aturan
penyimpanan, penambahan, penghapusan elemennya. Ini melahirkan struktur data
standard di bidang komputer seperti:
List linier
Matriks
Stack (tumpukan)
Pembuatan/penciptaan
Penghapusan (delete)
Perubahan (update)
Penggabungan
Operasi-operasi lain
b. Representasi lojik
Representasi lojik adalah spesifikasi type dari struktur, yang menyangkut nama type
dan spesifikasi semua operator, namun dalam definisi type ini, alamat masih belum
ditentukan secara pasti. Representasi lojik tak tergantung pada memori komputer.
Struktur ini memudahkan pemrogram untuk merancang data dan algoritma, serta tak
bergantung pada mesin apapun.
Pada konsteks prosedural, pada definisi ini, didefinisikan dengan lebih jelas, operator
fungsional menjadi fungsi atau prosedur, dengan spesifikasi parameter yang lebih jelas.
Selain itu, dapat pula didefinisikan primitif lain yang secara khusus erat hubungannya
dengan prosedural yaitu traversal atau search.
c. Representasi (implementasi) fisik
Representasi fisik adalah spesifikasi dari struktur data sesuai dengan implementasinya
dalam memori komputer dan kesediaan dalam bahasa pemrograman. Pada dasarnya,
hanya ada dua macam implementasi fisik : kontigu atau berkait.
Representasi fisik kontigu adalah sekumpulan data yang penempatannya dalam memori
benar-benar secara fisik adalah kontigu, setiap elemen ditaruh secara berturutan posisi
alamatnya dengan elemen lain. Karena itu untuk mencapai satuan elemen berikutnya,
cukup melalui suksesor alamat yang sedang "current". Supaya suksesor tetap terdefinisi,
maka tempat yang dialokasikan untuk struktur ini sudah ditetapkan sebelumnya, supaya
data tidak "kemana-mana". Dikatakan bahwa struktur ini adalah struktur yang statis,
karena alokasi memori dilakukan sekaligus untuk seluruh koleksi.
Representasi fisik berkait adalah sekumpulan data yang penempatannya pada memori
List linier
Multi List
Tree (Pohon)
Grap
Stack
5 STACK
5.1 Kaitan Stack dengan Struktur Data
Struktur data adalah cara menyimpan atau merepresentasikan data didalam komputer
agar bisa dipakai secara efisien. Sedangkan data adalah representasi dari fakta dunia nyata.
Fakta atau keterangan tentang kenyataan yang disimpan, direkam atau direpresentasikan
dalam bentuk tulisan, suara, gambar, sinyal atau simbol. Secara garis besar type data dapat
dikategorikan menjadi:
Type data sederhana.
Type data sederhana tunggal/dasar, misalnya Integer, Real, boolean dan karakter.
- Non Linier
5.2 Stack
Stack adalah suatu tumpukan dari benda atau urutan elemen yang elemennya dapat
diambil dan ditambah hanya pada posisi akhir (Top) yang lebih dikenal dengan istilah LIFO
(Last In First Out). Contoh dalam kehidupan sehari-hari adalah tumpukan Dus disebuah
gudang yang tumpukannya dapat ditambah pada bagian paling atas dan jika mengambilnya
pun dari bagian paling atas pula.
Contoh dalam pemrograman, stack bisa digunakan untuk pengujian kalimat palindrome,
penguji tanda kurung (matching parentheses), dan juga berfungsi sebagai konversi dari notasi
infix menjadi notasi postfix.
5.3 Operasi-operasi pada stack
Operasi dasar yang bisa dilakukan, yaitu :
1. Operasi PUSH, operasi menambahkan elemen pada urutan terakhir (paling atas).
2. Operasi POP, operasi mengambil sebuah elemen data pada urutan terakhir dan
menghapus elemen tersebut dari stack.
Operasi lainnya :
1. Proses Deklarasi, proses pendeklarasian stack
Full : Fungsi untuk memeriksa apakah stack yang ada sudah penuh
Function Full : Boolean;
Begin
Full := False;
If top = max then Full := True;
End;
Push : Menambahkan sebuah elemenelemen ke dalam stack. Tidak bisa dilakukan lagi
jika stack sudah penuh.
Procedure Push(elemen:TipeData);
Begin
If not Full then
Begin
Top := Top+1; { atau Inc(Top) }
Stack[Top] := elemen;
End;
End;
Pop : Mengambil elemen teratas dari stack. Stack tidak boleh kosong.
Procedure Pop(elemen:TipeData);
Begin
If not Empty then
Begin
Elemen := stack[Top];
Top := Top1; { atau Dec(Top) }
End;
End;
Push : Menambahkan sebuah elemenelemen ke dalam stack. Tidak bisa dilakukan lagi
jika stack sudah penuh.
Procedure Push(elemen:TipeData; NoStack : Byte);
Begin
If not Full then
Begin
Case NoStack of
1 : Top[1] := Top[1] + 1;
2 : Top[2] := Top[2] 1;
Stack[Top[NoStack]] := elemen;
End;
End;
Pop : Mengambil elemen teratas dari stack. Stack tidak boleh kosong.
Procedure Pop(var elemen:TipeData; NoStack:Byte);
Begin
If not Empty(NoStack) then
Begin
Elemen := stack[Top[NoStack]];
Case NoStack of
1 : Top[1] := Top[1] 1;
2 : Top[2] := Top[2] +1;
End;
End;
End;
Empty : Fungsi untuk menentukan apakah stack yang ada masih kosong atau tidak.
Function Empty : Boolean;
Begin
Empty := False;
if Top = nil then
Empty := True;
End;
Latihan soal
Buatlah sebuah program yang akan membalik susunan kata yang diinput oleh user dengan
menggunakan stack. Gunakan animasi untuk mengggambarkan huruf-huruf pada kata di push
satu persatu mulai dari huruf terdepan sampai belakang ke sebuah wadah, kemudian di pop
satu persatu sampai membentuk kata dengan susunan terbalik dari asalnya.
6 QUEUE
6.1 Pengertian Queue
Secara harfiah queue dapat diartikan sebagai antrian. Queue merupakan
kumpulan data dengan penambahan data hanya melalui satu sisi, yaitu belakang
(tail) dan penghapusan data hanya melalui sisi depan (head). Berbeda dengan stack
yang bersifat LIFO maka queue bersifat FIFO(First In First Out), yaitu data yang
pertama masuk akan keluar terlebih dahulu dan data yang terakhir masuk akan
keluar terakhir.
Operasi-operasi standar pada queue adalah:
1. membuat queue atau inisialisasi.
2. mengecek apakah queue penuh.
3. mengecek apakah queue kosong.
4. memasukkan elemen ke dalam queue atau InQueue (Insert Queue).
5. Menghapus elemen queue atau DeQueue (Delete Queue).
A. Implementasi Queue dengan Linear Array
Disebut juga queue dengan model fisik, yaitu bagian depan queue selalu
menempati posisi pertama array. Queue dengan linear array secara umum dapat
dideklarasikan sebagai berikut:
Const
MaxQueue = {jumlah};
Type
TypeQueue = byte;
Var
Queue : Array[1..MaxQueue] of TypeQueuel
Head, Tail : Byte;
2. Empty
Function empty berguna untuk mengecek apakah queue masih kosong atau
sudah berisi data. Hal ini dilakukan dengan mengecek apakah tail bernilai nol atau
tidak, jika ya maka kosong.
Function Empty : Boolean;
Begin
If Tail = 0 then
Empty := true
Else
Empty := False; End;
3. Full
berguna untuk mengecek apakah Queue sudah penuh atau masih bisa menampung data
dengan cara mengecek apakah nilai tail sudah sama dengan jumlah maksimal queue,
jika ya maka penuh.
Function Full : Boolean;
Begin
If Tail = MaxQueue then
Full := true
Else
Full := False
End;
4. EnQueue
Procedure EnQueue berguna untuk memasukkan 1 elemen ke dalam queue.
Procedure Enqueue(Elemen : Byte);
Begin
If Empty then
Begin
Head := 1;
Tail := 1;
Queue[head] := Elemen;
End
Else
If Not Full then
Begin
Inc(Tail);
Queue[tail] := Elemen;
End;
End;
5. DeQueue
Procedure DeQueue berguna untuk mengambil 1 elemen dari Queue, operasi ini
sering disebut juga SERVE. Hal ini dilakukan dengan cara memindahkan semua
elemen satu langkah ke posisi di depannya, sehingga otomatis elemen yang paling
depan akan tertimpa dengan elemen yang terletak dibelakangnya.
Procedure DeQueue;
Var
i : Byte;
Begin
If Not Empty then
Begin
For i := Head to Tail1 do
Queue[I] := Queue[I+1];
Dec(Tail);
End;
End;
6. Clear
Procedure clear berguna untuk menghapus semua elemen dalam queue dengan
jalan mengeluarkan semua elemen tersebut satu per satu sampai kosong dengan
memanfaatkan procedure DeQueue.
Procedure Clear;
Begin
While Not Empty then
DeQueue;
End;
2. Empty
Function Empty : Boolean;
Begin
If (Tail Mod Max_Queue ) + 1
Empty := true
Else
Empty := False;
End;
= Head then
3. Full
Function Full : Boolean;
Var
X : 1 .. Max_queue;
Begin
X := (Tail Mod Max_queue)+1;
If (x Mod Max_queue) + 1 = head then
Full := True;
Else
Full := False;
End;
4. EnQueue
Procedure EnQueue (Elemen : TypeElemen);
Begin
If Not Full Then
Begin
Tail := (Tail Mod Max_queue) + 1 ;
Queue[Tail] := Elemen;
End;
End;
5. DeQueue
Procedure Dequeue;
Begin
If Not Empty then
Head := (Head Mod Max_queue) + 1;
End;
{Jumlah Antrian}
N := 0;
End;
2. Empty
Function Empty berguna untuk mengecek apakah QUEUE masih kosong atau sudah
berisi data. Hal ini dilakukan dengan mengecek apakah head masih menunjuk pada nil
atau tidak, jika ya maka kosong.
Function Empty : Boolean;
Begin
If Q.Head = Nil Then
Empty := True
Else
Empty := False;
End;
3. Full
Function Full berguna untuk mengecek apakah QUEUE sudah penuh atau masih bisa
menampung data dengan cara mengecek apakah N (JumlahQueue) sudah sama
dengan Max_Queue atau belum, jika ya maka penuh.
Function Full : Boolean;
Begin
If N = Max_Queue Then
Full := True
Else
Full := False;
End;
4. EnQueue
Procedure EnQueue berguna untuk memasukkan 1 elemen ke dalam QUEUE. Head dan
Tail mulamula menunjuk ke NIL.
Procedure EnQueue (Elemen : TipeData);
Var
Now : Point;
Begin
If Not Full Then
Begin
New(Now);
Now^.Isi := elemen;
Now^.Next := NIL;
If Empty Then
Begin
Q.Head := Now;
Q.Tail := Now;
N := 1;
End
else
Begin
Q.Tail^.next := Now;
Q.Tail := Now;
End;
End;
End;
5. DeQueue
Procedure DeQueue berguna untuk mengambil 1 elemen dari QUEUE. Jal ini
dilakukan dengan cara menghapus satu simpul yang terletak paling depan (head).
Procedure DeQueue;
Var
Now : Point;
Begin
If Not Empty Then
Begin
Now := Q.Head;
Q.Head := Q.Head^.Next;
Dispose(now);
Dec (N);
End;
End;
7 LIST
A. Single Linked List
Gambar berikut menunjukan sebuah data terletak pada sebuah lokasi
memory. Tempat yang disediakan pada suatu area memory tertentu untuk menyimpan
data dikenal dengan sebutan
pointer
(penunjuk) yang menunjuk ke simpul berikutnya sehingga terbentuk suatu untaian dan
dengan demikian hanya diperlukan sebuah variable pointer. Susunan berupa untaian ini
disebut dengan Single Linked List. Nil tidak memiliki nilai apapun. Setiap linked list
pada akan menunjuk ke Nil.
Dalam pembuatan Single Linked List dapat menggunakan 2 Metoda :
LIFO ( Last In First Out ), aplikasinya : Stack (Tumpukan)
FIFO ( First In First Out ), aplikasinya : Queue (Antrian)
* LIFO ( Last In First Out )
LIFO adalah suatu metoda pembuatan Linked List dimana data yang
masuk paling akhir adalah data yang keluar paling awal. Hal ini dapat dianalogikan
dengan menumpukan barang pada kehidupan seharihari. Pembuatan simpul pada
suatu linked list disebut dengan istilah INSERT. Jika linked list dibuat dengan
Metoda LIFO maka penambahan/insert simpul dilakukan di BELAKANG.
1. Procedure Insert
Istilah INSERT berarti menambahkan sebuah simpul baru ke dalam suatu linked
list. Berikut adalah deklarasi tipe data dan variabel yang dapat digunakan sebagai
deklarasi awal dan penggalan procedure insert.
Type
Point = ^RecPoint;
RecPoint = Record
Isi : TipeData;
Next : Point;
End;
Var
Head, Tail, Now : Point;
Procedure INSERT(elemen:TipeData);
Var
Now : Point;
Begin
New(Now);
Now^.Isi := Elemen;
If Head = Nil Then
Now^.Next := Nil;
Else
Now^.Next := Head;
Head := Now;
End;
2. Empty
Function untuk menentukan apakah linked list kosong atau tidak.
Function Empty : Boolean;
Begin
If head = nil then
Empty := true
else
Empty := false;
End;
3. Find First
Mencari elemen pertama dari linked list
Procedure Find_First;
Begin
Now := Head;
End;
4. Find Next
Mencari elemen sesudah elemen yang ditunjuk Now
Procedure Find_Next;
Begin
If Now^.Next <> Nil then
Now := Now^.next;
End;
5. Retrieve
Mengambil
ditampung pada
elemen
yang
ditunjuk
oleh
now.
Elemen
tersebut
lalu
variabel r.
Procedure Retrieve(var r : TipeData);
Begin
R := Now^.Isi;
End;
6. Update
Mengubah elemen yang ditunjuk oleh now dengan isi dari suatu variabel
(dalam
contoh ini digunakan variabel u).
Procedure UpDate(u :TipeData);
Begin
Now^.Isi := U;
End;
7. Delete Now
Menghapus elemen yang ditunjuk oleh now. Jika yang dihapus adalah elemen
yang pertama dari linked list (head), maka head akan berpindah ke elemen berikutnya.
Procedure DeleteNow;
Var
x : point;
Begin
If Now <> Head then
Begin
X := head;
While x^.next <> now do
X := x^.next;
X^.next := now^.next;
End
Else head := head^.next;
Dispose(now);
Now := head;
End;
8. Delete Head
Menghapus elemen yang ditunjuk oleh head. Head akan berpindah ke
elemen sesudahnya.
Procedure DeleteHead;
Begin
If head <> nil then
Begin
Now := Head;
Head := Head^.Next;
Dispose(Now);
Now := Head;
End;
End;
9. Clear
Untuk menghapus linked list yang sudah ada. Wajib dilakukan bila ingin
mengakhiri program yang menggunakan linked list. Jika tidak ada datadata yang
dialokasikan ke memory pada program sebelumnya akan tetap tertinggal di dalam
memory.
Procedure Clear;
Begin
While head <> nil do
Begin
Now := head;
Head := head^.next;
Dispose(now);
End;
End;
2. Insert Before
Sesuai dengan namanya, procedure Insert Before berguna untuk menambah
simpul di depan (sebelah kiri). Procedure ini tidak berbeda jauh dengan procedure
Insert After.
Procedure InsertBefore(e:Elemen_Type);
Var Now : Point;
Begin
New(now);
Now^.Isi := e;
If Head=Nil then
Begin
Head := Now;
Now^.Next := Nil;
Now^.Prev := Nil;
End
Else
Begin
Head^.prev := now;
Now^.next := head;
Head := Now;
Head^.Prev := Nil;
End;
End;
3. Delete After
Procedure Delete After berguna untuk menghapus simpul dari belakang.
Procedure ini merupakan kebalikan dari procedure Insert After yang menambahkan
simpul dibelakang.
Procedure DeleteAfter;
Var
Now : Point;
Begin
Now := Tail;
If Now <> Head then
Begin
Tail := Now^.Prev;
Tail^.Next := Nil;
End
Else
Begin
Tail := Nil;
Head := Nil;
End;
If Now <> Nil then
Dispose(now);
End;
4 Delete Before
Procedure Delete Before merupakan kebalikan dari procedure Delete After
yang akan menghapus simpul dari depan (sebelah kiri).
Procedure DeleteBefore;
Var
Now : Point;
Begin
Now := Head;
If Now <> Head then
Begin
Head := Now^.Next;
Head^.Prev := Nil;
End
Else
Begin
Tail := Nil;
Head := Nil;
End;
If Now <> Nil then
Dispose(now);
End;
5. Delete at Position
Procedure at Position, sesuai dengan namanya, berguna untuk menghapus
simpul pada posisi yang diinginkan. Untuk melakukannya diperlukan bantuan 2
variabel pointer yang pada modul ini diberi nama Bantu1 dan Bantu2. Nama
tersebut boleh diganti.
Procedure DeleteAtPos;
Var
Bantu1, Bantu2 : Point;
Begin
Bantu1 := Now^.Prev;
Bantu2 := Now^.Next;
If Bantu1 <> Nil then
Bantu1^.Next := Bantu2;
Else
Head := Bantu2;
If Bantu2 <> Nil Then
Bantu2^.Prev := Bantu1;
Else
Tail := Bantu1;
If Now <> Nil Then
Dispose(Now);
End;
lingkaran.
Operasi-operasi pada Circullar Double Linked List
1. Insert After
Procedure Insert After berguna untuk menambah simpul di belakang
(sebelah kanan) pada sebuah double linked list.
Procedure InsertAfter(e:Elemen_Type);
Var
Now : Point;
Begin
New(now);
If Head=Nil then
Begin
Head := Now;
else
Now^.Prev := Tail;
Tail^.Next := Now;
End;
Now^.Isi := e;
Tail := Now;
Tail^.next := Head;
Head^.Prev := Tail;
End;
2. Insert Before
Procedure Insert Before berguna untuk menambahkan simpul di depan
(sebelah kiri). Procedure ini tidak berbeda jauh dengan procedure Insert After
yang telah dijelaskan sebelumnya.
Procedure InsertBefore(e:Elemen_Type);
Begin
If Head=Nil then
Begin
Head := Now;
Tail := Now;
End else
Begin
Now^.Prev :=Head;
Head^.Next := Now;
End;
Now^.Isi := e;
Now^.Next := Tail;
Tail^.Prev := Now;
Tail := Now;
End;
3. Delete After
Procedure Delete After berguna untuk menghapus simpul dari belakang.
Procedure ini merupakan kebalikan dari Procedure Insert After yang menambah
simpul di belakang.
Procedure DeleteAfter;
Var
Now : Point;
Begin
Now := Tail;
If Head=Nil then
Begin
Tail := Nil;
Head := Nil;
End else
Begin
Tail := Now^.Prev;
Tail^.Next := Head;
Head^.Prev := Tail;
End;
If Now <> nil then
Dispose(Now);
End;
D.Latihan Soal
Suatu Linked-list digunakan untuk menyimpan informasi karakter. Buatlah procedure
yang mengurutkan linked-list tersebut sehingga urutannya menjadi vokal terlebih
dahulu kemudian diikuti oleh konsonan. Jika awal dri linked list tersebut berisi
(a,b,c,d,e,f,m,n,o,p) akan diurutkan menjadi ( a, e, o, b, c, d, e, f, m, n, p).
8 TREE
A. TREE
Sebelumnya kita sudah mengenal struktur data list, yang berupa obyek-obyek
yang saling terkait. Dalam list, satu obyek hanya terkait dengan satu obyek berikutnya
melalui sebuah pointer. List dapat dikembangkan menjadi struktur data yang lebih
kompleks, misalnya dengan menambah jumlah pointer dalam obyek. Misal dengan
penambahan satu pointer lagi. Artinya bahwa jika masing-masing obyek memiliki
dua pointer, ada dua obyek lain yang ditunjuknya. Struktur yang demikian dikenal
sebagai binary tree atau dikenal juga sebagai Tree Node.
Istilah-istilah umum dalam Binary Tree :
Ancestor : seluruh node yang terletak sebelum node tertentu dan terletak pada jalur
yang sama
Descendant : seluruh node yang terletak sesudah node tertentu dan terletak pada
jalur yang sama
Parent
Child
Subtree
: bagian dari tree yang berupa suatu node beserta descendantnya dan
Size
Height
Root
Leaf
Degree
B. Jenis-jenis Tree
1. Binary Tree
Binary Tree adalah tree dengan syarat bah hwa tiap node hanya boleh
mem iliki maksimal dua subtree dan kedua subtree tersebut haru terpisah. Sesuai
dengan definisi terseebut, maka tiap node dalam binary tree hanya boleh memiliki
yaitu ROOT, LEFT CHILD, atau RIGHT CHILD. Khusus insert sebagai
ROOT, TREE harus dalam keadaan kosong.
Find
: Mencari root, parent, left child, atau right child dari suatu node.
Characteristic: Mengetahui karakteristik dari suatu tree, yakni : size, height, serta
average dari lengthnya. Tree tidak boleh kosong.
Traverse : Mengunjungi seluruh nodenode pada tree, masingmasing
sekali. Hasilnya adalah urutan informasi secara linier yang tersimpan dalam tree.
Ada tiga cara traverse : Pre Order, In Order, dan Post Order.
Langkah melakukan traverse :
1. PreOrder : cetak isi node yang dikunjungi, kunjungi Left Child, kunjungi
Right Child.
2. InOrder : Kunjungi Left Child, cetak isi node yang dikunjungi, kunjungi
Right Child.
3. PostOrder : Kunjungi Left Child, kunjungi Right Child, cetak isi node yang
dikunjungi.
9 GRAP
A. GRAPH
Graph adalah kumpulan dari simpul dan busur yang secara matematis
dinyatakan sebagai :
G = (V, E)
Dimana
G = Graph
V = Simpul atau Vertex, atau Node, atau Titik
E = Busur atau Edge, atau arc
Graf merupakan suatu cabang ilmu yang memiliki banyak terapan. Banyak
sekali struktur yang bisa direpresentasikan dengan graf, dan banyak masalah yang bisa
diselesaikan dengan bantuan graf. Seringkali graf digunakan untuk merepresentasikan
suaru jaringan. Misalkan jaringan jalan raya dimodelkan graf dengan kota sebagai
simpul (vertex/node) dan jalan yang menghubungkan setiap kotanya sebagai sisi (edge)
yang bobotnya (weight) adalah panjang dari jalan tersebut.
Ada beberapa cara untuk menyimpan graph di dalam sitem komputer. Struktur data
bergantung pada struktur graph dan algoritma yang digunakan untuk memmanipulasi
graph. Secara teori salah satu dari keduanya dapat dibedakan antara struktur list dan
matriks, tetapi dalam penggunaannya struktur terbaik yang sering digunakan adalah
kombinasi keduanya.
Graph tak berarah (undirected graph atau non-directed graph) : Urutan simpul
dalam sebuah busur tidak dipentingkan. Misal busur e1 dapat disebut busur AB atau
BA
Graph berarah (directed graph) : Urutan simpul mempunyai arti. Misal busur AB
adalah e1 sedangkan busur BA adalah e8.
Graph Berbobot (Weighted Graph) : Jika setiap busur mempunyai nilai yang
menyatakan hubungan antara 2 buah simpul, maka busur tersebut dinyatakan
memiliki bobot. Bobot sebuah busur dapat menyatakan panjang sebuah jalan dari 2
buah titik, jumlah rata-rata kendaraan perhari yang melalui sebuah jalan, dll.
DAFTAR PUSTAKA
Bryon, Goffried. Programming with PASCAL. 1986. New York : Schaum Series
Inggriani Liem. Dasar Pemrograman (Bagian Pemrograman Prosedural). April
2007. Bandung : STEI - ITB
Munir, Rinaldi. Algoritma dan Pemrograman 2. 2001. Bandung : Informatika
Pranata, Antony. Algoritma dan Pemrograman. 2005. Yogyakarta : Graha Ilmu
Santosa, Insap. Dasar-dasar Pemrograman Pascal Teori dan Program Terapan.
Yogyakarta : Andi Offset
Wahid, Fathul. Dasar-dasar Algoritma dan Pemrograman. 2004. Yogyakarta : Andi
Offset