Anda di halaman 1dari 43

BAB I

1. Pendahuluan.

Struktur data adalah cara menyimpan atau merepresentasikan data di


dalam 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 symbol. Secara garis besar type data dapat dikategorikan menjadi :
1. Type data sederhana
a. Type data sederhana tunggal, misalnya Integer, real, boolean dan
karakter
b. Type data sederhana majemuk, misalnya String
2. Struktur Data, meliputi
a. Struktur data sederhana, misalnya array dan record
b. Struktur data majemuk, yang terdiri dari Linier : Stack, Queue, serta
List dan Multilist Non Linier : Pohon Biner dan Graph
Pemakaian struktur data yang tepat di dalam proses pemrograman akan
menghasilkan algoritma yang lebih jelas dan tepat, sehingga menjadikan program
secara keseluruhan lebih efisien dan sederhana.Struktur data yang ″standar″ yang
biasanyadigunakan dibidang informatika adalah :
 List linier (Linked List) dan variasinya
 Multilist
 Stack (Tumpukan)
 Queue (Antrian)
 Tree ( Pohon )
 Graph ( Graf )

2. ARRAY dan SET


A. ARRAY (LARIK)
Array (Larik) adalah tipe terstruktur yang mempunyai komponen dalam
jumlah yang tetap dan setiap komponen mempunyai tipe data yang sama. Posisi
masing-masing dalam larik dinyatakan sebagai index.
Bentuk umum dari deklarasi tipe larik adalah :

var pengenal = array[tipe_index]of tipe;

Keterangan : pengenal : nama variabel.


tipe_index : jumlah larik.
tipe : tipe data.
Parameter tipe_index menentukan banyaknya komponen larik
tersebut.Parameter ini boleh berupa sembarang tipe ordinal kecuali longint dan
subjangkauan longint.
Contoh :
Var larik1 = array[1..5] of char;
larik2 = array[1..5,1..5] of string;
larik3 = array[1..5,1..5,1..5] of integer;

Dari contoh diatas ditampilkan beberapa cara pendeklarasian larik (array).


Variabel larik1 adalah larik dengan satu dimensi, larik2 adalah larik dengan
dua dimensi atau dimensi banyak, demikian juga dengan larik3.

1
Latihan-latihan :
Uses crt:
Var
nilai : array[1..3] of integer;
Begin
nil[1] := 105;
nil[2] := 202;
nil[3] := 727;
writeln (nil[1]);
writeln (nil[2]);
writeln (nil[3]);
End.

Var
nama : array[1..3] of string;

Begin
nama[1] := ‘BUDI’;
nama[2] := ‘IWAN’;
nama[3] := ‘TUTY’;
writeln (‘Nama 1 : ’,nama[1]);
writeln (‘Nama 2 : ’,nama[2]);
writeln (‘Nama 3 : ’,nama[3]);
End.

Const awal = 1;
Akhir = 5;
Var
nim : array[awal..akhir] of string;
nama : array[awal..akhir] of string;
n : integer;
Begin
Writeln (‘Isi NIM dan Nama dengan Array’);
For n := 1 to 5 do
Begin
Write (‘NIM - ’,n,’ : ‘); readln(nim[n]);
Write (‘Nama - ’,n,’ : ‘); readln(nama[n]);
Writeln;
End;
Writeln;
Writeln (‘Hasil dari inputan adalah :’);
For n := 1 to 5 do
Begin
Writeln (‘NIM - ’,n,’ : ‘,nim[n]);
Writeln (‘Nama - ’,n,’ : ‘,nama[n]);
Writeln;
End;
End.

2
VarDim1
Var nilai : array[1..5]
: array[1..3] of integer;
of integer;
Jm , rata : real;
Dim2 : array[1..3,1..3] of integer;
Begin
Dim3 : array[1..3,1..3,1..3] of integer;
Writeln
i,j,k :(‘Menghitung
integer; rata-rata 5 buah nilai’);
Write (‘nilai1 = ‘); readln(nilai[1]);
Begin
Write
{input (‘nilai2
elemen = ‘); readln(nilai[2]);
array}
For i := 1 to 3 =
Write (‘nilai3 do‘); readln(nilai[3]);
Write (‘nilai4
Dim1[i] := 2 *=i‘);
– 1;readln(nilai[4]);
Write (‘nilai5 = ‘); readln(nilai[5]);
Jm i
For :=:=nilai[1]+nilai[2]+nilai[3]+nilai[4]+nilai[5];
1 to 3 do
Rata
Begin:= jm / 5;
Writeln;
For j := 1 to 3 do
Writeln (‘Jumlah
Dim2[i,j] = i
:= 4 * ‘,jm:9:2);
– j;
Writeln (‘Rata-rata = ‘,rata:9:2);
End;
End.
For i := 1 to 3 do
Begin
For j := 1 to 3 do
Begin
For k := 1 to 3 do
Dim3[i,j,k] := j * k – i;
End;
End;
{cetak elemen array}
for i := 1 to 3 do
Begin
Writeln;
Writeln (‘1 dimensi[‘,i,’] = ’,dim1[i]);
For j := 1 to 3 do
Begin
Writeln (‘2 dimensi[‘,i,’,’,j,’] = ’,dim2[I,j]);
For k := 1 to 3 do
Writeln (‘3
dimensi[‘,i,’,’,j,’,’,k,’]=’,dim2[i,j,k]);
End;
End;
End.

3
B. SET

Set adalah kumpulan objek yang mempunyai tipe data sama dalam urutan
yang tidak diperhatikan. Setiap elemen dalam set disebut dengan anggota atau
elemen set. Tipe data dari anggota set dapat berupa nilai skalar atau himpunan
bagian dari tipe data lain yang ada dalam pascal.
Bentuk umum dari deklarasi setadalah :
Typepengenal = set of tipe;
Keterangan : pengenal : nama variabel atau nama type.
tipe : type data buatan sendiri maupun bawaan pascal.

Pendeklarasian set tidak hanya dapat dilakukan pada Type saja tapi
terkadang juga di deklarasikan pada bagian var (deklarasi variabel).

Contoh :
Type hari = (‘senin’,’selasa’,’rabu’,’kamis’,’jumat’,
’sabtu’,’minggu’);
HariDlmMgg = set of hari;
Bilangan = set of 1..10;
Karakter = set of char;
Setiap tipe yang dideklarasikan di bagian type, untuk dapat digunakan di
dalam program harus di deklarasikan di bagian variabel (var) yang mengarah ke
nama tipe yang telah dibentuk.
Contoh :
Var namahari : HariDlmMgg;
Angka : Bilangan;
Huruf : Karakter;

Type
Tvokal = set of char;
Var
Vokal : Tvokal;
Kar : char;
Begin
Vokal := [‘A’,’I’,’U’,’E’,’O’];
Write (‘Ketik sebuah karakter dan tekan Enter: ‘);
Readln (Kar);
If Kar in Vokal then
Writeln (‘Huruf Vokal’)
Else
Writeln (‘Huruf Konsonan’);
End.

4
type hari=(senin,selasa,rabu,kamis,jumat,sabtu,minggu);
namahari = set of hari;
var harian,harikerja,harilibur : namahari;
nhari : array[hari] of string;
i : hari;

Begin
nhari[senin] := 'senin';
nhari[selasa] := 'selasa';
nhari[rabu] := 'rabu';
nhari[kamis] := 'kamis';
nhari[jumat] := 'jumat';
nhari[sabtu] := 'sabtu';
nhari[minggu] := 'minggu';
harian :=[senin,selasa,rabu,kamis,jumat,sabtu,minggu];
harikerja := [senin,selasa,rabu,kamis];
harilibur := harian - harikerja;
writeln ('NAMA HARI KERJA');
for i := senin to minggu do
begin
if i in harikerja then
write (nhari[i],' - ');
end;
writeln; writeln;
writeln ('NAMA HARI LIBUR');
for i := senin to minggu do
begin
if i in harilibur then
write (nhari[i],' - ' );
end;
End.

Soal :
1. Buatlah program menggunakan array untuk menginputkan data mahasiswa
seperti: Nama,NIM, dan nilai 3 matakuliah serta rata-rata dari nilai
matakuliah yang dimasukkan.
Contoh inputan :
Jumlah Mahasiswa : XX
Nama : XXXXXXXXXX
NIM : XXXXXXXX
Nilai MataKuliah :
Pengenalan TI : 99
Basis Data : 99
P. Internet : 99

5
Contoh keluaran:
NIM Nama Pengenalan TI Basis Data P. Internet Rata-rata
XXXXXXXX XXXXXXX 99 99 99 99,99
XXXXXXXX XXXXXXX 99 99 99 99,99

2. Buat Program menggunakan set untuk menghilangkan setiap huruf vokal


pada suatu kalimat yang di inputkan.
Contoh :
Masukkan Kalimat :Universitas Muhammadiyah Purwokerto
Hasil Proses :nvrsts Mhmmdyh Prwkrt

BAB II
RECORD dan ITERASI

A. RECORD

Record adalah kumpulan elemen-elemen dalam pascal dimana setiap


elemen dapat memiliki tipe data yang saling berbeda. Cara mengakses record
mirip dengan cara mengakses array, perbedaannya adalah jika pada array untuk
mengakses dengan cara menyebut nama array disertai dengan nomor indeks, maka
pada record adalah dengan menyebut nama record disertai dengan nama field
(elemen) yang akan diakses.
Bentuk umum pendeklarasian record :

Type namarec = record


Var1 : tipe;
Var2 : tipe;
Varn : tipe;
End;
Var nama_var : namarec;

Keterangan : namarec : nama record.


var1,var2,varn : nama variable pada type
nama_var : nama variable untuk tipe namarec.
tipe : tipe data.

Bentuk umum pemanggilan record :

6
Begin
nama_var.var1 := . . . .
nama_var.var2 := . . . . Cara pertama
nama_var.varn := . . . .

With nama_var do
Begin
var1 := . . . . Cara kedua
var2 := . . . .
varn := . . . .
End;
End.

Latihan :

Uses wincrt;
Type data = record
No : integer;
Nama : string;
End;
Var datamhs : data;
Begin
Datamhs.no := 1;
Datamhs.nama := ‘Budi’;

Writeln (‘Nomor : ‘,datamhs.no);


Writeln (‘Nama : ‘,datamhs.nama);
End.

Type data = record


No : integer;
Nama : string;
End;
Var datamhs : data;
Begin
With datamhs do
Begin
No := 123;
Nama := ‘Budi Lagi’;

Writeln (‘Nomor : ‘,no);


Writeln (‘Nama : ‘,nama);
End;
End.

7
type matkul = record
id : integer;
namamk : string;
end;
data = record
nim : string;
nama : string;
dtmk : matkul;
end;
var datamhs : array[1..20] of data;
n,i : integer;
Jwb : char;
begin
n := 0;
Jwb := 'Y';
writeln ('Inputkan data Mahasiswa');
writeln;
while Jwb = 'Y' do
begin
n := n + 1;
with datamhs[n] do
begin
writeln ('Data ke - ',n,' :');
write ('NIM : '); readln(nim);
write ('Nama : '); readln(nama);
write ('kode MK : '); readln(dtmk.id);
write ('Nama MK : '); readln(dtmk.namamk);
write ('Tambah lagi [Y/N] ? : '); readln (Jwb);
writeln;
end;
end;
clrscr;
writeln ('NIM','Nama Mhs':10,'Kode MK':10,'Nama MK':10);
for i := 1 to n do
begin
with datamhs[i] do
writeln (nim,nama:10,dtmk.id:10,dtmk.namamk:10);
end;
end.

8
B. ITERASI

Iterasi merupakan proses pengulangan suatu statemen atau blok statemen


sebanyak jumlah tertentu yang diberikan. Dalam pascal proses iterasi dapat
dilakukan dengan memanfaatkan perintah for … do, repeat … until, while … do.
Bentuk umum penulisan :

For namavar := a to z do
Repeat
....
until namavar>z;
while namavar<= z do

Keterangan : namavar : nama variable.


a : nilai awal perulangan.
z : nilai akhir tujuan perulangan.

Latihan :

var n : integer;
k : string;
begin
k := '';
for n := 1 to 10 do
begin
k := k + '*';
writeln (k);
end;
end.

var n,i : integer;


k : string;
begin
k := '*';
i := 5;
while i >= 1 do
begin
for n := 1 to i do
write (k);
i := i - 1;
writeln;
end;
readln;
end.

9
var n : word;

function faktorial(n : word) : word;


var i : integer;
xfaktorial : word;
begin
xfaktorial := n;
if n = 0 then
faktorial := 1
else
begin
for i := n - 1 downto 1 do
xfaktorial := xfaktorial * i;
faktorial := xfaktorial;
end;
end;

begin
clrscr;
write ('Bil. int. positif untuk dicari
faktorialnya : ');
readln (n);
writeln;
writeln ('faktorial dari ',n,' adalah
',faktorial(n));
end.

Soal :

1. Buatlah program untuk menginput data mahasiswa dengan menggunakan


record. Data yang diinput adalah Nim,Nama,Nilai Angka. Untuk ketentuan
Nilai Huruf berdasarkan Nilai Angka : A ( > 80 ), B ( 79 – 50 ), C ( 49 – 20 ),
D ( < 20 ).
Contoh :
NIM : 123456789
Nama : Budi Susanti
Nilai : 70
TAMBAH LAGI [Y/N] ? N

Hasil Output
N NIM Nama Nilai Angka Nilai Huruf

o
1 789456123 Tety Hendarto 25 C
2 456123789 Joko Bernardo 85 A
3 123456789 Budi Susanti 70 B

10
2. Buatlah program untuk mencari nilai dari x pangkat n ( xn) dengan
menggunakan teknik iterasi.
Contoh :
Nilai x : 2
Nilai n : 5
Hasil x pangkat n adalah : 32

BAB III
REKURSI

Rekursi adalah sebuah proses yang bisa memanggil diri sendiri. Dalam
rekursi sebenarnya terkandung pengertian prosedur atau fungsi.Perbedaannya
adalah bahwa rekursi bisa memanggil dirinya sendiri, tetapi prosedur atau fungsi
harus dipanggil lewat pemanggil prosedur atau fungsi.

Dalam prosedur atau fungsi, pemanggilan ke dirinya sendiri bisa berarti


proses berulang yang tidak bisa diketahui kapan akan berakhir. Dalam pemakaian
sehari-hari, rekursi merupakan teknik pemrograman yang berdayaguna untuk
digunakan pada pekerjaan pemrograman dengan mengekspresikannya kedalam
suku-suku dari program lain dengan menambahkan langkah-langkah sejenis.

Contoh bentuk Rekursi :


Function namaFunc (n : integer) : integer;
Begin Nama function
If n = 0 then
namaFunc := 1
Else
namaFunc := n * namaFunc(N – 1);
End;
Pemanggilan nama function di dalam
tubuh sendiri.

Karena function memanggil diri sendiri di dalam tubuh function


mengakibatkan proses akan terus berulang sampai pernyataan yang ada didalam
blok program itu sendiri terpenuhi.

11
var input : integer;
function jumgenap (n : integer) : integer;
begin
if n < 2 then
jumgenap := 0 //pemberian nilai nol untuk n < 2
else if (n mod 2) = 0 then
jumgenap := n + jumgenap(n-1) //penjumlahan bil. genap
else
jumgenap := 0 + jumgenap(n-1); //penjumlahan bil. ganjil
end;
begin
clrscr;
writeln ('Program menjumlah bilangan genap');
write ('Batas nilai yang ingin dihitung : ');
readln (input);
writeln;
writeln ('Jumlah Bilangan Genap antara 0-',input,
' = ',jumgenap(input));
readln;
end.

var kalimat : string;


procedure karakter(kal : string);
var n : integer;
begin
n := length(kal);
writeln (kal[n]);
if n >= 1 then
begin
karakter(copy(kal,1,n-1));
end;
end;
begin
clrscr;
writeln ('Pembalik Kalimat Secara Vertikal');
writeln ('Masukkan Kalimat : ');
readln (kalimat);
karakter(kalimat);
readln;
end.

12
function funkalimat (n : integer) : string;
var kal : string;
begin
kal := 'test ';
if n = 1 then Blok
funkalimat := kal program
else function
funkalimat := kal + funkalimat(n - 1);
end;
begin
writeln (funkalimat(10));
readln; Program
end. Utama

Soal :

1. Buatlah program pengurut karakter secara vertikal dengan menggunakan


rekursi.
Contoh :
Masukkan Kalimat : Ini Budi
Hasil :
I
n
i

B
u
d
i

2. Buatlah program perkalian faktorial dengan menggunakan rekursi.


Rumus : 0! = 1
n! = n x (n – 1)! //Untuk n > 0

Contoh Program :
Inputkan batas angka perkalian : 5
Hasil perkalian faktorial = 120
Karena faktorial 5 :
5! = 5 * 5 * 5 * 5 * 5 = 120

3. Buatlah program penjumlah bilangan prima dimana batas angka yang


ingin dijumlahkan diinputkan dari keyboard, dan menampilkan setiap
angka bilangan prima yang akan dijumlah.
Contoh :
Inputkan batas bilangan prima : 20
Hasil :

13
2 3 7 11 13 17 19
Jumlah : 72
BAB IV
STACK (TUMPUKAN)
Secara sederhana, tumpukan bisa diartikan sebagai suatu kumpulan data
yang seolah-olah ada data yang diletakkan diatas data yang lain. Satu hal yang
perlu dingat adalah bahwa kita bisa menambah data, dan mengambil (menghapus)
data lewat ujung yang sama, yang disebut sebagai ujung atas tumpukan (top of
stack).
Untuk menjelaskan pengertian diatas kita ambil contoh sebagai berikut.
Misalnya kita mempunyai dua buah kotak yang kita tumpukkan, sehingga kotak
kita letakkan diatas kotak yang lain. Jika kemudian tumpukan dua buah kotak itu
kita tambah dengan kotak ketiga, kempat, kelima dan seterusnya, maka akan kita
peroleh sebuah tumpukan kotak, yang terdiri dari N kotak.

F atas
E
D
C
B
A

Secara sederhana, sebuah tumpukan (stack) dapat digambarkan seperti


diatas. Dari gambar ini kita bisa mengatakan bahwa kotak B ada diatas kotak A
dan ada dibawah kotak C. Dari gambar juga ditunjukkan bahwa dalam tumpukkan
kita hanya bisa menambah atau mengambil sebuah kotak lewat satu ujung, yaitu
ujung bagian atas. Dapat dilihat pula bahwa tumpukan merupakan kumpulan data
yang sifatnya dinamis, artinya kita bisa menambah dan mengambil data darinya.

Penggambaran tumpukan juga tidak harus seperti diatas. Kita bisa


menggambarkan tumpukan dengan cara lain.

A menambah
B
C
D
A B C
E
F D E F

menghapus
atas

Dari gambar diatas menunjukkan pengertian bahwa kotak yang terakhir


dimasukkan bukan berarti memiliki posisi paling atas, tapi lebih ditekankan pada
kotak yang paling dekat pada pintu masuk.

menambah menghapus 14
Dengan memperhatikan ilustrasi-ilustrasi yang disebutkan maka kita bisa
melihat bahwa tumpukan merupakan suatu senarai (list) yang mempunyai
pengertian “masuk terakhir keluar pertama” (Last In First Out - LIFO).

Operasi Pada Tumpukan


Ada dua operasi dasar yang bisa kita lakukan pada sebuah tumpukan, yaitu
operasi menambahkan data, atau mempush data, dan operasi menghapus data atau
mempop data. Karena ke dalam tumpukan kita bisa mempush data, maka
tumpukan juga sering disebut dengan pushdown list,

Operasi Push
Sekarang kita akan menyusun sebuah prosedur untuk operasi push.
Dengan menyajikan tumpukan seperti diatas, maka operasi push dengan mudah
kita implementasikan sebagai berikut :
Procedure PUSH (var T : Tumpukan; X : integer);
Begin
T.Atas := T.Atas + 1;
T.Isi[T.Atas] ;= x;
End;

Prosedur diatas akan menyiapkan tempat untuk x yang akan dipush ke


dalam tumpukan, yaitu dengan menambah nilai medanT.Atas dengan 1 dan
kemudian menyisipkan x ke dalam larik T.Isi,
Prosedur diatas belum cukup sempurna untuk melakukan operasi push,
karena bila data yang dimasukkan (T.Atas) sama dengan Batas maximum
(MaxElemen) dan kita akan mempush lagi maka akan terjadi overflow (melebihi
batas maximum). Dengan demikian perlu ada penambahan untuk mengatasi
overflow tersebut, agar presedur selalu mengecek keadaan lokasi (T.Isi)
sebelum suatu data dipush, apakah MaxElemen sudah tercapai atau belum, jika
belum tercapai maka operasi push akan dilakukan, tetapi bila sudah mencapai
MaxElemen operasi push akan ditolak.

Bentuk perubahan prosedurnya adalah :


Prosedure PUSH (var T : Tumpukan; X : integer);
Begin
If T.Atas = MaxElemen then
Writeln (‘TUMPUKAN SUDAH PENUH’)
Else
Begin
T.Atas := T.Atas + 1;
T.Isi[T.Atas] := X;
End;
End;

Operasi Pop
Operasi Pop adalah operasi untuk menghapus elemen yang terletak pada
posisi paling atas dari sebuah tumpukan. Sama halnya dengan operasi push, maka
dengan deklarasi tumpukan seperti diatas, prosedur untuk operasi pop bisa dengan
mudah kita implementasikan sebagai berikut :
Procedure POP (var T : tumpukan);

15
Begin
T.Atas := T.Atas – 1;
End;

Prosedur diatas juga masih sangat sempurna, dan belum dapat digunakan
untuk operasi pop, namun sudah mencakup pengertian dari pop. Hal yang terjadi
bila kita menggunakan prosedur diatas adalah bila data dalam larik sudah kosong,
karena adalah hal yang tidak mungkin melakukan operasi pop bila data sudah
kosong. Maka perlu ada tambahan pada procedure untuk mengecek keberadaan
data dalam antrian, jika data masih ada maka dapat dilakukan operasi pop, namun
bila sebaliknya akan ditolak.
Penambahan dari prosedur pop adalah :
Procedure POP (var T : Tumpukan);
program Balik_Kalimat;
Begin
uses wincrt;
If T.Atas = 0 then
const Elemen = 255; Batas
Writeln
type s255 = string[Elemen]; (‘TUMPUKAN SUDAH KOSONG’) maximum
tumpukan Else= record karakter.
isi : s255; T.Atas := T.Atas – 1;
atasEnd;
: 0..Elemen;
end;
Contoh Pemakaian Tumpukan Dalam Program
var t : tumpukan; Nama tumpukan
i : integer; lebih memahami operasi yang terjadi padapencacah
Untuk tumpukan, berikut
disajikan
kalimatcontoh
: s255; program yang menggunakan metode tumpukan untuk
Kalimat yangmembalik
dibalik
kalimat. Dalam hal ini yang dibalik adalah seluruh kalimat dan bukan perkata.
procedure awalan (var t : tumpukan); Inisialisasi
begin tumpukan
t.atas := 0;
end;

procedure push (var t : tumpukan; x : char);


begin Prosedure untuk
t.atas := t.atas + 1; memasukkan elemen
t.isi[t.atas] := x; ke dalam tumpukan
end;

function pop (var t : tumpukan) : char; Fungsi untuk


begin mengambil elemen
pop := t.isi[t.atas]; dari tumpukan
t.atas := t.atas - 1;
end;

{ Program Utama }
Begin
clrscr;
awalan(t);
writeln ('Tumpukan untuk membalik kalimat');
writeln ('*******************************'); Kalimat yang akan
writeln; dibalik
write (‘Ketik kalimat : '); readln (kalimat);
clrscr;
writeln ('Kalimat asli : ',kalimat);
writeln;
writeln ('Setelah operasi push dan pop');
Mempush kalimat ke
dalam tumpukan
for i := 1 to length(kalimat) do
push(t, kalimat[i]);
Mempop isi tumpukan
sehingga terlihat
for i := 1 to length(kalimat) do kalimat yg terbalik
write (pop(t));
readln; 16
End.
program Balik_Kalimat;
uses wincrt;
const Elemen = 255; Batas
type s255 = string[Elemen]; maximum
tumpukan = record karakter.
isi : s255;
atas : 0..Elemen;
end;
Nama tumpukan
var t : tumpukan;
i : integer; pencacah
kalimat : s255; Kalimat yang dibalik

procedure awalan (var t : tumpukan); Inisialisasi


begin tumpukan
t.atas := 0;
end;

procedure push (var t : tumpukan; x : char); Prosedure untuk


begin memasukkan elemen
t.atas := t.atas + 1; ke dalam tumpukan
t.isi[t.atas] := x;
end;
Fungsi untuk
function pop (var t : tumpukan) : char; mengambil elemen
begin dari tumpukan
pop := t.isi[t.atas];
t.atas := t.atas - 1;
end;

{ Program Utama }
Begin
clrscr;
awalan(t);
writeln ('Tumpukan untuk membalik kalimat'); Kalimat yang akan
writeln ('*******************************'); dibalik
writeln;
write (‘Ketik kalimat : '); readln (kalimat);
clrscr;
writeln ('Kalimat asli : ',kalimat);
Mempush kalimat ke dalam
writeln;
tumpukan
writeln ('Setelah operasi push dan pop');

for i := 1 to length(kalimat) do Mempop isi tumpukan


push(t, kalimat[i]); sehingga terlihat
kalimat yg terbalik
for i := 1 to length(kalimat) do
write (pop(t));
readln;
End. Kalimat yang di input
Hasil eksekusi dari contoh progam :
Tumpukan untuk membalik kalimat
*******************************
Ketik kalimat : Budi
iduB Budi
Kalimat asli : Budi
i
Setelah operasi push dan pop B

iduB Karakter yang pertama di


Kalimat hasil keluaran push (dumasukkan).
Yang terbalik

17
Karakter yang pertama di
pop (dikelurkan).
Ilustrasi cara kerja contoh program :

I
D
U
B

Penjelasan : Misalkan kalimat yang diinput adalah Budi, maka urutan karakter
yang di push (dimasukkan) adalah B – u – d – i , maka
tampak di gambar ilustrasi, B berada pada paling bawah dan
iberada paling atas. Sehingga pada saat ingin melakukan proses
pop (mengeluarkan) maka urutan karakter yang dikeluarkan adalah
karakter i – d – u – B.

Soal :

1. Buatlah program dengan menggunakan metode Stack (Tumpukan) yang


fungsinya bekerja untuk membalikkan kalimat perkata (bukan
perkarakter).
Contoh
Masukkan sebuah kalimat : Ini Rumah Budi
Hasil Stack adalah : Budi Rumah Ini

BAB V
POINTER

Pemakaian array tidak selalu tepat untuk program-program terapan


dikarenakan kebutuhan memory yang selalu bertambah selama program
dijalankan. Untuk megatasi hal ini diperlukan struktur data yang dapat
mengalokasikan dan mendealokasi memori secara dinamis sesuai dengan
kebutuhan program saat dijalankan.

18
Nama variabel yang digunakan untuk mewakili suatu nilai data,
sebenarnya merupakan atau menunjukkan suatu lokasi tertentu didalam memori
komputer dimana data tersebut disimpan. Pada saat sebuah program dikopolasi,
kompiler akan memriksa bagian deklarasivariabeluntuk mengetahui nama-nama
variabel apa saja yang digunakan, sekaligus mengalokasikan atau menyediakan
tempat dalam pengingat untuk menyimpan nilai data tersebut. Dari sini kita bisa
melihat bahwa sebelum program dieksekusi (harap dibedakan antara kompilasi
dan eksekusi program), lokasi-lokasi data dalam pengingat sudah ditentukan dan
tidak bisa diubah selama program tersebut di eksekusi. Perubah-perubah yang
demikian ini dinamakan dengan perubah statis (static variabel).
Dari pengertian ini bisa kita perhatikan bahwa sesudah suatu lokasi
pengingat ditentukan untuk suatu nama variabel, maka dalam program tersebut
variabel yang dimaksud akan tetap menempati lokasi yang telah ditentukan dan
tidak mungkin berubah.. Dengan demikian dapat dikatakan bahwa banyaknya data
yang bisa diolah adalah terbatas. Sebagai contoh, misalnya kita mempunyai
variabel yang kita deklarasikan sebagai berikut :
Var kode : array[1..100] of integer;
Variabel kode diatas hanya mampu untuk menyimpan data sebanyak 100
buah data. Jika kita tetap akan menambah data pada variabel tersebut, eksekusi
program akan terhenti karena deklarasinya kurang. Sebaliknya jika ternyata data
yang disimpan sedikit jumlahnya, akan mengakibatkan pemborosan pemakaian
memori yang tidak perlu.
Untuk megatasi hal ini maka dibuatlah suatu variabel dinamis yang dapat
dialokasi dan didialokasikan sehingga jumlah penggunaan memori dapat sesuai
kebutuhan saat program dijalankan. Variabel dinamik (dynamic variabel) adalah
variabel yang dialokasikan hanya pada saat program dijalankan. Pada saat
dikompilasi, lokasi variabel ini belum ditentukan, kompiler hanya mencatat
bahwa ada variabel yang akan diperlakukan secara dinamis.
Pada variabel statis, isi memori pada lokasi tertentu adalah data
sesungguhnya yang akan diolah. Pada variabel dinamis, nilai variabel adalah
alamat lokasi yang menyimpan data sesungguhnya.
Untuk memperjelas pengertian tentang Pointer perhatikan ilustrasi berikut :

A 1000 B 5 5 1000

a. b.

Pada ilustrasi diatas terdapat 2 gambar a dan b. Gambar a mengilustrasikan


variabel A dengan cariabel statis. Dalam hal ini 1000 adalah nilai data yang
sesungguhnya dan disimpan pada variabel A. Sedangkan pada gambar b
mengilustrasikan variabel B yang dinamis. Nilai variabel b dimisalkan adalah 5,
nilai ini bukan data yang sesungguhnya, tetapi lokasi yang menyimpan data
sesungguhnya berada. Jadi dalam hal ini nilai data yang sesungguhnya tersimpan
berada pada lokasi 5 didalam memori.
Dari ilustrasi diatas bisa dilihat bahwa nilai variabel dinamis akan
digunakan untuk menunjuk kelokasi lain yang berisi data sesungguhnya yang
akan diproses. Karena alasan inilah variabel dinamis lebih dikenal dengan sebutan
pointer yang artinya kira-kira menunjuk ke sesuatu. Dalam variabel dinamis nilai
data yang ditunjuk oleh suatu pointer biasanya disebut sebagai simpul/node.

19
Bentuk umum deklarasi pointer :

Type variabel = ^simpul;


simpul = TipeData;

Tanda ^(ceret) didepan nama simpul menunjukkan bahwa variabel


tersebut adalah tipe data pointer. TipeData dapat berupa sembarang tipe data,
tetapi umumnya dalam program terapan TipeData ini biasanya berupa record.
Contoh penulisan pointer dengan bentuk record;
Type dataMhs = ^Data;
Data = record
Nama : string[25];
Nomor : string[10];
Alamat : string[25];
End;
Var mhs1,mhs2 : dataMhs;

Variabel mhs1 dan mhs2 masing-masing bertipe pointer. Ketika


program dikompilasi, kedua variabel ini akan menempati lokasi memori tertentu,
tetapi belum menunjuk kesuatu simpul (lokasi memori) yang berisi data. Pointer
yang belum menunjuk kesuatu lokasi akan bernilai nil.
Untuk mengalokasikan simpul didalam memori digunakan statemen new,
yang bentuk umumnya sebagai berikut :
New (variabel);
Untuk mendealokasikan simpul yang sudah tidak terpakai, maka
digunakan statemen dispose.
Dsipose (variabel);

Untuk mengisi data kedalam pointer (yang memiliki tipe data record)
caranya sama dengan pemakaian record, hanya saja setelah nama variabel lebih
dulu diikuti dengan tanda ceret. Contoh :
Mhs1^.nama := ‘Alung’;
Mhs2.alamat := ‘Jln. BimaSakti’;

Pemakaian alokasi memori dinamik sangat banyak digunakan oleh


program. Program-program grafik akan mengalokasikan sejumlah memori untuk
menyimpan gambar yang terdapat pada layar. Program yang menggunakan popup
dan pulldownmenu juga memanfaatkan alokasi memori dinamik. Bagian layar
yang ditutupi oleh menu disimpan dibagian memori yang telah dialokasikan.
Setelah menu tidak digunakan, bagian yang ditutupi dikembalikan lagi. Karena
tidak digunakan, bagian bagian memori yang telah dialokasikan tersebut
dikembalikan
type n = (dealokasi)
^integer;ke sistem untuk menghemat pemakaian memori.
var k : n;
Latihani: : integer;
begin
i := 20;
clrscr;
writeln (k^);
new (k);
k^ := i;
writeln (k^); 20
readln;
end.
type point = ^data;
data = record
nama : string;
alamat : string;
end;
var dt1,dt2 : point;
begin
clrscr;
new (dt1);
new (dt2);
dt1^.nama := 'Alung SiDraco';
dt1^.alamat := 'Yogyakarta';
writeln ('Data yang terdapat di dt1^');
writeln (dt1^.nama);
writeln (dt1^.alamat);
writeln;
dt2^ := dt1^;
writeln ('Data yang terdapat di dt2^');
writeln (dt2^.nama);
writeln (dt2^.alamat);
writeln;
dispose (dt1);
writeln ('dt1 setelah di dispose');
writeln (dt1^.nama);
writeln (dt1^.alamat);
writeln;
dispose (dt2);
writeln ('dt2 setelah di dispose');
writeln (dt2^.nama);
writeln (dt2^.alamat);
readln;
end.

Soal :

1. Buatlah program menggunakan pointer dan record


untuk menginputkan dan menampilkan data karyawan, seperti NIP,Nama,Gaji.
Contoh :
Jumlah Pegawai : 2
Data ke – 1 :
NIP : 02051945

21
Nama : Rocky
Gaji : 20

Data ke – 2 :
NIP : 02351234
Nama : Rambo
Gaji : 15

Hasil Inputan :
NIP Nama Gaj
i
02051945 Rocky 20
02351234 Rambo 15

BAB VI
LINKED LIST ( SENARAI BERANTAI )

A. Single Linked .

Salah satu struktur data dinamis yang paling sederhana adalah Senarai
Berantai (Linked List), atau senarai satu arah. Senarai Berantai sendiri punya
makna sebagai kumpulan komponen yang disusun secara berurutan dengan
menggunakan bantuan pointer. Komponen-komponen yang tersusun tersebut akan
disebut sebagai simpul, sehingga pada senarai akan terdapat banyak simpul, dan
tiap simpulnya dapat dibagi menjadi dua bagian. Bagian pertama dari simpul
disebut dengan medan informasi, yang berisi informasi/data yang dapat berupa
record yanag akan diolah. Sedangkan bagian yang kedua disebut sebagai medan
penyambung (link field), yang berisi alamat simpul berikutnya.
simpul

simpul^.medan_informasi simpul^.medan_penyambung

Medan Medan
informa penyambun
si g

Untuk memudahkan setiap pembahasan selanjutnya, maka akan kita


tetapkan untuk sebelah kiri simpul disebut sebagai medan informasi dan sebelah
kanan simpul disebut sebagai medan penyambung. Perlu diketahui bahwa medan
penyambung sebenarnya adalah suatu pointer yang akan menunjuk ke simpul
berikutnya, sehingga nilai dari medan ini dapat berupa alamat lokasi simpul
berikutnya ataupun dapat bernilai nil. Perlu diingat bahwa setiap simpul terakhir
dari linked list medan penyambung harus bernilai nil.

22
Contoh dari senarai berantai dengan 5 simpul :

awal Pointer yg menunjuk ke awal senarai akhir


Pointer yg menunjuk ke akhir senarai

A B C D E

Medan informasi Medan penyambung Medan penyambung


yg menunjuk ke yg bernilai nil
simpul berikutnya

Tampak dari gambar bahwa medan penyambung menunjuk ke simpul


berikutnya, dan medan penyambung pada simpul terakhir akan bernilai nil karena
medan penyambung tersebut tidak menunjuk kemanapun. Pada senarai berantai
juga terdapat 2 buah pointer awal dan akhir, kedua pointer ini berfungsi untuk
mempermudah dalam melakukan operasi pengolahan data pada senarai berantai,
seperti : pembacaan, pencarian, pengeditan, serta penghapusan data, pengertian
kedua pointer ini mungkin akan lebih jelas pada pembahasan selanjutnya.
Bentuk umum pendeklarasian single linked list :

Type nmlist = ^nmrecord;


nmrecord = record;
nmvar1 : tipe;
nmvarn : nmlist;
end;
Var node : list;
Medan penghubung yg
bertipe data pointe.

Penjelasan : nmlis : sebuah pointer yang menunjuk ke sebuah record.

nmrecord : nama record yang berisi variabel penyimpan data dan


berisi medan penyambung.
nmvar1 : variabel yang akan berfungsi sebagai penyimpan data
nmvarn : variabel yang berfungsi sebeagai media penyambung.

Contoh penulisan Single Linked List :


Type simpul = ^data;
data = record
info : char;
kait : simpul;
end;
var awal,akhir,baru : simpul;
Dengan contoh pendeklarasian sederhana tersebut, maka operasi-operasi
pengolahan data dapat dilakukan seperti pada contoh program berikut yang
berfungsi untuk menambah dan menampilkan data menggunakan linked list.

23
program SingleLinkedList;
uses wincrt;
type simpul = ^data;
data = record
nama : string[25]; Deklarasi simpul
kait : simpul;
end;
var awal,akhir,bantu : simpul;
ya : char;
begin
clrscr; Pembuatan nilai awal= nil, pada
awal := nil; saat program pertama dijalankan
ya := 'y';
while ya in ['y','Y'] do
begin
new (bantu);
write ('Masukkan Nama : ');
readln (bantu^.nama);
write ('Tambah data lagi [Y/N]: ?');
readln (ya);
writeln;
if awal = nil then
begin Proses 1:
bantu^.kait := nil; Proses yg dilakukan saat
awal := bantu; penginputan data yang pertama
akhir := bantu;
end
else
begin Proses 2 :
akhir^.kait := bantu; Proses penambahan data
bantu^.kait := nil; selanjutnya.
akhir := bantu;
end;
end;
bantu := awal; Proses 3 :
writeln (bantu^.nama); Proses untuk menampilkan data
while bantu^.kait <> nil do
begin
bantu := bantu^.kait;
writeln (bantu^.nama);
end;
readln;
end.

Program diatas pertama kali setelah pendeklarasian simpul adalah


melakukan pemberian nilai nil terhadap variabel awal, karena pada saat
program pertama dijalankan data belum ada sehingga variabel awal belum
menunjuk kesuatu tempat. Tampak pada program terdapat 3 proses, demikian
ilustrasi ke 3 proses tersebut :
Proses 1 : Proses untuk memberikan nilai pada variabel awal dan akhir saat
pertama penginputan data.
bantu bantu awal akhir

a. b. c. 24
Tampak bahwa medan penyambung dari bantu (bantu^.kait) dibuat nilainya
nil karena data masih satu sehingga berperan sebagai awal dan akhir linked list.
Proses 2 : Proses untuk memberikan nilai pada akhir untuk menunjuk ke-
bantu yang baru saja diinputkan.
awal akhir bantu awal akhir bantu

a.
b.
awal akhir
Niliai nil

c.
Pada gambar a simpul bantu baru dibentuk. Gambar b menjelaskan akhir
akan menunjuk ke bantu yang baru. Gambar c menjelaskan peberian nilai nil
kepada bantu^.kait, karena bantu tersebut berada pada posisi terakhir.
Tampak pada gambar bahwa yang berpindah arah hanya akhir dan bukan awal, hal
ini menandakan bahwa penambahan dilakukan di belakang linked list. Perlu
diingat bahwa dalam linked list terdapat peraturan-peraturan sebagai berikut :
1. awal akan selalu menunjuk ke awal linked list, dan akhir akan selalu
menunjuk ke akhir linked list, sekalipun penambahan data dilakukan.
2. Setiap simpul yang terakhir dari linked list nilai dari medan penyambung
harus selalu bernilai nil.
Proses 3 : Pada proses ini bantu akan membaca simpul dan menampilkan hasilnya
dari awal sampai akhir linked list.

Operasi pada Senarai Berantai (Single Linked List)


1. Menambah simpul di belakang.
Untuk contoh dan ilustrasi menambah dibelakang sudah dijelaskan pada
contoh program Proses 2.
2. Menambah simpul di depan.
bantu :
Ilustrasi awal akhir

Simpul baru
a.
bantu awal akhir

bantu^.kait := awal b.
awal akhir
awal := bantu

25

c.
Bentuk penulisan dalam bentuk program :
new(bantu);
bantu^.nama := ‘Alung’;
bantu^.kait := awal;
awal := bantu;
3. Menambah simpul di tengah.
Ilustrasi : awal akhir

a.

bantu Simpul baru

awal bantu2 akhir

b.

bantu
bantu^.kait:= bantu2^.kait
tbanbantu2^.berikut

awal bantu2 akhir

bantu c. awal akhir

Bentuk penulisan dalam bentuk program :


bantu2^.kait := bantu
new(bantu);
bantu := awal bantu^.nama := ‘Alung’;
bantu^.kait := bantu2^.kait; a.
bantu2^.kait := bantu;
bantu awal akhir
4. Menghapus simpul di awal.
Ilustrasi :

awal := bantu^.kait b.
bantu awal akhir

26

c.
dispose(bantu)
Bentuk penulisan dalam bentuk program :
bantu := awal;
awal := bantu^.kait;
dispose(bantu);

5. Menghapus simpul di tengah.


Ilustrasi :
awal bantu2 bantu akhir

bantu2^.kait := bantu a.

awal bantu2 bantu akhir

b.
bantu2^.kait := bantu^.kait

awal bantu2 dispose(bantu) akhir

c.

Bentuk penulisan dalam bentuk program :


While (bantu^.kait<>nil) or (bantu^.nama<>‘Budi’) do
bantu := bantu^.kait;
If (bantu <> nil) then

27
Begin
bantu2^.kait := bantu;
bantu2^.kait := bantu^.kait;
dispose(bantu);
End;

bantu := akhir
6. Menghapus simpul di akhir.
Ilustrasi :
awal akhir bantu

a.
akhir^.kait := bantu
awal akhir bantu

b.
awal akhir

dispose(bantu)

c.

akhir^.kait := nil

Bentuk penulisan dalam bentuk program :


bantu := akhir;
akhir^.kait := bantu;
dispose(bantu);
akhir^.kait := nil;

B. Double Linked List,


Double Linked List menggunakan tekhnik yang sama dengan Single
Linked List. Perbedaan utamanya adalah simpul pada Double Linked List dapat
menunjuk kedapan atau kebelakang. Hal ini akan mempermudah pembacaan (bisa
dilakukan dari kiri ke kanan atau sebalinya), penambahan simpul baru atau
penghapusan simpul bisa dilaksanakan untuk simpul-simpul yang terletak
disebelah kiri atau kanan dari pointer yang diketahui.
simpul

simpul^.belakang simpul^.depan
28
Contoh pendeklarasian Double Linked List :
Type simpul = ^data;
data = record
nama : string;
depan,belakang : simpul;
End;
Var awal,akhir,baru : simpul;
Tampak dari contoh pendeklarasian tersebut pada bagian record terdapat
dua buah variabel yang bertipe pointer (simpul) yaitu depan dan belakang.
Hal inilah yang mengakibatkan Senarai Berantai tersebut disebut sebagai Double
Linked List. Pada deklarasi di atas pointer blakang adalah pointer untuk
menunjuk ke simpul sebelumnya, atau simpul sebelah kiri, pointer depan adalah
pointer untuk menunjuk ke simpul sesudahnya atau simpul sebelah kanan.
Operasi pada Senarai Berantai Ganda (Double Linked List). Simpul baru
1. Menambah Data
Ilustrasi :

awal akhir baru

A B C D
nil nil

a.
awal akhir baru

A B C D
nil
akhir^.depan:=baru;
baru^.belakang:=akhir
b.
akhir := baru;
awal akhir baru

A B C D
nil nil
Bentuk penulisan dalam bentuk program :
akhir^.depan := baru; baru^.belakang := nil
baru^.belakang := akhir; c.
baru^.depan := nil;
akhir := baru;

2. Membaca simpul/data
Karena memiliki pointer yang dapat menunjuk ke depan dan ke belakang,
operasi pembacaan data dilakukan dari kedua arah, yaitu dari depan dan
belakang.
Membaca dari belakang :

29
bantu awal akhir bantu

A B C D
nil nil

a.
Penulisan dalam bentuk program :
bantu := awal;
While bantu <> nil do
Begin
Writeln (‘nama : ‘,bantu^.nama);
bantu := bantu^.depan;
End;
Fungsi dari penulisan program ini adalah untuk menjalankan
pointer bantu dari awal hingga akhir list serta menampilkan isi dari
simpul yang dilewati.

Membaca dari depan :


bantu awal akhir bantu

program doule_linked_list;
uses wincrt; A B C D
nil
type simpul = ^data; nil
data = record Deklarasi simpul double linked
nama : string; list.
depan,belakang : simpul; a.
end;
Penulisan dalam
var awal,akhir,bantu bentuk program :
: simpul;
pil : char; bantu := akhir;
While
procedure buatlist bantu
(var bantu <> nil
: simpul); do Procedure untuk menambah
data
begin Begin
if awal = nil then Writeln (‘nama : ‘,bantu^.nama);
begin bantu := bantu^.belakang;
Penambahan data/simpul yang
awal := bantu; pertama
End;
awal^.depan := nil;
awal^.belakang := nil;
akhirPerintah-perintah
:= awal; di atas adalah untuk menjalankan pointer bantudari
end akhir hingga ke awal senarai, serta menampilkan isi dari variabel nama
else pada setiap simpul yang dilewatinya.
begin
akhir^.depan := bantu; Penambahan data/simpul untuk ke-
Contoh Program
bantu^.depan := :nil; sekian kali.
bantu^.belakang := akhir;
akhir := bantu;
end;
Procedure untuk mencetak data dari awal list.
end;
procedure cetakawal;
var bantu : simpul;
begin
clrscr;
writeln ('Cetak Data Dari Awal');
bantu := awal; Perintah untuk mencetak data
while bantu <> nil do dari awal.
begin
writeln ('Nama : ',bantu^.nama);
bantu := bantu^.depan; 30
end;
readln;
end;
procedure cetakakhir; Procedure untuk mencetak data dari akhir list
var bantu : simpul;
begin
clrscr;
writeln ('Cetak Data Dari Akhir');
bantu := akhir;
while bantu <> nil do
begin Perintah untuk mencetak data
writeln ('Nama : ',bantu^.nama); dari akhir.
bantu := bantu^.belakang;
end;
readln;
end;
Procedure untuk menghapus seluruh data
procedure hapuslist;
dari awal.
var bantu : simpul;
begin
clrscr;
while awal <> nil do
begin Perintah untuk menghapus data dari awal
bantu := awal; list.
awal := awal^.depan;
dispose(bantu);
end;
writeln ('Data telah dihapus');
readln;
end;
Begin Awal program utama
awal := nil;
repeat
clrscr;
writeln ('Program Double Linked List');
writeln ('**************************');
writeln ('1. Tambah Data');
writeln ('2. Cetak Data Dari Awal');
writeln ('3. Cetak Data Dari Akhir');
writeln ('4. Hapus Seluruh Data');
writeln ('5. Keluar');
write ('Pilihan Anda [1/2/3/4/5] : ');
readln (pil);
case pil of
'1' : begin
clrscr; Perintah untuk menambah
new(bantu); data dan memanggil
writeln ('Tambah Data'); procedure buatlist.
write ('Masukkan Nama : ');
readln (bantu^.nama);
buatlist(bantu);
end;
Pemanggilan procedure cetakawal
'2' : cetakawal; Pemanggilan procedure cetakakhir
'3' : cetakakhir; Pemanggilan procedure hapuslist
'4' : hapuslist;
end; 31
until (pil >= '5');
readln;
End.
Soal :
1. Buatlah program menggunakan methode Single Linked List untuk
menginputkan nama, seperti berikut berikut :
Menu :
1. Tambah Data
2. Hapus Data Depan
3. Hapus Data Belakang
4. Cetak Data
Pilh Menu [1/2/3/4] :
Menu 1 :
Inputkan Nama : Alung

32
Kembali ke menu.
Menu 2 :
Hapus Data Dari Depan List
Kembali ke menu.
Menu 3 :
Hapus Data Dari Belakang List
Kembali ke menu.
Menu 4 :
Nama – 1 : Alung
Nama – 2 : Dragon
Nama – 3 : Naga
Kembali ke menu.

2. Buatlah program menggunakan Double Linked List untuk menginputkan


data karyawan yang berupa : nama, nip, gaji. Data yang sudah diinput
dari keyboard ditambahkan ke awal (buka akhir) Linked List.
Presentasikan dengan menggunakan menu-menu, seperti : 1. Tambah Data
Di Awal List, 2. Cetak Data, 3. Keluar.

BAB VII
ANTRIAN (QUEUE)
Antrian adalah suatu kumpulan data yang mana penambahan elemen
hanya bisa dilakukan pada suatu ujung (belakang/rear), dan penghapusan
dilakukan lewat ujung lainnya (depan/front). Sebagai contoh dapat kita ibaratkan
dengan antrian membeli karcis di sebuah bioskop, para pengantri yang ingin
membeli karcis hanya masuk ke antrian melalui satu pintu saja, demikian bagi
yang telah selesai membeli karcis akan keluar melalui satu pintu/ujung yang lain.
Seperti pada Stack/Tumpukan yang mengenal istilah masuk terakhir
keluar pertama (LIFO – Last In First Out). Berbeda dengan Antrian yang
mengenal istilah masuk pertama keluar pertama (FIFO – Fisrt In First Out)
Ilustrasi Antrian :
depan

keluar masuk

Hal yang perlu diingat pada operasi Antrian adalah bahwa setiap
penambahan data akan selalu dilakukan dari belakang, dan
belakang
pengurangan/penghapusan data akan selalu dilakukan dari depan. Sehingga
berdasarkan gambar bila ingin menambahkan suatu data harus diletakkan pada
bagian sebelah kanan F, dan bila akan menghapus suatu data, maka akan
dilakukan pada bagian sebelah kiri, dalam hal ini A.
Antrian dapat disajikan dalam bentuk larik/array. Berikut contoh
pendeklarasian Antrian dengan array.
Type antri = array[1..100] of integer;
Var antrian : antri;

33
depan,belakang : integer;
Pada deklarasi diatas, elemen antrian dinyatakan dalam tipe integer.
Variabel depan menunjukkan posisi elemen pertama dalam larik, variabel
belakang menunjukkan posisi elemen terakhir dalam larik.
Dalam suatu permasalahan saat antrian sudah penuh, sementara kita masih
ingin terus menambahan data lagi, maka akan terjadi offerflow (kelbihan
kapasitas). Dengan mengabaikan akan terjadinya offerflow, maka penambahan
data pada antrian dalam bentuk programnnya adalah sebagai berikut :
Belakang := belakang + 1;
Antrian[belakang] := x; {x : variabel untuk mengisi antrian}
Ilustrasi : depan = 1

1 2 3 4 5 6
A.

belakang = 0

Program pada saat pertama kali dijalankan antrian masih dalam keadaan
kosong, sehingga depan bernilai 1 dan belakang bernilai 0.
depan = 1

1 2 3 4 5 6
B.

belakang = 4
Pada saat dilakukan penambahan data maka belakang akan dijumlahkan
dengan 1, kemudian antrian pada posisi belakang (antrian[belakang])
akan disi dengan elemen x.
Masih dengan mengabaikan akan terjadinya offerflow, untuk
pengurangan / penghapusan pada antrian adalah sebagai berikut :
X := antrian[depan];
Depan := depan + 1;
depan = 3

1 2 3 4 5 6

belakang = 6

34
Pada saat dilakukan pengurangan data maka x akan diisi nilainya dengan
kedudukan depan saat itu, kemudian depan dimajukan sebanyak 1 (depan +
1).
Dengan keadaan seperti diatas tentu saja dapat terjadi suatu keadaan
dimana penambahan elemen baru tidak dapat dilakukan, misalnya karena nilai
belakang sudah mencapai nilai maksimal akan tetapi antrian yang
sesungguhnya masih banyak yang kosong karena nilai depan lebih besar dari 1,
seperti pada gambar di atas.
Kemungkinan penyelesaian yang dapat dilakukan adalah dengan
menggeser elemen-elemen lain maju ke depan jika ada elemen yang keluar
(dihapus) seperti antrian manusia yang membeli karcis pada umumnya.
depan belakang depan belakang

1 2 3 4 5 6 1 2 3 4 5 6

Akan tetapi hal ini akan sangat tidak efisien dilakukan pada elemn array, kalu
jumlah elemen array yang sedikit mungkin tidak terlalu jadi masalah, tetapi akan
jadi masalah bila elemen array-nya sampai sebanyak seratus bahkan ribuan
elemen, data akan dipindahkan satu-persatu sebanyak seribu elemen, hal ini akan
memperlambat kinerja komputer.
Cara yang paling baik untuk memecahkan masalah ini adalah dengan
menyimpan elemen larik seolah-olah larik berbentuk lingkaran.
depan C D belakang
X E

Elemen baru selalu dapat ditambahkan selama masih ada tempat kosong (terdapat
tempat kosong antara belakang dan depan).
Pada kenyataan yang sebenarnya larik tidak benar-benar memutar
melainkan masih seperti biasa yang memiliki ujung, namun perlakuannya di
dalam penulisan program dibuat seakan-akan melingkar/memutar.
Berikut adalah ilustrasi serta penulisan program untuk operasi pada antrian
yang dibuat seakan-akan memutar :
belakang=6 Pada keadaan awal antrian disi dengan dua elemen :
belakang := 6;
depan := 4;
depan=4

Hal berikut adalah proses penambahan elemen, karena


masih ada tempat yang kosong (perlu diingat antrian
diperlakukan sebagai lingkaran).

if belakang = maximal then


belakang := 1
else 35
belakang := belakang + 1;
depan=4

belakang=1

Hal berikut menjelaskan proses penghapusan data,


depan=5 selama masih data belum kosong :

X := antrian[depan];
If depan = maximal then
Depan := 1;
Else
Depan := depan + 1;
belakang=1

Contoh program :
program antrian_;
uses wincrt;
const maximum = 10;
type antri
function = array[1..maximum]
Hapus(var antrian : antri)of char;: char; Pembuatan array untuk
var antrian : antri;
begin antrian
ifdepan,belakang,pilih
depan = maximum then: integer;
elemen
depan := : char;
1
function
else Kosong(Q : antri) : boolean; Function untuk mencek isi antrian
begin
begin Jika depan = belakang, berarti
Kosong
depan:= :=(depan
depan += 1;
belakang); antrian sedang kosong
end;Hapus := antrian[depan];
procedure
end; tambah(var antrian : antri; x : char);
begin
end;
if belakang = maximum then
Begin Jika belakang berada pada posisi antrian
belakang := 1
clrscr; teratas, maka belakang dipindah ke 1
else := 0;
depan Jika tidak berada diatas maka
belakang
belakang :=:=0;belakang + 1; belakang dinaikkan 1
if not(Kosong(antrian)) then
repeat
begin Jika antrian tidak kosong maka, antrian
clrscr;
antrian[belakang]
writeln := x;
('Daftar Menu Pilihan'); ditambah dengan nilai x pada posisi
write (x);
writeln ('-------------------'); belakang
endwriteln ('1. Menambah Elemen');
else
writeln ('2. Menghapus Elemen');
begin
writeln ('3. Selesai');
('Antrian
write ('Pilih Sudah
Salah Penuh');
Satu : ');
repeat (pilih);
readln
{
case }
pilih of
until keypressed;
1 : begin
belakangwriteln
:= belakang - 1; Elemen');
('Menambah
if belakang Pengembalian posisi belakang ke tempat
= 0 ('---------------');
writeln then
belakang := ('Isikan
write maximum; Elemennya sebelumnya
: ');saat antrianFunction untuk dan
sudah penuh
end; readln (elemen); menghapus
tidak dapat ditambah lagi. elemen
end; tambah (antrian,elemen);
Untuk memindahkan depan ke 1 saat depan
end; berada di posisi maximum.
2 : begin
if not(Kosong(antrian)) then
elemen := hapus(antrian)
Memindahkan depan sebanyak 1 elemen,
else dan menghapus elemen.
begin
writeln ('Antrian Kosong');
elemen := readkey; Awal program utama
end;
end; Penempatan posisi depan dan belakang di posisi 0 saat awal
end; program dimulai. 36
until pilih = 3
End.
Pemanggilan procedure
tambah saat menambah elemen

Pengecekan isi antrian saat akan


menghapus elemen. Jika antrian
tidak kosong maka data akan
dihapus, sebaliknya jika antrian
kosong akan ada pesan ‘Antrian
Kosong’.

Program diatas tidak akan menampilkan data yang telah diinput, sehingga
untuk pengujiannya adalah dengan cara : Inputkanlah data sebanyak tiga kali
dengan memilih menu 1, kemudian hapuslah data tersebut dengan memilih menu
2 sebanyak tiga kali. Jika ada pesan : “Antrian Kosong”, berarti program anda
sudah benar. Hal ini disebabkan data yang kita masukkan sebanyak 3 buah, akan
dihapus dari antrian, sehingga pada penghapusan yang keempat ditampilkan
sebuah pesan.
Implementasi Antrian Dengan Pointer.
Kita telah mempelajari bagaimana membuat antrian dengan menggunakan
array. Dari pelajaran tersebut kita dapat mengetahui bahwa dengan menggunakan
array, antrian punya beberapa kekurangan antara lain : jumlah elemen antrian
sangat dibatasi oleh elemen array, sehingga tidak memungkinkan bila ingin
memproses data yang sangat banyak dan belum dapat di ketahui jumlah
maximalnya. Sehingga dalam hal ini diperlukan bantuan pointer untuk
menerapkan pembuatan antrian.
Dengan menggunakan pointer maka jumlah data yang dapat di inputkan ke
antrian bisa sangat banyak. Penerapan pointer dalam antrian hampir sama dengan
senarai berantai, sehingga bila anda sudah memahami senarai berantai maka tidak
sulit untuk memahami antrian dengan pointer.
Berikut implementasi antrian dengan pointer menggunakan ilustrasi :
1. Inisialisasi
kepala ekor
New(kepala);
kepala^.info := chr(0);
kepala^.kait := kepala;
ekor := kepala 37
2. Penambahan di belakang (masuk ke dalam antrian).
kepala ekor baru
Penambahan antrian dengan
data baru

kepala ekor baru

baru^.kait := kepala

kepala ekor baru

ekor^.kait := baru

kepala ekor

ekor := baru

3. Penghapusan di depan (Keluar dari antrian).

bantu kepala ekor

bantu := kepala
bantu kepala ekor

kepala := bantu^.kait
bantu kepala ekor

38

ekor^.kait := kepala
kepala ekor

dispose(bantu)

Soal :

1. Lengkapilah contoh program antrian dengan menggunakan array yang


sebelumnya dengan fasilitas untuk mencetak/menampilkan data yang ada
di antrian, sehingga data yang masih ada diantrian dapat dilihat di layar
monitor.
2. Buatlah program seperti pada contoh program yang sebelumnya, namun
dikerjakan menggunakan methode antrian dengan pointer.

BAB VIII
SORT

Pengurutan data (sorting) secara umum dapat didefinisikan sebagai suatu


proses untuk menyusun kembali himpunan objek menggunakan aturan-aturan
tertentu. Berdasarkan cara pengurutan dapat dibedakan menjadi dua bagian, yang
pertama adalah pengurutan secara urut naik (ascending), yaitu data diurutkan
mulai dari yang terkecil hingga yang terbesar, yang kedua adalah pengurutan
secara urut turun (descending), yaitu pengurutan dari data yang besar hingga ke
data yang paling kecil.

Pengurutan merupakan suatu hal yang penting sekali dalam ilmu


komputer, praktik-praktik yang sering menggunakan pengurutan biasanya sering
terjadi dalam operasi basis data, dimana pengurutan data sangat dibutuhkan untuk
memudahkan dalam pencarian data yang diinginkan dari sekian banyak data yang
tersimpan.
Untuk melakukan proses pengurutan data pada saat ini telah banyak
dikembangkan methode-methode untuk lebih mengefisienkan pengurutan data,
diantara methode-methode itu adalah dengan cara : Methode Penyisipan
Langsung, Penyisipan Biner, Methode Seleksi, Methode Gelembung, Methode
ShellShort, Methode QuickShort, dan masih ada beberapa methode lagi.
Dari banyaknya methode yang dapat melakukan pengurutan ini, maka
disinilah kita dituntut untuk dapat memilih methode yang sesuai dengan apa yang
sedang kita kerjakan dengan memikirkan efisiensinya. Hal yang paling
berpengaruh dalam pemilihan methode adalah dilihat dari segi banyaknya data

39
yang akan diurut, dan dari segi lama waktu yang dibutuhkan untuk mengurutkan
data.
Karena banyaknya methode yang dapat dilakukan untuk mengurutkan
data, maka untuk pembahasan ini kita hanya akan membahas pengurutan data
dengan Methode Gelembung (Buble Sort). Namun diharapkan setiap mahasiswa
juga mempelajari methode-methode lain.
Pada pembahasan Methode Gelembung, kita akan membahasnya pada
pengurutan data yang tersimpan pada senarai berantai (single linked list). Berikut
langkah-langkahnya, dengan data dianggap sudah diinputkan :

Langkah 1 :
awal A B

Langkah pertama adalah dengan memberikan nilai pada pointer A untuk


menunjuk pada data awal, dan pointer B menunjuk pada data sesudahnya.
Pada saat posisi seperti gambar, nilai pada pointer B akan dibandingkan
dengan nilai pada pointer A, jika nilai pada B<A, maka nilainya akan
ditukar (untuk pengurutan ascending).

Langkah 2 :
awal A B B

Langkah kedua adalah dengan menjalankan pointer B sampai ke ujung dari


senarai, dengan catatan setiap kali melewati sebuah simpul, nilainya akan
selalu dibandingkan dengan nilai yang ada pada pointer A, jika nilai B <
A, maka nilainya akan ditukar.

Langkah 3 :
awal A B

Langkah ketiga adalah, setelah langkah kedua diatas selesai dilakukan,


maka pointer A maju satu simpul, dan pointer B mengambil posisi di depan
pointer A, kemudian membandingkan nilai yang ada di pointer B ke
pointer A.

Langkah 4 :
awal A B B

40
Langkah keempat adalah sama seperti langkah kedua dengan menjalankan
pointer B sampai ke simpul terakhir sambil membandingkan nilainya
dengan yang ada dipointer A.
Demikian seterusnya sampai pointer A sampai pada ujung senarai berantai
atau simpul terakhir.

Dari langkah-langkah tersebut diatas maka diperolehlah data yang sudah


diurutkan secara ascending. Untuk memperjelas pengertian tentang pengurutan
dengan Methode Gelembung (Buble Short), berikut contoh programnya :
program tes_sortir;
uses crt;
type simpul = ^data;
data = record
dt : char; Pendeklarasian simpul untuk senarai berantai
kait : simpul;
end;
var awal,A,B,baru,akhir,bantu : simpul;
huruf : string;
i : integer;
car : char;
begin
clrscr;
new(awal);
awal := nil;
write ('Inputkan karakter : ');
readln (huruf);
for i := 1 to length(huruf) do
begin
new(baru);
baru^.dt := huruf[i];
if awal = nil then
begin
Proses yang dilakukan untuk
baru^.kait := nil;
memasukkan atau menambah data
awal := baru;
kedalam senarai berantai
akhir := awal;
end
else
begin
akhir^.kait := baru;
akhir := baru;
akhir^.kait := nil;
end;
end;

41
A := awal;
while not(A = nil) do
begin
B := A^.kait;
while not(B = nil) do
begin
if B^.dt < A^.dt then
begin Perintah yang dilakukan untuk mengurutkan
car := B^.dt; data yang terdapat di dalam senarai berantai
B^.dt := A^.dt; secara ascending.
A^.dt := car;
end;
B := B^.kait;
end;
A := A^.kait;
end;
writeln ('Hasil Pengurutan');
bantu := awal;
while not(bantu = nil) do Perintah yang dilakukan untuk menampilkan
begin data yang terdapat pada senarai berantai hasil
writeln (bantu^.dt); sortiran/pengurutan.
bantu := bantu^.kait;
end;
readln
end.

Program diatas adalah program untuk mengurutkan seluruh karakter yang


dimasukkan dari keyboard secara ascending.

Soal :
1. Buatlah program untuk mengurutkan data secara descending dengan
Methode Bubble Short, dengan memiliki menu-menu sebagai berikut :
Menu Pilihan :
1. Input Kalimat
2. shorting Kalimat
3. Keluar
Pilih Menu [1/2/3] :
Untuk menu 1 :
Inputkan kalimat : abcdefghij

Untuk menu 2 :
Hasil pengurutan descending : jihgfedcba

Untuk Menu 3 :
Keluar.

Catatan : Dalam pengerjaan soal harus menggunakan procedure atau


function.

42
43

Anda mungkin juga menyukai