bab i 1. . · pdf file · 2013-07-03var pengenal = array [tipe_index] of tipe; ......

42
1 var pengenal = array [tipe_index] of tipe; 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 biasanya digunakan 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 : 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.

Upload: voliem

Post on 08-Mar-2018

242 views

Category:

Documents


4 download

TRANSCRIPT

1

var pengenal = array [tipe_index] of tipe;

BAB I1. Pendahuluan.

Struktur data adalah cara menyimpan atau merepresentasikan data didalam komputer agar bisa dipakai secara efisien Sedangkan data adalahrepresentasi dari fakta dunia nyata. Fakta atau keterangan tentang kenyataan yangdisimpan, 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 dankarakter

b. Type data sederhana majemuk, misalnya String2. Struktur Data, meliputi

a. Struktur data sederhana, misalnya array dan recordb. Struktur data majemuk, yang terdiri dari Linier : Stack, Queue, serta

List dan Multilist Non Linier : Pohon Biner dan GraphPemakaian struktur data yang tepat di dalam proses pemrograman akanmenghasilkan algoritma yang lebih jelas dan tepat, sehingga menjadikan programsecara keseluruhan lebih efisien dan sederhana. Struktur data yang ″standar″ yangbiasanya digunakan dibidang informatika adalah :

List linier (Linked List) dan variasinya Multilist Stack (Tumpukan) Queue (Antrian) Tree ( Pohon ) Graph ( Graf )

2. ARRAY dan SETA. ARRAY (LARIK)

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

Keterangan : pengenal : nama variabel.tipe_index : jumlah larik.tipe : tipe data.

Parameter tipe_index menentukan banyaknya komponen lariktersebut. Parameter ini boleh berupa sembarang tipe ordinal kecuali longintdan 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 dengandua dimensi atau dimensi banyak, demikian juga dengan larik3.

2

Latihan-latihan :

Varnama : array[1..3] of string;

Beginnama[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;

Varnim : array[awal..akhir] of string;nama : array[awal..akhir] of string;n : integer;

BeginWriteln (‘Isi NIM dan Nama dengan Array’);For n := 1 to 5 doBeginWrite (‘NIM - ’,n,’ : ‘); readln(nim[n]);Write (‘Nama - ’,n,’ : ‘); readln(nama[n]);Writeln;

End;Writeln;Writeln (‘Hasil dari inputan adalah :’);For n := 1 to 5 doBeginWriteln (‘NIM - ’,n,’ : ‘,nim[n]);Writeln (‘Nama - ’,n,’ : ‘,nama[n]);Writeln;

End;End.

Varnil : array[1..3] of integer;

Beginnil[1] := 105;nil[2] := 202;nil[3] := 727;writeln (nil[1]);writeln (nil[2]);writeln (nil[3]);

End.

3

Var nilai : array[1..5] of integer;Jm, rata : real;

BeginWriteln (‘Menghitung rata-rata 5 buah nilai’);Write (‘nilai1 = ‘); readln(nilai[1]);Write (‘nilai2 = ‘); readln(nilai[2]);Write (‘nilai3 = ‘); readln(nilai[3]);Write (‘nilai4 = ‘); readln(nilai[4]);Write (‘nilai5 = ‘); readln(nilai[5]);Jm := nilai[1]+nilai[2]+nilai[3]+nilai[4]+nilai[5];Rata := jm / 5;Writeln;Writeln (‘Jumlah = ‘,jm:9:2);Writeln (‘Rata-rata = ‘,rata:9:2);

End.

Var Dim1 : array[1..3] of integer;Dim2 : array[1..3,1..3] of integer;Dim3 : array[1..3,1..3,1..3] of integer;i,j,k : integer;

Begin{input elemen array}For i := 1 to 3 doDim1[i] := 2 * i – 1;

For i := 1 to 3 doBeginFor j := 1 to 3 doDim2[i,j] := 4 * i – j;

End;

For i := 1 to 3 doBeginFor j := 1 to 3 doBeginFor k := 1 to 3 doDim3[i,j,k] := j * k – i;

End;End;

{cetak elemen array}for i := 1 to 3 doBeginWriteln;Writeln (‘1 dimensi[‘,i,’] = ’,dim1[i]);For j := 1 to 3 doBeginWriteln (‘2 dimensi[‘,i,’,’,j,’] = ’,dim2[I,j]);For k := 1 to 3 doWriteln (‘3 dimensi[‘,i,’,’,j,’,’,k,’]=’,dim2[i,j,k]);End;End; End.

4

B. SET

Set adalah kumpulan objek yang mempunyai tipe data sama dalam urutanyang tidak diperhatikan. Setiap elemen dalam set disebut dengan anggota atauelemen set. Tipe data dari anggota set dapat berupa nilai skalar atau himpunanbagian dari tipe data lain yang ada dalam pascal.Bentuk umum dari deklarasi set adalah :

Keterangan : pengenal : nama variabel atau nama type.tipe : type data buatan sendiri maupun bawaan pascal.

Pendeklarasian set tidak hanya dapat dilakukan pada Type saja tapiterkadang 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 kenama tipe yang telah dibentuk.Contoh :Var namahari : HariDlmMgg;

Angka : Bilangan;Huruf : Karakter;

Type pengenal = set of tipe;

TypeTvokal = set of char;

VarVokal : Tvokal;Kar : char;

BeginVokal := [‘A’,’I’,’U’,’E’,’O’];Write (‘Ketik sebuah karakter dan tekan Enter: ‘);Readln (Kar);If Kar in Vokal thenWriteln (‘Huruf Vokal’)

ElseWriteln (‘Huruf Konsonan’);

End.

5

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;

Beginnhari[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 dobeginif i in harikerja thenwrite (nhari[i],' - ');

end;writeln; writeln;writeln ('NAMA HARI LIBUR');for i := senin to minggu dobeginif i in harilibur thenwrite (nhari[i],' - ' );

end;End.

6

Type namarec = recordVar1 : tipe;Var2 : tipe;Varn : tipe;

End;Var nama_var : namarec;

BAB IIRECORD dan ITERASI

A. RECORD

Record adalah kumpulan elemen-elemen dalam pascal dimana setiapelemen dapat memiliki tipe data yang saling berbeda. Cara mengakses recordmirip dengan cara mengakses array, perbedaannya adalah jika pada array untukmengakses dengan cara menyebut nama array disertai dengan nomor indeks, makapada record adalah dengan menyebut nama record disertai dengan nama field(elemen) yang akan diakses.Bentuk umum pendeklarasian record :

Keterangan : namarec : nama record.var1,var2,varn : nama variable pada typenama_var : nama variable untuk tipe namarec.tipe : tipe data.

Bentuk umum pemanggilan record :

Latihan :

Beginnama_var.var1 := . . . .nama_var.var2 := . . . .nama_var.varn := . . . .

With nama_var doBeginvar1 := . . . .var2 := . . . .varn := . . . .

End;End.

Cara pertama

Cara kedua

Type data = recordNo : integer;Nama : string;

End;Var datamhs : data;BeginDatamhs.no := 1;Datamhs.nama := ‘Budi’;

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

End.

7

type matkul = recordid : integer;namamk : string;

end;data = recordnim : string;nama : string;dtmk : matkul;

end;var datamhs : array[1..20] of data;

n,i : integer;Jwb : char;

beginn := 0;Jwb := 'Y';writeln ('Inputkan data Mahasiswa');writeln;while Jwb = 'Y' dobeginn := n + 1;with datamhs[n] dobeginwriteln ('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 dobeginwith datamhs[i] dowriteln

(nim,nama:10,dtmk.id:10,dtmk.namamk:10);end;

end.

8

B. ITERASI

Iterasi merupakan proses pengulangan suatu statemen atau blok statemensebanyak jumlah tertentu yang diberikan. Dalam pascal proses iterasi dapatdilakukan dengan memanfaatkan perintah for … do, repeat … until, while … do.Bentuk umum penulisan :

Keterangan : namavar : nama variable.a : nilai awal perulangan.z : nilai akhir tujuan perulangan.

Latihan :

For namavar := a to z do

Repeat. . . .

until namavar > z;

while namavar <= z do

var n : integer;k : string;

begink := '';for n := 1 to 10 dobegink := k + '*';writeln (k);

end;end.

var n,i : integer;k : string;

begink := '*';i := 5;while i >= 1 dobeginfor n := 1 to i dowrite (k);i := i - 1;writeln;

end;readln;

end.

9

var n : word;

function faktorial(n : word) : word;var i : integer;

xfaktorial : word;beginxfaktorial := n;if n = 0 thenfaktorial := 1

elsebeginfor i := n - 1 downto 1 doxfaktorial := xfaktorial * i;

faktorial := xfaktorial;end;

end;

beginclrscr;write ('Bil. int. positif untuk dicari

faktorialnya : ');readln (n);writeln;writeln ('faktorial dari ',n,' adalah

',faktorial(n));end.

10

BAB IIIREKURSI

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

Dalam prosedur atau fungsi, pemanggilan ke dirinya sendiri bisa berartiproses berulang yang tidak bisa diketahui kapan akan berakhir. Dalam pemakaiansehari-hari, rekursi merupakan teknik pemrograman yang berdayaguna untukdigunakan pada pekerjaan pemrograman dengan mengekspresikannya kedalamsuku-suku dari program lain dengan menambahkan langkah-langkah sejenis.

Contoh bentuk Rekursi :

Karena function memanggil diri sendiri di dalam tubuh functionmengakibatkan proses akan terus berulang sampai pernyataan yang ada didalamblok program itu sendiri terpenuhi.

Function namaFunc (n : integer) : integer;BeginIf n = 0 thennamaFunc := 1

ElsenamaFunc := n * namaFunc(N – 1);

End;

Nama function

Pemanggilan nama function di dalamtubuh sendiri.

var input : integer;function jumgenap (n : integer) : integer;beginif n < 2 thenjumgenap := 0 //pemberian nilai nol untuk n < 2

else if (n mod 2) = 0 thenjumgenap := n + jumgenap(n-1) //penjumlahan bil. genap

elsejumgenap := 0 + jumgenap(n-1); //penjumlahan bil. ganjil

end;beginclrscr;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.

11

function funkalimat (n : integer) : string;var kal : string;beginkal := 'test ';if n = 1 thenfunkalimat := kal

elsefunkalimat := kal + funkalimat(n - 1);

end;beginwriteln (funkalimat(10));readln;

end.

Blokprogramfunction

ProgramUtama

var kalimat : string;procedure karakter(kal : string);var n : integer;beginn := length(kal);writeln (kal[n]);if n >= 1 thenbeginkarakter(copy(kal,1,n-1));

end;end;beginclrscr;writeln ('Pembalik Kalimat Secara Vertikal');writeln ('Masukkan Kalimat : ');readln (kalimat);karakter(kalimat);readln;

end.

12

BAB IVSTACK (TUMPUKAN)

Secara sederhana, tumpukan bisa diartikan sebagai suatu kumpulan datayang seolah-olah ada data yang diletakkan diatas data yang lain. Satu hal yangperlu dingat adalah bahwa kita bisa menambah data, dan mengambil (menghapus)data lewat ujung yang sama, yang disebut sebagai ujung atas tumpukan (top ofstack).

Untuk menjelaskan pengertian diatas kita ambil contoh sebagai berikut.Misalnya kita mempunyai dua buah kotak yang kita tumpukkan, sehingga kotakkita letakkan diatas kotak yang lain. Jika kemudian tumpukan dua buah kotak itukita tambah dengan kotak ketiga, kempat, kelima dan seterusnya, maka akan kitaperoleh sebuah tumpukan kotak, yang terdiri dari N kotak.

Secara sederhana, sebuah tumpukan (stack) dapat digambarkan sepertidiatas. Dari gambar ini kita bisa mengatakan bahwa kotak B ada diatas kotak Adan ada dibawah kotak C. Dari gambar juga ditunjukkan bahwa dalam tumpukkankita hanya bisa menambah atau mengambil sebuah kotak lewat satu ujung, yaituuung bagian atas. Dapat dilihat pula bahwa tumpukan merupakan kumpulan datayang sifatnya dinamis, artinya kita bisa menambah dan mengambil data darinya.

Penggambaran tumpukan juga tidak harus seperti diatas. Kita bisamenggambarkan tumpukan dengan cara lain.

A B C D E F

FEDCBA

A

B

C

D

E

F

atas

atas

menambah

menambah

menghapus

menghapus

13

Dari gambar diatas menunjukkan pengertian bahwa kotak yang terakhirdimasukkan bukan berarti memiliki posisi paling atas, tapi lebih ditekankan padakotak yang paling dekat pada pintu masuk.

Dengan memperhatikan ilustrasi-ilustrasi yang disebutkan maka kita bisamelihat bahwa tumpukan merupakan suatu senarai (list) yang mempunyaipengertian “masuk terakhir keluar pertama” (Last In First Out - LIFO).

Operasi Pada TumpukanAda dua operasi dasar yang bisa kita lakukan pada sebuah tumpukan, yaitu

operasi menambahkan data, atau mempush data, dan operasi menghapus data ataumempop data. Karena ke dalam tumpukan kita bisa mempush data, makatumpukan juga sering disebut dengan pushdown list,

Operasi PushSekarang kita akan menyusun sebuah prosedur untuk operasi push.

Dengan menyajikan tumpukan seperti diatas, maka operasi push dengan mudahkita implementasikan sebagai berikut :

Procedure PUSH (var T : Tumpukan; X : integer);BeginT.Atas := T.Atas + 1;T.Isi[T.Atas] ;= x;

End;

Prosedur diatas akan menyiapkan tempat untuk x yang akan dipush kedalam tumpukan, yaitu dengan menambah nilai medan T.Atas dengan 1 dankemudian 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 (melebihibatas maximum). Dengan demikian perlu ada penambahan untuk mengatasioverflow tersebut, agar presedur selalu mengecek keadaan lokasi (T.Isi)sebelum suatu data dipush, apakah MaxElemen sudah tercapai atau belum, jikabelum tercapai maka operasi push akan dilakukan, tetapi bila sudah mencapaiMaxElemen operasi push akan ditolak.

Bentuk perubahan prosedurnya adalah :Prosedure PUSH (var T : Tumpukan; X : integer);BeginIf T.Atas = MaxElemen thenWriteln (‘TUMPUKAN SUDAH PENUH’)

ElseBeginT.Atas := T.Atas + 1;T.Isi[T.Atas] := X;

End;End;

14

Operasi PopOperasi Pop adalah operasi untuk menghapus elemen yang terletak pada

posisi paling atas dari sebuah tumpukan. Sama halnya dengan operasi push, makadengan deklarasi tumpukan seperti diatas, prosedur untuk operasi pop bisa denganmudah kita implementasikan sebagai berikut :

Procedure POP (var T : tumpukan);BeginT.Atas := T.Atas – 1;

End;

Prosedur diatas juga masih sangat sempurna, dan belum dapat digunakanuntuk operasi pop, namun sudah mencakup pengertian dari pop. Hal yang terjadibila kita menggunakan prosedur diatas adalah bila data dalam larik sudah kosong,karena adalah hal yang tidak mungkin melakukan operasi pop bila data sudahkosong. Maka perlu ada tambahan pada procedure untuk mengecek keberadaandata dalam antrian, jika data masih ada maka dapat dilakukan operasi pop, namunbila sebaliknya akan ditolak.Penambahan dari prosedur pop adalah :

Procedure POP (var T : Tumpukan);BeginIf T.Atas = 0 thenWriteln (‘TUMPUKAN SUDAH KOSONG’)

ElseT.Atas := T.Atas – 1;

End;

15

Contoh Pemakaian Tumpukan Dalam ProgramUntuk lebih memahami operasi yang terjadi pada tumpukan, berikut

disajikan contoh program yang menggunakan metode tumpukan untuk membalikkalimat. Dalam hal ini yang dibalik adalah seluruh kalimat dan bukan perkata.

program Balik_Kalimat;uses wincrt;const Elemen = 255;type s255 = string[Elemen];

tumpukan = recordisi : s255;atas : 0..Elemen;

end;var t : tumpukan;

i : integer;kalimat : s255;

procedure awalan (var t : tumpukan);begin

t.atas := 0;end;

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

t.atas := t.atas + 1;t.isi[t.atas] := x;

end;

function pop (var t : tumpukan) : char;begin

pop := t.isi[t.atas];t.atas := t.atas - 1;

end;

{ Program Utama }Begin

clrscr;awalan(t);writeln ('Tumpukan untuk membalik kalimat');writeln ('*******************************');writeln;write (‘Ketik kalimat : '); readln (kalimat);clrscr;writeln ('Kalimat asli : ',kalimat);writeln;writeln ('Setelah operasi push dan pop');

for i := 1 to length(kalimat) dopush(t, kalimat[i]);

for i := 1 to length(kalimat) dowrite (pop(t));

readln;End.

Batas maximumkarakter.

Nama tumpukan

pencacahKalimat yang dibalik

Inisialisasitumpukan

Prosedure untukmemasukkan elemenke dalam tumpukan

Fungsi untukmengambil elemendari tumpukan

Kalimat yang akandibalik

Mempush kalimat kedalam tumpukan

Mempop isi tumpukansehingga terlihatkalimat yg terbalik

16

Hasil eksekusi dari contoh progam :Tumpukan untuk membalik kalimat*******************************Ketik kalimat : Budi

Kalimat asli : BudiSetelah operasi push dan pop

program Balik_Kalimat;uses wincrt;const Elemen = 255;type s255 = string[Elemen];

tumpukan = recordisi : s255;atas : 0..Elemen;

end;var t : tumpukan;

i : integer;kalimat : s255;

procedure awalan (var t : tumpukan);begin

t.atas := 0;end;

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

t.atas := t.atas + 1;t.isi[t.atas] := x;

end;

function pop (var t : tumpukan) : char;begin

pop := t.isi[t.atas];t.atas := t.atas - 1;

end;

{ Program Utama }Begin

clrscr;awalan(t);writeln ('Tumpukan untuk membalik kalimat');writeln ('*******************************');writeln;write (‘Ketik kalimat : '); readln (kalimat);clrscr;writeln ('Kalimat asli : ',kalimat);writeln;writeln ('Setelah operasi push dan pop');

for i := 1 to length(kalimat) dopush(t, kalimat[i]);

for i := 1 to length(kalimat) dowrite (pop(t));

readln;End.

Batas maximumkarakter.

Nama tumpukanpencacahKalimat yang dibalik

Inisialisasitumpukan

Prosedure untukmemasukkan elemenke dalam tumpukan

Fungsi untukmengambil elemendari tumpukan

Kalimat yang akandibalik

Mempush kalimat ke dalamtumpukan

Mempop isi tumpukansehingga terlihatkalimat yg terbalik

17

iduB

Ilustrasi cara kerja contoh program :

i

d

u

B

Penjelasan : Misalkan kalimat yang diinput adalah Budi, maka urutan karakteryang di push (dimasukkan) adalah B – u – d – i , makatampak 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 adalahkarakter i – d – u – B.

Bi

BudiiduB

Kalimat yang di input

Kalimat hasil keluaranYang terbalik

Karakter yang pertama dipush (dumasukkan).

Karakter yang pertama dipop (dikelurkan).

18

BAB VPOINTER

Pemakaian array tidak selalu tepat untuk program-program terapandikarenakan kebutuhan memory yang selalu bertambah selama programdijalankan. Untuk megatasi hal ini diperlukan struktur data yang dapatmengalokasikan dan mendealokasi memori secara dinamis sesuai dengankebutuhan program saat dijalankan.

Nama variabel yang digunakan untuk mewakili suatu nilai data,sebenarnya merupakan atau menunjukkan suatu lokasi tertentu didalam memorikomputer dimana data tersebut disimpan. Pada saat sebuah program dikopolasi,kompiler akan memriksa bagian deklarasivariabeluntuk mengetahui nama-namavariabel apa saja yang digunakan, sekaligus mengalokasikan atau menyediakantempat dalam pengingat untuk menyimpan nilai data tersebut. Dari sini kita bisamelihat bahwa sebelum program dieksekusi (harap dibedakan antara kompilasidan eksekusi program), lokasi-lokasi data dalam pengingat sudah ditentukan dantidak bisa diubah selama program tersebut di eksekusi. Perubah-perubah yangdemikian ini dinamakan dengan perubah statis (static variabel).

Dari pengertian ini bisa kita perhatikan bahwa sesudah suatu lokasipengingat ditentukan untuk suatu nama variabel, maka dalam program tersebutvariabel yang dimaksud akan tetap menempati lokasi yang telah ditentukan dantidak mungkin berubah.. Dengan demikian dapat dikatakan bahwa banyaknya datayang bisa diolah adalah terbatas. Sebagai contoh, misalnya kita mempunyaivariabel 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, eksekusiprogram akan terhenti karena deklarasinya kurang. Sebaliknya jika ternyata datayang disimpan sedikit jumlahnya, akan mengakibatkan pemborosan pemakaianmemori yang tidak perlu.

Untuk megatasi hal ini maka dibuatlah suatu variabel dinamis yang dapatdialokasi dan didialokasikan sehingga jumlah penggunaan memori dapat sesuaikebutuhan saat program dijalankan. Variabel dinamik (dynamic variabel) adalahvariabel yang dialokasikan hanya pada saat program dijalankan. Pada saatdikompilasi, lokasi variabel ini belum ditentukan, kompiler hanya mencatatbahwa ada variabel yang akan diperlakukan secara dinamis.

Pada variabel statis, isi memori pada lokasi tertentu adalah datasesungguhnya yang akan diolah. Pada variabel dinamis, nilai variabel adalahalamat lokasi yang menyimpan data sesungguhnya.Untuk memperjelas pengertian tentang Pointer perhatikan ilustrasi berikut :

Pada ilustrasi diatas terdapat 2 gambar a dan b. Gambar a mengilustrasikanvariabel A dengan variabel statis. Dalam hal ini 1000 adalah nilai data yangsesungguhnya dan disimpan pada variabel A. Sedangkan pada gambar bmengilustrasikan variabel B yang dinamis. Nilai variabel b dimisalkan adalah 5,

1000A 5 1000B 5

a. b.

19

nilai ini bukan data yang sesungguhnya, tetapi lokasi yang menyimpan datasesungguhnya berada. Jadi dalam hal ini nilai data yang sesungguhnya tersimpanberada pada lokasi 5 didalam memori.

Dari ilustrasi diatas bisa dilihat bahwa nilai variabel dinamis akandigunakan untuk menunjuk kelokasi lain yang berisi data sesungguhnya yangakan diproses. Karena alasan inilah variabel dinamis lebih dikenal dengan sebutanpointer yang artinya kira-kira menunjuk ke sesuatu. Dalam variabel dinamis nilaidata yang ditunjuk oleh suatu pointer biasanya disebut sebagai simpul/node.Bentuk umum deklarasi pointer :

Tanda ^ (ceret) didepan nama simpul menunjukkan bahwa variabeltersebut 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 = recordNama : string[25];Nomor : string[10];Alamat : string[25];

End;Var mhs1,mhs2 : dataMhs;

Variabel mhs1 dan mhs2 masing-masing bertipe pointer. Ketikaprogram dikompilasi, kedua variabel ini akan menempati lokasi memori tertentu,tetapi belum menunjuk kesuatu simpul (lokasi memori) yang berisi data. Pointeryang 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 lebihdulu diikuti dengan tanda ceret. Contoh :

Mhs1^.nama := ‘Alung’;Mhs2.alamat := ‘Jln. BimaSakti’;

Pemakaian alokasi memori dinamik sangat banyak digunakan olehprogram. Program-program grafik akan mengalokasikan sejumlah memori untukmenyimpan gambar yang terdapat pada layar. Program yang menggunakan popupdan pulldown menu juga memanfaatkan alokasi memori dinamik. Bagian layaryang ditutupi oleh menu disimpan dibagian memori yang telah dialokasikan.Setelah menu tidak digunakan, bagian yang ditutupi dikembalikan lagi. Karena

Type variabel = ^simpul;simpul = TipeData;

20

tidak digunakan, bagian bagian memori yang telah dialokasikan tersebutdikembalikan (dealokasi) ke sistem untuk menghemat pemakaian memori.

Latihan :

type n = ^integer;var k : n;

i : integer;begini := 20;clrscr;writeln (k^);new (k);k^ := i;writeln (k^);readln;

end.

type point = ^data;data = recordnama : string;alamat : string;

end;var dt1,dt2 : point;beginclrscr;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.

21

BAB VILINKED LIST ( SENARAI BERANTAI )

A. Single Linked List.

Salah satu struktur data dinamis yang paling sederhana adalah SenaraiBerantai (Linked List), atau senarai satu arah. Senarai Berantai sendiri punyamakna sebagai kumpulan komponen yang disusun secara berurutan denganmenggunakan bantuan pointer. Komponen-komponen yang tersusun tersebut akandisebut sebagai simpul, sehingga pada senarai akan terdapat banyak simpul, dantiap simpulnya dapat dibagi menjadi dua bagian. Bagian pertama dari simpuldisebut dengan medan informasi, yang berisi informasi/data yang fapat beruparecord yanag akan diolah. Sedangkan bagian yang kedua disebut sebagai medanpenyambung (link field), yang berisi alamat simpul berikutnya.

Untuk memudahkan setiap pembahasan selanjutnya, maka akan kitatetapkan untuk sebelah kiri simpul disebut sebagai medan informasi dan sebelahkanan simpul disebut sebagai medan penyambung. Perlu diketahui bahwa medanpenyambung sebenarnya adalah suatu pointer yang akan menunjuk ke simpulberikutnya, sehingga nilai dari medan ini dapat berupa alamat lokasi simpulberikutnya ataupun dapat bernilai nil. Perlu diingat bahwa setiap simpul terakhirdari linked list medan penyambung harus bernilai nil.

Contoh dari senarai berantai dengan 5 simpul :

Tampak dari gambar bahwa medan penyambung menunjuk ke simpulberikutnya, dan medan penyambung pada simpul terakhir akan bernilai nil karenamedan penyambung tersebut tidak menunjuk kemanapun. Pada senarai berantai

A B C D E

Medan informasi Medan penyambungyg menunjuk kesimpul berikutnya

Medan penyambungyg bernilai nil

awal Pointer yg menunjuk ke awal senarai akhirPointer yg menunjuk ke akhir senarai

simpul

Medaninformasi

Medanpenyambung

simpul^.medan_informasi simpul^.medan_penyambung

22

juga terdapat 2 buah pointer awal dan akhir, kedua pointer ini berfungsi untukmempermudah dalam melakukan operasi pengolahan data pada senarai berantai,seperti : pembacaan, pencarian, pengeditan, serta penghapusan data, pengertiankedua pointer ini mungkin akan lebih jelas pada pembahasan selanjutnya.Bentuk umum pendeklarasian single linked list :

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

nmrecord : nama record yang berisi variabel penyimpan data danberisi medan penyambung.

nmvar1 : variabel yang akan berfungsi sebagai penyimpan datanmvarn : variabel yang berfungsi sebeagai media penyambung.

Contoh penulisan Single Linked List :Type simpul = ^data;

data = recordinfo : 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 yangberfungsi untuk menambah dan menampilkan data menggunakan linked list.

Type nmlist = ^nmrecord;

nmrecord = record;

nmvar1 : tipe;

nmvarn : nmlist;

end;

Var node : list;

Medan penghubung ygbertipe data pointe.

23

Program diatas pertama kali setelah pendeklarasian simpul adalahmelakukan pemberian nilai nil terhadap variabel awal, karena pada saatprogram pertama dijalankan data belum ada sehingga variabel awal belummenunjuk kesuatu tempat. Tampak pada program terdapat 3 proses, demikianilustrasi ke 3 proses tersebut :Proses 1 : Proses untuk memberikan nilai pada variabel awal dan akhir saatpertama penginputan data.

program SingleLinkedList;uses wincrt;type simpul = ^data;

data = recordnama : string[25];kait : simpul;

end;var awal,akhir,bantu : simpul;

ya : char;begin

clrscr;awal := nil;ya := 'y';while ya in ['y','Y'] dobegin

new (bantu);write ('Masukkan Nama : ');readln (bantu^.nama);write ('Tambah data lagi [Y/N]: ?');readln (ya);writeln;if awal = nil thenbegin

bantu^.kait := nil;awal := bantu;akhir := bantu;

endelsebegin

akhir^.kait := bantu;bantu^.kait := nil;akhir := bantu;

end;end;bantu := awal;writeln (bantu^.nama);while bantu^.kait <> nil dobegin

bantu := bantu^.kait;writeln (bantu^.nama);

end;readln;

end.

Deklarasi simpul

Proses 1:Proses yg dilakukan saatpenginputan data yang pertama

Proses 2 :Proses penambahan dataselanjutnya.

Proses 3 :Proses untuk menampilkan data

Pembuatan nilai awal= nil, padasaat program pertama dijalankan

c.

awal akhir

a. b.

bantu bantu

24

Tampak bahwa medan penyambung dari bantu (bantu^.kait) dibuat nilainyanil 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.

Pada gambar a simpul bantu baru dibentuk. Gambar b menjelaskan akhirakan menunjuk ke bantu yang baru. Gambar c menjelaskan peberian nilai nilkepada 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. Perludiingat bahwa dalam linked list terdapat peraturan-peraturan sebagai berikut :

1. awal akan selalu menunjuk ke awal linked list, dan akhir akan selalumenunjuk ke akhir linked list, sekalipun penambahan data dilakukan.

2. Setiap simpul yang terakhir dari linked list nilai dari medan penyambungharus selalu bernilai nil.

Proses 3 : Pada proses ini bantu akan membaca simpul dan menampilkan hasilnyadari 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 padacontoh program Proses 2.

2. Menambah simpul di depan.Ilustrasi :

b.

c.

awal akhir awal akhir

awal akhir

a.

Niliai nil

bantu bantu

awal akhir

awal akhir

awal akhir

bantu

bantu

a.

b.

c.

Simpul baru

bantu^.kait := awal

awal := bantu

25

Bentuk penulisan dalam bentuk program :new(bantu);bantu^.nama := ‘Alung’;bantu^.kait := awal;awal := bantu;

3. Menambah simpul di tengah.Ilustrasi :

Bentuk penulisan dalam bentuk program :new(bantu);bantu^.nama := ‘Alung’;bantu^.kait := bantu2^.kait;bantu2^.kait := bantu;

awal akhir

a.

bantu

bantu

awal akhirbantu2

b.

awal akhirbantu2

c.

Simpul baru

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

bantu2^.kait := bantu

26

4. Menghapus simpul di awal.Ilustrasi :

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

5. Menghapus simpul di tengah.Ilustrasi :

awal akhirbantu

a.

awal akhirbantu

b.

awal akhir

c.

bantu := awal

awal := bantu^.kait

bantu

dispose(bantu)

awal akhirbantubantu2

a.

awal akhirbantubantu2

b.

bantu2^.kait := bantu

bantu2^.kait := bantu^.kait

awal akhirbantu2

c.

dispose(bantu)

27

Bentuk penulisan dalam bentuk program :While (bantu^.kait<>nil) or (bantu^.nama<>‘Budi’) dobantu := bantu^.kait;

If (bantu <> nil) thenBeginbantu2^.kait := bantu;bantu2^.kait := bantu^.kait;dispose(bantu);

End;

6. Menghapus simpul di akhir.Ilustrasi :

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 dapatmenunjuk kedapan atau kebelakang. Hal ini akan mempermudah pembacaan (bisadilakukan dari kiri ke kanan atau sebalinya), penambahan simpul baru ataupenghapusan simpul bisa dilaksanakan untuk simpul-simpul yang terletakdisebelah kiri atau kanan dari pointer yang diketahui.

a.

akhirawal bantu

bantu := akhir

akhirawal bantu

b.

akhir^.kait := bantu

awal akhir

c.

dispose(bantu)

akhir^.kait := nil

simpul

simpul^.depansimpul^.belakang

28

Contoh pendeklarasian Double Linked List :Type simpul = ^data;

data = recordnama : 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 danbelakang. Hal inilah yang mengakibatkan Senarai Berantai tersebut disebutsebagai Double Linked List. Pada deklarasi di atas pointer blakang adalahpointer untuk menunjuk ke simpul sebelumnya, atau simpul sebelah kiri, pointerdepan adalah pointer untuk menunjuk ke simpul sesudahnya atau simpul sebelahkanan.Operasi pada Senarai Berantai Ganda (Double Linked List).1. Menambah Data

Ilustrasi :

Bentuk penulisan dalam bentuk program :akhir^.depan := baru;baru^.belakang := akhir;baru^.depan := nil;akhir := baru;

Anil

B Cnil

D

awal akhir baru

a.

Simpul baru

Anil

B C D

awal akhir baru

b.

akhir^.depan:=baru;baru^.belakang:=akhir

Anil

B C Dnil

awal akhir baru

c.baru^.belakang := nil

akhir := baru;

29

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

Penulisan dalam bentuk program :bantu := awal;While bantu <> nil doBeginWriteln (‘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 darisimpul yang dilewati.

Membaca dari depan :

Penulisan dalam bentuk program :bantu := akhir;While bantu <> nil doBeginWriteln (‘nama : ‘,bantu^.nama);bantu := bantu^.belakang;

End;

Perintah-perintah di atas adalah untuk menjalankan pointer bantu dariakhir hingga ke awal senarai, serta menampilkan isi dari variabel namapada setiap simpul yang dilewatinya.

bantu bantu

Anil

B C Dnil

awal akhir

a.

bantu bantu

Anil

B C Dnil

awal akhir

a.

30

Contoh Program :program doule_linked_list;uses wincrt;type simpul = ^data;

data = recordnama : string;depan,belakang : simpul;

end;var awal,akhir,bantu : simpul;

pil : char;procedure buatlist (var bantu : simpul);begin

if awal = nil thenbegin

awal := bantu;awal^.depan := nil;awal^.belakang := nil;akhir := awal;

endelsebegin

akhir^.depan := bantu;bantu^.depan := nil;bantu^.belakang := akhir;akhir := bantu;

end;end;procedure cetakawal;var bantu : simpul;begin

clrscr;writeln ('Cetak Data Dari Awal');bantu := awal;while bantu <> nil dobegin

writeln ('Nama : ',bantu^.nama);bantu := bantu^.depan;

end;readln;

end;

Deklarasi simpul double linkedlist.

Penambahan data/simpul yangpertama

Penambahan data/simpul untuk ke-sekian kali.

Perintah untuk mencetak datadari awal.

Procedure untuk menambahdata

Procedure untuk mencetak data dari awallist.

31

procedure cetakakhir;var bantu : simpul;begin

clrscr;writeln ('Cetak Data Dari Akhir');bantu := akhir;while bantu <> nil dobegin

writeln ('Nama : ',bantu^.nama);bantu := bantu^.belakang;

end;readln;

end;procedure hapuslist;var bantu : simpul;begin

clrscr;while awal <> nil dobegin

bantu := awal;awal := awal^.depan;dispose(bantu);

end;writeln ('Data telah dihapus');readln;

end;Begin

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' : beginclrscr;new(bantu);writeln ('Tambah Data');write ('Masukkan Nama : ');readln (bantu^.nama);buatlist(bantu);

end;'2' : cetakawal;'3' : cetakakhir;'4' : hapuslist;

end;until (pil >= '5');readln;

End.

Perintah untuk mencetak datadari akhir.

Perintah untuk menghapus data dari awallist.

Perintah untuk menambahdata dan memanggilprocedure buatlist.

Procedure untuk mencetak data dari akhirlist

Procedure untuk menghapus seluruh datadari awal.

Awal program utama

Pemanggilan procedure cetakawalPemanggilan procedure cetakakhirPemanggilan procedure hapuslist

32

BAB VIIANTRIAN (QUEUE)

Antrian adalah suatu kumpulan data yang mana penambahan elemenhanya bisa dilakukan pada suatu ujung (belakang/rear), dan penghapusandilakukan lewat ujung lainnya (depan/front). Sebagai contoh dapat kita ibaratkandengan antrian membeli karcis di sebuah bioskop, para pengantri yang inginmembeli karcis hanya masuk ke antrian melalui satu pintu saja, demikian bagiyang telah selesai membeli karcis akan keluar melalui satu pintu/ujung yang lain.

Seperti pada Stack/Tumpukan yang mengenal istilah masuk terakhirkeluar pertama (LIFO – Last In First Out). Berbeda dengan Antrian yangmengenal istilah masuk pertama keluar pertama (FIFO – Fisrt In First Out)Ilustrasi Antrian :

Hal yang perlu diingat pada operasi Antrian adalah bahwa setiappenambahan data akan selalu dilakukan dari belakang, danpengurangan/penghapusan data akan selalu dilakukan dari depan. Sehinggaberdasarkan gambar bila ingin menambahkan suatu data harus diletakkan padabagian sebelah kanan F, dan bila akan menghapus suatu data, maka akandilakukan pada bagian sebelah kiri, dalam hal ini A.

Antrian dapat disajikan dalam bentuk larik/array. Berikut contohpendeklarasian Antrian dengan array.

Type antri = array[1..100] of integer;Var antrian : antri;

depan,belakang : integer;Pada deklarasi diatas, elemen antrian dinyatakan dalam tipe integer.

Variabel depan menunjukkan posisi elemen pertama dalam larik, variabelbelakang menunjukkan posisi elemen terakhir dalam larik.

Dalam suatu permasalahan saat antrian sudah penuh, sementara kita masihingin terus menambahan data lagi, maka akan terjadi offerflow (kelbihankapasitas). Dengan mengabaikan akan terjadinya offerflow, maka penambahandata pada antrian dalam bentuk programnnya adalah sebagai berikut :

Belakang := belakang + 1;Antrian[belakang] := x; {x : variabel untuk mengisi antrian}

Ilustrasi :

A B C D E Fkeluar masuk

depan

belakang

1 2 3 4 5 6

A.

depan = 1

belakang = 0

33

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

Pada saat dilakukan penambahan data maka belakang akan dijumlahkandengan 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;

Pada saat dilakukan pengurangan data maka x akan diisi nilainya dengankedudukan depan saat itu, kemudian depan dimajukan sebanyak 1 (depan +1).

Dengan keadaan seperti diatas tentu saja dapat terjadi suatu keadaandimana penambahan elemen baru tidak dapat dilakukan, misalnya karena nilaibelakang sudah mencapai nilai maksimal akan tetapi antrian yangsesungguhnya masih banyak yang kosong karena nilai depan lebih besar dari 1,seperti pada gambar di atas.

Kemungkinan penyelesaian yang dapat dilakukan adalah denganmenggeser elemen-elemen lain maju ke depan jika ada elemen yang keluar(dihapus) seperti antrian manusia yang membeli karcis pada umumnya.

Akan tetapi hal ini akan sangat tidak efisien dilakukan pada elemn array, kalujumlah elemen array yang sedikit mungkin tidak terlalu jadi masalah, tetapi akanjadi masalah bila elemen array-nya sampai sebanyak seratus bahkan ribuanelemen, data akan dipindahkan satu-persatu sebanyak seribu elemen, hal ini akanmemperlambat kinerja komputer.

A B C D

1 2 3 4 5 6

B.

depan = 1

belakang = 4

C D E F

1 2 3 4 5 6

depan = 3

belakang = 6

C D E F

1 2 3 4 5 6

depan belakang

C D E F

1 2 3 4 5 6

depan belakang

34

Cara yang paling baik untuk memecahkan masalah ini adalah denganmenyimpan elemen larik seolah-olah larik berbentuk lingkaran.

Elemen baru selalu dapat ditambahkan selama masih ada tempat kosong (terdapattempat kosong antara belakang dan depan).

Pada kenyataan yang sebenarnya larik tidak benar-benar memutarmelainkan masih seperti biasa yang memiliki ujung, namun perlakuannya didalam penulisan program dibuat seakan-akan melingkar/memutar.

Berikut adalah ilustrasi serta penulisan program untuk operasi pada antrianyang dibuat seakan-akan memutar :

XC D

Edepan belakang

E

D

C

6

5

4

3

2

1

depan=4

belakang=6 Pada keadaan awal antrian disi dengan dua elemen :belakang := 6;depan := 4;

E

D

C

F

6

5

4

3

2

1

depan=4

belakang=1

Hal berikut adalah proses penambahan elemen, karenamasih ada tempat yang kosong (perlu diingat antriandiperlakukan sebagai lingkaran).

if belakang = maximal thenbelakang := 1

elsebelakang := belakang + 1;

E

D

F

6

5

4

3

2

1

depan=5

belakang=1

Hal berikut menjelaskan proses penghapusan data,selama masih data belum kosong :

X := antrian[depan];If depan = maximal then

Depan := 1;Else

Depan := depan + 1;

35

Contoh program :

program antrian_;uses wincrt;const maximum = 10;type antri = array[1..maximum] of char;var antrian : antri;

depan,belakang,pilih : integer;elemen : char;

function Kosong(Q : antri) : boolean;begin

Kosong := (depan = belakang);end;procedure tambah(var antrian : antri; x : char);begin

if belakang = maximum thenbelakang := 1

elsebelakang := belakang + 1;

if not(Kosong(antrian)) thenbegin

antrian[belakang] := x;write (x);

endelsebegin

write ('Antrian Sudah Penuh');repeat{ }

until keypressed;belakang := belakang - 1;if belakang = 0 then

belakang := maximum;end;

end;

Pembuatan array untukantrian

Function untuk mencek isi antrianJika depan = belakang, berartiantrian sedang kosong

Jika belakang berada pada posisi antrianteratas, maka belakang dipindah ke 1

Jika tidak berada diatas makabelakang dinaikkan 1

Jika antrian tidak kosong maka, antrianditambah dengan nilai x pada posisibelakang

Pengembalian posisi belakang ke tempatsebelumnya saat antrian sudah penuh dantidak dapat ditambah lagi.

36

Program diatas tidak akan menampilkan data yang telah diinput, sehinggauntuk pengujiannya adalah dengan cara : Inputkanlah data sebanyak tiga kalidengan memilih menu 1, kemudian hapuslah data tersebut dengan memilih menu2 sebanyak tiga kali. Jika ada pesan : “Antrian Kosong”, berarti program andasudah benar. Hal ini disebabkan data yang kita masukkan sebanyak 3 buah, akandihapus dari antrian, sehingga pada penghapusan yang keempat ditampilkansebuah pesan.

function Hapus(var antrian : antri) : char;begin

if depan = maximum thendepan := 1

elsebegin

depan := depan + 1;Hapus := antrian[depan];

end;end;Begin

clrscr;depan := 0;belakang := 0;repeat

clrscr;writeln ('Daftar Menu Pilihan');writeln ('-------------------');writeln ('1. Menambah Elemen');writeln ('2. Menghapus Elemen');writeln ('3. Selesai');write ('Pilih Salah Satu : ');readln (pilih);case pilih of

1 : beginwriteln ('Menambah Elemen');writeln ('---------------');write ('Isikan Elemennya : ');readln (elemen);tambah (antrian,elemen);

end;2 : begin

if not(Kosong(antrian)) thenelemen := hapus(antrian)

elsebegin

writeln ('Antrian Kosong');elemen := readkey;

end;end;

end;until pilih = 3

End.

Function untukmenghapus elemen

Untuk memindahkan depan ke 1 saat depanberada di posisi maximum.

Memindahkan depan sebanyak 1 elemen,dan menghapus elemen.

Awal program utama

Penempatan posisi depan dan belakang di posisi 0 saat awalprogram dimulai.

Pemanggilan procedure tambahsaat menambah elemen

Pengecekan isi antrian saat akanmenghapus elemen. Jika antriantidak kosong maka data akandihapus, sebaliknya jika antriankosong akan ada pesan ‘AntrianKosong’.

37

Implementasi Antrian Dengan Pointer.Kita telah mempelajari bagaimana membuat antrian dengan menggunakan

array. Dari pelajaran tersebut kita dapat mengetahui bahwa dengan menggunakanarray, antrian punya beberapa kekurangan antara lain : jumlah elemen antriansangat dibatasi oleh elemen array, sehingga tidak memungkinkan bila inginmemproses data yang sangat banyak dan belum dapat di ketahui jumlahmaximalnya. Sehingga dalam hal ini diperlukan bantuan pointer untukmenerapkan pembuatan antrian.

Dengan menggunakan pointer maka jumlah data yang dapat di inputkan keantrian bisa sangat banyak. Penerapan pointer dalam antrian hampir sama dengansenarai berantai, sehingga bila anda sudah memahami senarai berantai maka tidaksulit untuk memahami antrian dengan pointer.Berikut implementasi antrian dengan pointer menggunakan ilustrasi :1. Inisialisasi

2. Penambahan di belakang (masuk ke dalam antrian).

kepala ekorNew(kepala);kepala^.info := chr(0);kepala^.kait := kepala;ekor := kepala

kepala ekor baru

kepala ekor baru

Penambahan antriandengan data baru

baru^.kait := kepala

kepala ekor baru

ekor^.kait := baru

ekor := baru

kepala ekor

38

3. Penghapusan di depan (Keluar dari antrian).

kepala ekorbantu

bantu := kepalabantu ekorkepala

kepala := bantu^.kait

ekor^.kait := kepala

bantu ekorkepala

dispose(bantu)

ekorkepala

39

BAB VIIISORT

Pengurutan data (sorting) secara umum dapat didefinisikan sebagai suatuproses untuk menyusun kembali himpunan objek menggunakan aturan-aturantertentu. Berdasarkan cara pengurutan dapat dibedakan menjadi dua bagian, yangpertama adalah pengurutan secara urut naik (ascending), yaitu data diurutkanmulai dari yang terkecil hingga yang terbesar, yang kedua adalah pengurutansecara urut turun (descending), yaitu pengurutan dari data yang besar hingga kedata yang paling kecil.

Pengurutan merupakan suatu hal yang penting sekali dalam ilmukomputer, praktik-praktik yang sering menggunakan pengurutan biasanya seringterjadi dalam operasi basis data, dimana pengurutan data sangat dibutuhkan untukmemudahkan dalam pencarian data yang diinginkan dari sekian banyak data yangtersimpan.

Untuk melakukan proses pengurutan data pada saat ini telah banyakdikembangkan methode-methode untuk lebih mengefisienkan pengurutan data,diantara methode-methode itu adalah dengan cara : Methode PenyisipanLangsung, Penyisipan Biner, Methode Seleksi, Methode Gelembung, MethodeShellShort, Methode QuickShort, dan masih ada beberapa methode lagi.

Dari banyaknya methode yang dapat melakukan pengurutan ini, makadisinilah kita dituntut untuk dapat memilih methode yang sesuai dengan apa yangsedang kita kerjakan dengan memikirkan efisiensinya. Hal yang palingberpengaruh dalam pemilihan methode adalah dilihat dari segi banyaknya datayang akan diurut, dan dari segi lama waktu yang dibutuhkan untuk mengurutkandata.

Karena banyaknya methode yang dapat dilakukan untuk mengurutkandata, maka untuk pembahasan ini kita hanya akan membahas pengurutan datadengan Methode Gelembung (Buble Sort). Namun diharapkan setiap mahasiswajuga mempelajari methode-methode lain.

Pada pembahasan Methode Gelembung, kita akan membahasnya padapengurutan data yang tersimpan pada senarai berantai (single linked list). Berikutlangkah-langkahnya, dengan data dianggap sudah diinputkan :

Langkah 1 :

Langkah pertama adalah dengan memberikan nilai pada pointer A untukmenunjuk pada data awal, dan pointer B menunjuk pada data sesudahnya.Pada saat posisi seperti gambar, nilai pada pointer B akan dibandingkandengan nilai pada pointer A, jika nilai pada B < A, maka nilainya akanditukar (untuk pengurutan ascending).

Langkah 2 :

awal A B

awal A B B

40

Langkah kedua adalah dengan menjalankan pointer B sampai ke ujung darisenarai, dengan catatan setiap kali melewati sebuah simpul, nilainya akanselalu dibandingkan dengan nilai yang ada pada pointer A, jika nilai B <A, maka nilainya akan ditukar.

Langkah 3 :

Langkah ketiga adalah, setelah langkah kedua diatas selesai dilakukan,maka pointer A maju satu simpul, dan pointer B mengambil posisi di depanpointer A, kemudian membandingkan nilai yang ada di pointer B kepointer A.

Langkah 4 :

Langkah keempat adalah sama seperti langkah kedua dengan menjalankanpointer B sampai ke simpul terakhir sambil membandingkan nilainyadengan yang ada dipointer A.Demikian seterusnya sampai pointer A sampai pada ujung senarai berantaiatau simpul terakhir.

awal A B

awal A B B

41

Dari langkah-langkah tersebut diatas maka diperolehlah data yang sudahdiurutkan secara ascending. Untuk memperjelas pengertian tentang pengurutandengan Methode Gelembung (Buble Short), berikut contoh programnya :

program tes_sortir;uses crt;type simpul = ^data;

data = recorddt : char;kait : simpul;

end;var awal,A,B,baru,akhir,bantu : simpul;

huruf : string;i : integer;car : char;

beginclrscr;new(awal);awal := nil;write ('Inputkan karakter : ');readln (huruf);for i := 1 to length(huruf) dobegin

new(baru);baru^.dt := huruf[i];if awal = nil thenbegin

baru^.kait := nil;awal := baru;akhir := awal;

endelsebegin

akhir^.kait := baru;akhir := baru;akhir^.kait := nil;

end;end;

Pendeklarasian simpul untuk senarai berantai

Proses yang dilakukan untukmemasukkan atau menambah datakedalam senarai berantai

42

Program diatas adalah program untuk mengurutkan seluruh karakter yangdimasukkan dari keyboard secara ascending.

A := awal;while not(A = nil) dobegin

B := A^.kait;while not(B = nil) dobegin

if B^.dt < A^.dt thenbegin

car := B^.dt;B^.dt := A^.dt;A^.dt := car;

end;B := B^.kait;

end;A := A^.kait;

end;writeln ('Hasil Pengurutan');bantu := awal;while not(bantu = nil) dobegin

writeln (bantu^.dt);bantu := bantu^.kait;

end;readln

end.

Perintah yang dilakukan untuk mengurutkandata yang terdapat di dalam senarai berantaisecara ascending.

Perintah yang dilakukan untuk menampilkandata yang terdapat pada senarai berantaihasil sortiran/pengurutan.