modul i · web viewilustrasi embaca senarai berantai dari kiri ke kanan dapat dilihat pada gambar...

62
MODUL I TUMPUKAN (STACK) A. MAKSUD DAN TUJUAN 1. MAKSUD Memberikan pemahaman tentang tipe data tumpukan beserta oerasinya. 2. TUJUAN Mahasiswa dapat menggunakan tipe data tumpukan (stack) serta operasi-operasi yang dapat dilakukan dengan tipe data tersebut. B. TEORI Secara sederhana tumpukan bisa diartikan sebagai suatu kumpulan data yang seolah-olah ada data yang diletakkan di atas data lain. Satu hal yang perlu diingat adalah bahwa kita bisa menambahkan (menyisipkan) data, mengambil (menghapus) data lewat ujung yang sama, yang disebut sebagai ujung atas tumpukan (top of stack). Implementasi tumpukan dengan larik Penyajian tumbukan bisa menggunakan larik )array) walaupun penyajian dengan menggunakan larik dianggap kurang tepat karena banyaknya elemen dalam larik sudah tertentu (statis) sedangkan pada tumpukan, banyaknya elemen bisa sangat bervariasi

Upload: votram

Post on 12-May-2019

224 views

Category:

Documents


0 download

TRANSCRIPT

MODUL I

TUMPUKAN (STACK)

A. MAKSUD DAN TUJUAN

1. MAKSUD

Memberikan pemahaman tentang tipe data tumpukan beserta oerasinya.

2. TUJUAN

Mahasiswa dapat menggunakan tipe data tumpukan (stack) serta operasi-

operasi yang dapat dilakukan dengan tipe data tersebut.

B. TEORI

Secara sederhana tumpukan bisa diartikan sebagai suatu kumpulan data

yang seolah-olah ada data yang diletakkan di atas data lain. Satu hal yang

perlu diingat adalah bahwa kita bisa menambahkan (menyisipkan) data,

mengambil (menghapus) data lewat ujung yang sama, yang disebut sebagai

ujung atas tumpukan (top of stack).

Implementasi tumpukan dengan larik

Penyajian tumbukan bisa menggunakan larik )array) walaupun

penyajian dengan menggunakan larik dianggap kurang tepat karena

banyaknya elemen dalam larik sudah tertentu (statis) sedangkan pada

tumpukan, banyaknya elemen bisa sangat bervariasi (dinamis). Meskupun

demikian , larik bisa digunakan dengan anggapan bahwa banyaknya elemen

maksimal dari tumpukan tersebut tidak akan melebihi batas maksimal dari

banyaknya elemen dalam larik.

Deklarasi tumpukan bisa menggunakan tipe data terstruktur yaitu tipe

rekaman (record) yang terdiri dari dua medan. Medan pertama berisi larik

untuk menyimpan elemen tumpukan yang bertipe, sedang medan kedua

bertipe integer untuk mencatat posisi ujung tumpukan, sebagai berikut:

Const max_elemen = 255;

Type tumpukan = record

Isi : array [1..max_elemen] of integer;

Atas : 0..max_elemen;

End;

Var t:tumpukan;

Operasi yang bisa dilakukan pada tumpukan adalah operasi push, dan operasi

pop.

Implementasi prosedur push:

Procedure push(var T:tumpukan; x:integer);

Begin

T.Atas := T.Atas + 1;

T.Isi[T.Atas] := x;

End;

Implementasi prosedur pop:

Procedure pop(var T:tumpukan);

Begin

T.Atas := T.Atas – 1;

End;

C. PRAKTIK

1. Cobalah program di bawah ini, amati untuk beberapa masukan yang

berbeda.

Program pop_push;

Uses crt;

Const elemen = 225; {batas maksmimum karakter}

Type s255 = string [elemen];

Tumpukan = record

Isi : s255;

Atas : 0 ..elemen;

End;

Var t : tumpukan;

W : char;

Kalimat:s255;

I,j : integer;

Procedure awalan(var : 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;

begin {program utama}

clrscr;

{melakukan proses push}

writeln(‘Masukkan kalimat = ‘);

read(kalimat);

for i:=1 to lenght(kalimat) do

push(t, kalimat[i]);

write(‘Elemen yang di-push = ‘,kalimat);

readln;

{melakukan proses pop}

for i:=1 to lenght(kalimat) do

push(t,kalimat[i]);

writeln;

writeln(‘Hasil akhir push dibaca dengan

pop = ‘);

{menampilkan hasil proses pop}

for j:= 1 to lenght(kalimat) do

begin

w:=pop(t);

write(w);

end;

readln;

end.

2. Modifikasi program diatas untuk menambahkan sebuah karakter dalam

tumpukan.

Contoh input : STMIK El Rahma

Tambahan karakter : q

Hasil akhir : q amhaR lE KIMTS

D. TUGAS

1. Pada prosedur push jika ada kondisi nitai T.atas sama dengan

max_elemen dan akan dilakukan operasi push, apa yang terjadi?

Kemudian tambahkan pernyataan pada prosedur push diatas untuk

menghindari kondisi tersebut.

2. Pada prosedur pop jika kondisi t.atas=0 kemudian dilakukan operasi

pop, apa yang terjadi? Kemudian tambahkan pernyataan pada prosedur

pop di atas untuk menghindari kondisi tersebut.

MODUL II

TIPE DATA POINTER

A. MAKSUD DAN TUJUAN

1. MAKSUD

Memberikan pemahaman tentang tipe data pointer beserta operasinya.

2. TUJUAN

Agar mahasiswa dapat menggunakan tipe data pointer dengan

melakukan operasi mengkopi pointer, mengkopi isi simpul, dan

menghapus pointer.

B. TEORI

Sampai saat ini tipe data baik yang sederhana maupun yang tersetruktur.

Struktur dari tipe-tipe tersebut mempunyai keterbatasan, yakni bersifat statis.

Sebagai akibatnya, ukuran dan urutannya sudah pasti. Pada suatu larik,

elemen yang satu mendahului elemen yang lain. Ukurannya sudah pasti, tidak

dapat melebihi ukuran maksimun dari yang sudah dideklarasikan. Kelemahan

lain dari variabel statis adalah ruang memori yang sudah digunakan tidak

dibebaskan.

Pointer merupakan tipe data yang bersifat dinamis yang bisa dipesan jika

diperlukan dan dapat dibebaskan kembali bila sudah tidak digunakan. Struktur

data yang menggunakan variabel dinamis disebut dengan struktur data

dinamis. Variabel dinamis tidak dapat dideklarasian secara langsung seperti

halnya variabel-variabel statik. Variabel dinamis hanya ditunjukkan oleh

variabel khusus yang berisi alamat memori yang digunakan oleh variabel

tersebut. Variabel khusus ini disebut dengan variabel pointer. Suatu tipe data

pointer dideklarasikan dengan menggunakan simbol ^.

Meskipun telah dideklarasikan suatu variabel pointer yang akan

menunjukkan kesuatu tipe data tertentu namun variabel dinamis tidak akan

dialokasikan selama belum ada perintah pengalokasian varibel dinamis.

Begitu pula saat variabel dinamis sudah tidak digunakan lagi.

C. PRAKTIK

1. Cobalah program dibawah ini, amati untuk beberapa masukan yang

berbeda.

Program pointer;

Uses crrt;

Type simpul = ^data;

Data = record

Nama: string;

Alamat: string;

Berikut: simpul;

End;

Var t1,t2,t3,t4,t5,t6 : simpul;

Begin

Clrscr;

New(t1);

New(t2);

New(t3);

New(t4);

New(t5);

New(t6);

T1^.nama := ‘kikir’;

T1.alamat := ‘jogja’;

Writeln;

Writeln(‘ nama : ‘,t1^.nama);

Writeln;

Writeln(‘ alamat : ‘,t1^.alamat);

T2:=t1;

Writeln;

Writeln(‘ nama : ‘,t2^.nama);

Writeln;

Writeln(‘ alamat : ‘,t2^.nama);

End.

Dari program diatas bisa dirinci sebagai berikut:

Operasi mengisi sampul t1

T1^.nama := ‘kikir’;

T1.alamat := ‘jogja’;

Operasi membaca simpul t1

Writeln(‘ nama : ‘,t1^.nama);

Writeln(‘ alamat : ‘,t1^.alamat);

Operasi copy pointer

T2:=t1;

Operasi copy isi sampul

T2^ := t1^

Operasi hapus simpul

Dispose(t1)

2. Isikan simpul t2 dengan data nama Joko dan alamat Solo kemudian

lakukan opeasi kopi pointer

T3 := t1;

T5 := t1;

Dan lakukan operasi kopi isi simpul

T4^ := t2^;

T6^ := t2^;

D. TUGAS

Buatlah program perpustakaan dengan masukan:

Nama buku

Pengarang

nomor indeks

Tampilan berupa

Menu pilihan

T : menambah buku

H : menghapus buku

S : Selesai

Pilih menu?

MODUL III

SENARAI 1

A. MAKSUD DAN TUJUAN

1. MAKSUD

Pengenalan senerai (linked list) dengan opeasi tambah simpul dan opeasi

baca isi simpul.

2. TUJUAN

Agar praktikan bisa membangun suatu senerai (linked list) dengan

melakukan operasi penambahan simpul dan bisa mengakses isi simpul

yang membentuk senerai berantai.

B. TEORI

Disebut senerai berantai karena satu elemen dengan elemen yang lain

bisa dihubungkan satu sama lain dengan bantuan pointer. Dengan demikian,

setiap simpul dalam suatu senerai berantai terbagi menjadi dua bagian. Bagian

pertama, disebut medan informasi, berisi informasi yang akan disimpan dan

diolah. Bagian kedua, disebut medan penyambung (link field), berisi alamat

simpul berikutnya.

Gambar di bawah ini menunjukkan skematis dari senerai berantai

dengan 4 buah simpul. Setiap simpul digambarkan dalam 2 bagian. Bagian

kiri adalah medan informasi. Bagian kanan berupa medan penyambung,

sehingga dalam diagram digambarkan sebagai anak panah. Perlu diingat

bahwa medan penyambung sebenarnya adalah suatu pointer yang menunjuk

ke simpul berikutnya, sehingga nilai dari medan ini adalah alamat suatu lokasi

tertentu dalam pengingat.

Awal

Medan penyampung dari simpulMedan informasi dari simpul

A B C D

Pada gambar di atas, pointer awal menunjuk ke simpul pertama dari senerai

tersebut. Medan penyambung (pointer) dari suatu simpul yang tidak menunjuk

simpul lain disebut pointer kosong, yang nilainya dinyatakan sebagai nil (nil

adalah kata baku Pascal yang berarti bahwa pointer 0 atau bilangan negatif).

Jadi kita bisa melihat bahwa dengan hanya sebuah pointer Awal saja maka

kita bisa membaca semua informasi yang tersimpan dalam senerai.

Menambah simpul

Sekarang kita akan mempelajari bagaimana menambah simpul baru ke dalam

senerai berantai. Kita anggap bahwa simpul baru yang akan ditambah selalu

menempati posisi setelah posisi yang terakhir dari senerai berantai yang

diketahui. Untuk menjelaskan operasi ini baiklah kita gunakan deklarasi

pointer dan simpul seperti di bawah ini:

Type simpul = ^ data;

Data = reecord

Info : char;

Berikut:simpul;

End;

Var elemen : char;

Awal, akhir, baru : simpul;

Ilustrasi penambahan simpul bru di akhir senerai berantai disajikan pada

gambar di bawah ini. Pointer Awal adalah pointer yang menunjuk ke simpul

pertama, pointer Akhir menunjnuk ke simpul terakhir dan yang ditunjuk oleh

pointer baru adalah simpul yang akan ditambah. Dianggap bahwa simpul

awal dan simpul akhir telah terbentuk.

Awal Akhir Baru

A B C D F

Awal Akhir Baru

Awal Akhir

Baru

Untuk menyambung simpul yg ditunjuk oleh akhir dan Baru, pointer pada

simpul yg ditunjuk oleh simpul akhir dibuat sama dengan baru kemudian

pointer akhir dibuat sama dengan pointer baru.

Dengan memperhatikan gambar di atas, maka kita bisa menyusun prosedur

untuk menambah simpul baru dibelakang senarai berantai. Dalam hal ini perlu

pula ditest apakah senarai berantai masih kosong atau tidak. Senarai berantai

yang masih kosong ditandai dengan nilai pointer Awal yang nilainya sama

dengan nil. Berdasarkan deklarasi simpul dan pointer di atas, maka prosedur

untuk menambah simpul di belakang senarai berantai bisa disusun seperti

berikut:

Procedure TAMBAH_BELAKANG (var Awal, Akhir : Simpul;

Elemen : char);

Var baru : simpul;

Begin

New (baru); baru^.info := elemen;

If awal = nil then{senarai masih kosong}

Awal := baru

Else

Akhir^.berikut := baru

Akhir := baru

Akhir^.beriku:=nil

End;

Menambah Simpul di tengah

A B C D F

A B C D F

Untuk menambah simpul baru ditengah, pertama kali ditenukan di

mana simpul baru akan ditambahkan pada poisi urutan simpul yang keberapa.

Hal ini dapat dilakukan dengan menempatkan simpul pointer bantu pada

posisi tertentu. Kemudian pointer yang ditunjuk oleh pointer simpul baru

dibuat sama dengan pada simpul yang ditunjuk oleh simpul bantu, selanjutnya

pointer pada simpul yang ditunjnuk oleh simpul bantu, selalnjutnya pointer

pada simpul yang ditunjuk pada simpul yang ditunjuk oleh simpul bantu

dibuat sama dengan baru. Perhatikan bahwa urutan ini tidak boleh dibalik.

Menghapus simpul

Operasi kedua yang akan dijelaskan adalah operasi menghapus simpul.

Dalam menghapus simpul simpul satu hal yang perlu diperhatikan, yaitu

bahwa simpul yang bisa dihapus adalah simpul yang berada sesuai simpul

yang ditunjuk oleh suatu pointer (dalam gambar adalah simpul yang berada di

sebelah kanan simpul yang ditunjuk oleh suatu pointer), kecuali untuk simpul

pertama. Dengan demikian, kita tidak bisa menghapus simpul yang ditunjuk

oleh suatu pointer atau simpul sebelumnya. Untuk jelasnya perhatikan

ilustrasi pada gambar berikut.

Awal Bantu Akhir

Jika senarai berntai adalah seperti diatas, maka kita hanya bisa menghapus

simpul yang berisi ‘A’ dan simpul yang beisi ‘D’ supaya senarai tetap bisa

dipertahankan. Memang kita bisa menghapus simpul yang berisi ‘C’, tetapi

senarai yang kita miliki akan menjadi terputus, karena akan lebih sulit untuk

menyambung lagi simpul ‘B’ dengan simpul ‘D’.

Untuk menghapus simpul pertama, maka pointer Bantu kita buat sama dengan

pointer Awal. Kemudian pointer Awal kita pindah ke simpul yang ditunjjuk

oleh pointer pada simpul yang ditunjuk oleh pointer Bantu kita dispose.

Adapun prosedur menghapus simpul pertama adalah sebagai berikut:

Procedure Hapus_pertama (var awal : simpul);

A B C D

Var baru : simpul;

Begin

If awal = nil then {senerai masih kosong}

Writeln(‘Senarai masih kosong, tidak mungkin

dihapus’)

Else if awal^.berikut = nil then {senarai berisi

sebuah simpul }

Awal := nil

Else

Beginbantu := awal;

Awal :=bantu^.berikut;

Dispose(bantu);

End;

End;

Untuk menghapus simpul terakhir, tidak bisa dilakukan hanya dengan

mendispose simpul akhir. Karena dengan disposenya simpul akhir, maka

hanya simpul akhir saja yang dihapus, tetapi simpulnya masih tetap bisa

dimasup, karena masih ditunjuk oleh pointer dari simpul di sebeah kirinya.

Sehingga untuk bisa menghapus simpul terakhir, selain simpul akhir kita

hapus, maka pointer dari sebelah kirinya juga harus dijadikan nil.

Membaca Isi Senarai Berantai

Jika kita mempunyai senarai berantai seperti yang kita pelajari, maka dengan

cara biasa kita hanya bisa membaca isi simpul dimulai dari simpul paling kiri

sampai simpul paling kanan (membaca maju). Untuk membaca dari simpul

paling kanan ke simpul paling kiri, harus dilakukan dengan proses rekursif.

Pembacaan senarai berantai secara maju bisa dijelaskan sebagai berikut.

Pertama kali kita atur supaya pointer bantu menunjuk ke simpul yang ditunjuk

oleh pointer awal. Setelah isi simpul tsb dibaca, maka pointer bantu kita

gerakkan ke kanan untuk membaca simpul berikutnya. Proses ini kita ulang

sampai pointer bantu sama dengan pointer akhir. Ilustrasi embaca senarai

berantai dari kiri ke kanan dapat dilihat pada gambar di bawah ini.

Awal Bantu Akhir

C. PRAKTIK{Program tambah dan baca}

program senarai_berantai;

uses crt;

const garis =

‘------------------------------------------‘;

pesan = ‘Senerai berantai masih kosong’;

type simpul = ^data;

data = record

nama,

alamat : string;

berikut : simpul

end;

var awal,

akhir : simpul ;

pilih : char;

cacah : integer;

{fungsi untuk memilih menu}

function menu : char;

var p : char;

begin

clrscr;

gotoxy(30,3); writeln(‘DAFTAR MENU PILIHAN’);

gotoxy(20,8); writeln(‘A. MENAMBAH SIMPUL BARU DI

AWAL SENARAI’);

gotoxy(20,9); writeln(‘B. MENAMBAH SIMPUL BARU DI

AKHIR SENARAI’);

gotoxy(20,10); writeln(‘C. MENCETAK ISI SENARAI’);

gotoxy(20,11); writeln(‘D. SELESAI’);

repeat

gotoxy(48,15); writeln(‘ ’:10);

gotoxy(30,20); writeln(‘PILIH SALAH SATU’);

A B C D

p:= upcase (readkey);

until p in [‘A’ .. ‘D’];

menu :=p

end;

{fungsi alokasi simpul }

function simpul_baru : simpul;

var b : simpul;

begin

new(b);

with b^ do

begin

write(‘Nama :’); readln(nama);

write(‘Alamat : ‘);readln(alamat);

berikut :=nil

end;

simpul_baru:=b

end;

{fungsi tambah simpul baru di awal senarai}

procedure tambah_awal (n:integer);

var baru : simpul;

begin

if n <> o then

begin

writeln(‘menambah simpul baru di awal senarai’);

writeln(copy(garis,1,45))

end;

writeln;

baru:=simpul_baru;

if awal = nil then

akhir :=baru

else baru^.berikut := awal;

awal :=baru;

end;

{fungsi tambah simpul baru di akhir senarai}

procedure tambah_akhir (n:integer);

var baru : simpul;

begin

clrscr;

if n <> o then

begin

writeln(‘Menambah simpul baru di akhir senarai’);

writeln(copy(garis,1,46))

end;

writeln;

baru:=simpul_baru;

if awal = nil then

awal := baru

else

akhir^.berikut := baru

akhir:=baru;

end;

{prosedu baca isi senarai}

procedure baca_senarai;

var bantu:simpul;

i:integer;

begin

i:=1;

writeln(‘Membaca isi senarai’);

writeln(‘teken <enter> untuk kembali ke menu’);

writeln(copy(garis,1,42));

writeln;

if bantu = nil then

writeln(‘Data masih kosong’);

else

bantu := awal;

while bantu <> nil do

begin

writeln(‘simpul : ‘, i:3,’ - nama :

‘,bantu^.nama);

writeln(‘ ‘:17,’ alamat : ‘,bantu^.alamat);

bantu:=bantu^.berikut;

inc(i)

end;

repeat until keypressed

end;

{program utama}

cacah:=0;

awal:=nil;

akhir:=nil;

repeat

pilih:=menu;

clrscr;

case pilih of

‘A’ :tambah_awal(1);

‘B’ : tambah_akhir(1);

‘C’ :baca_senarai;

end;

if pilih in[‘A’,’B’] then inc(cacah)

until pilih = ‘D’

end.

Cobalah dengan simpul berikut:

Nama Alamat

Jeny-1 Solo-1

Jeny-2 Solo-2

Jeny-3 Solo-3

Jeny-4 Solo-4

Jeny-5 Solo-5

D. TUGAS

Pada program diatas tambahlah satu procecdure untuk menambah simpul

ditengah, dengan penambahan simpul baru bisa diatur pada posisi berapa simpul

baru akan diletakkan pada posisi senarai.

MODUL IV

SENARAI II

A. MAKSUD DAN TUJUAN

1. MAKSUD

Pengenalan senarai (linked list) dengan operasi penambahan simpul

baru pada poisi yang dipilih dan penghapusan simpul pada posisi yang

dipilih, operasi pencarian simpul tertentu, dan operasi baca isi simpul

yang membentuk senarai.

2. TUJUAN

Agar praktikan dapat membangun suatu senarai dengan menerapkan

operasi penambahan simpul baru pada posisi yang dipilih dan juga operasi

penghapusan pada posisi simpul yang dikehendaki, operasi pencarian

simpul tertentu, dan dapat memanfaatkan operasi baca dalam rangka

mengakses isi simpul.

B. TEORI

Disebut senerai berantai karena satu elemen dengan elemen yang lain

bisa dihubungkan satu sama lain dengan bantuan pointer. Dengan demikian,

setiap simpul dalam suatu senerai berantai terbagi menjadi dua bagian. Bagian

pertama, disebut medan informasi, berisi informasi yang akan disimpan dan

diolah. Bagian kedua, disebut medan penyambung (link field), berisi alamat

simpul berikutnya.

Gambar di bawah ini menunjukkan skematis dari senerai berantai

dengan 4 buah simpul. Setiap simpul digambarkan dalam 2 bagian. Bagian

kiri adalah medan informasi. Bagian kanan berupa medan penyambung,

sehingga dalam diagram digambarkan sebagai anak panah. Perlu diingat

bahwa medan penyambung sebenarnya adalah suatu pointer yang menunjuk

ke simpul berikutnya, sehingga nilai dari medan ini adalah alamat suatu lokasi

tertentu dalam pengingat.

Awal

Medan penyampung dari simpul

Medan informasi dari simpul

Pada gambar di atas, pointer awal menunjuk ke simpul pertama dari senerai

tersebut. Medan penyambung (pointer) dari suatu simpul yang tidak menunjuk

simpul lain disebut pointer kosong, yang nilainya dinyatakan sebagai nil (nil

adalah kata baku Pascal yang berarti bahwa pointer 0 atau bilangan negatif).

Jadi kita bisa melihat bahwa dengan hanya sebuah pointer Awal saja maka

kita bisa membaca semua informasi yang tersimpan dalam senerai.

Menambah simpul

Sekarang kita akan mempelajari bagaimana menambah simpul baru ke dalam

senerai berantai. Kita anggap bahwa simpul baru yang akan ditambah selalu

menempati posisi setelah posisi yang terakhir dari senerai berantai yang

diketahui. Untuk menjelaskan operasi ini baiklah kita gunakan deklarasi

pointer dan simpul seperti di bawah ini:

Type simpul = ^ data;

Data = reecord

Info : char;

Berikut:simpul;

End;

Var elemen : char;

Awal, akhir, baru : simpul;

A B C D

Ilustrasi penambahan simpul bru di akhir senerai berantai disajikan pada

gambar di bawah ini. Pointer Awal adalah pointer yang menunjuk ke simpul

pertama, pointer Akhir menunjnuk ke simpul terakhir dan yang ditunjuk oleh

pointer baru adalah simpul yang akan ditambah. Dianggap bahwa simpul

awal dan simpul akhir telah terbentuk.

Awal Akhir Baru

Awal Akhir Baru

Awal Akhir

Baru

Untuk menyambung simpul yg ditunjuk oleh akhirdan Baru, pointer pada

simpul yg ditunjuk oleh simpul akhir dibuat sama dengan baru kemudian

pointer akhir dibuat sama dengan pointer baru.

Dengan memperhatikan gambar di atas, maka kita bisa menyusun prosedur

untuk menambah simpul baru dibelakang senarai berantai. Dalam hal ini perlu

pula ditest apakah senarai berantai masih kosong atau tidak. Senarai berantai

yang masih kosong ditandai dengan nilai pointer Awal yang nilainya sama

dengan nil. Berdasarkan deklarasi simpul dan pointer di atas, maka prosedur

untuk menambah simpul di belakang senarai berantai bisa disusun seperti

berikut:

A B C D F

A B C D F

A B C D F

Procedure TAMBAH_BELAKANG (var Awal, Akhir : Simpul;

Elemen : char);

Var baru : simpul;

Begin

New (baru); baru^.info := elemen;

If awal = nil then{senarai masih kosong}

Awal := baru

Else

Akhir^.berikut := baru

Akhir := baru

Akhir^.beriku:=nil

End;

Menambah Simpul di tengah

Untuk menambah simpul baru ditengah, pertama kali ditenukan di mana

simpul baru akan ditambahkan pada poisi urutan simpul yang keberapa. Hal

ini dapat dilakukan dengan menempatkan simpul pointer bantu pada posisi

tertentu. Kemudian pointer yang ditunjuk oleh pointer simpul baru dibuat

sama dengan pada simpul yang ditunjuk oleh simpul bantu, selanjutnya

pointer pada simpul yang ditunjnuk oleh simpul bantu, selalnjutnya pointer

pada simpul yang ditunjuk pada simpul yang ditunjuk oleh simpul bantu

dibuat sama dengan baru. Perhatikan bahwa urutan ini tidak boleh dibalik.

Menghapus simpul

Operasi kedua yang akan dijelaskan adalah operasi menghapus simpul. Dalam

menghapus simpul simpul satu hal yang perlu diperhatikan, yaitu bahwa

simpul yang bisa dihapus adalah simpul yang berada sesuai simpul yang

ditunjuk oleh suatu pointer (dalam gambar adalah simpul yang berada di

sebelah kanan simpul yang ditunjuk oleh suatu pointer), kecuali untuk simpul

pertama. Dengan demikian, kita tidak bisa menghapus simpul yang ditunjuk

oleh suatu pointer atau simpul sebelumnya. Untuk jelasnya perhatikan

ilustrasi pada gambar berikut.

Awal Bantu Akhir

Jika senarai berntai adalah seperti diatas, maka kita hanya bisa menghapus

simpul yang berisi ‘A’ dan simpul yang beisi ‘D’ supaya senarai tetap bisa

dipertahankan. Memang kita bisa menghapus simpul yang berisi ‘C’, tetapi

senarai yang kita miliki akan menjadi terputus, karena akan lebih sulit untuk

menyambung lagi simpul ‘B’ dengan simpul ‘D’.

Untuk menghapus simpul pertama, maka pointer Bantu kita buat sama dengan

pointer Awal. Kemudian pointer Awal kita pindah ke simpul yang ditunjjuk

oleh pointer pada simpul yang ditunjuk oleh pointer Bantu kita dispose.

Adapun prosedur menghapus simpul pertama adalah sebagai berikut:

Procedure Hapus_pertama (var awal : simpul);

Var baru : simpul;

Begin

If awal = nil then {senerai masih kosong}

Writeln(‘Senarai masih kosong, tidak mungkin

dihapus’)

Else if awal^.berikut = nil then {senarai berisi

sebuah simpul }

Awal := nil

Else

Beginbantu := awal;

Awal :=bantu^.berikut;

Dispose(bantu);

End;

End;

Untuk menghapus simpul terakhir, tidak bisa dilakukan hanya dengan

mendispose simpul akhir. Karena dengan disposenya simpul akhir, maka

hanya simpul akhir saja yang dihapus, tetapi simpulnya masih tetap bisa

dimasup, karena masih ditunjuk oleh pointer dari simpul di sebeah kirinya.

Sehingga untuk bisa menghapus simpul terakhir, selain simpul akhir kita

hapus, maka pointer dari sebelah kirinya juga harus dijadikan nil. Program di

A B C D

bawah ini secara lengkap akan menyajikan cara menghapus simpul di

belakang atau di tengah.

Membaca Isi Senarai Berantai

Jika kita mempunyai senarai berantai seperti yang kita pelajari, maka dengan

cara biasa kita hanya bisa membaca isi simpul dimulai dari simpul paling kiri

sampai simpul paling kanan (membaca maju). Untuk membaca dari simpul

paling kanan ke simpul paling kiri, harus dilakukan dengan proses rekursif.

Pembacaan senarai berantai secara maju bisa dijelaskan sebagai berikut.

Pertama kali kita atur supaya pointer bantu menunjuk ke simpul yang ditunjuk

oleh pointer awal. Setelah isi simpul tsb dibaca, maka pointer bantu kita

gerakkan ke kanan untuk membaca simpul berikutnya. Proses ini kita ulang

sampai pointer bantu sama dengan pointer akhir. Ilustrasi embaca senarai

berantai dari kiri ke kanan dapat dilihat pada gambar di bawah ini.

Awal Bantu Akhir

C. PRAKTIK{Program tambah dan baca}

program senarai_berantai;

uses crt;

const garis =

‘------------------------------------------‘;

pesan = ‘Senerai berantai masih kosong’;

type simpul = ^data;

data = record

nama,

alamat : string;

berikut : simpul

end;

var awal,

akhir : simpul ;

A B C D

pilih : char;

cacah : integer;

{fungsi untuk memilih menu}

function menu : char;

var p : char;

begin

clrscr;

gotoxy(30,3); writeln(‘DAFTAR MENU PILIHAN’);

gotoxy(20,8); writeln(‘A. MENAMBAH SIMPUL BARU DI

AWAL SENARAI’);

gotoxy(20,9); writeln(‘B. MENAMBAH SIMPUL BARU DI

AKHIR SENARAI’);

gotoxy(20,10); writeln(‘C. MENCETAK ISI SENARAI’);

gotoxy(20,11); writeln(‘D. SELESAI’);

repeat

gotoxy(48,15); writeln(‘ ’:10);

gotoxy(30,20); writeln(‘PILIH SALAH SATU’);

p:= upcase (readkey);

until p in [‘A’ .. ‘D’];

menu :=p

end;

{fungsi alokasi simpul }

function simpul_baru : simpul;

var b : simpul;

begin

new(b);

with b^ do

begin

write(‘Nama :’); readln(nama);

write(‘Alamat : ‘);readln(alamat);

berikut :=nil

end;

simpul_baru:=b

end;

{fungsi tambah simpul baru di awal senarai}

procedure tambah_awal (n:integer);

var baru : simpul;

begin

if n <> o then

begin

writeln(‘menambah simpul baru di awal senarai’);

writeln(copy(garis,1,45))

end;

writeln;

baru:=simpul_baru;

if awal = nil then

akhir :=baru

else baru^.berikut := awal;

awal :=baru;

end;

{fungsi tambah simpul baru di akhir senarai}

procedure tambah_akhir (n:integer);

var baru : simpul;

begin

clrscr;

if n <> o then

begin

writeln(‘Menambah simpul baru di akhir senarai’);

writeln(copy(garis,1,46))

end;

writeln;

baru:=simpul_baru;

if awal = nil then

awal := baru

else

akhir^.berikut := baru

akhir:=baru;

end;

{fungsi tambah simpul baru pada posisi tertentu}

procecdure tambah_tengah)n:integer);

var baru, bantu : simpul;

posisi,i:integer;

begin

writeln(‘Menambah simpul baru di tengah pada posisi

berapa ‘);

writeln(garis); writeln;

write(‘senarai berantai berisi : ‘, cacah:2,’

simpul’);

repeat

gotoxy(52,5);

writeln(‘ ‘);

gotoxy(1,5);

write(‘simpul baru ditempatkan sebagai nomer

berapa : ‘);

readln(posisi);

until posisi in [1..cacah+1];

if posisi = 1 then tambah_awal(0)

else if posisi = cacah+1 then tambah_akhir(0)

else begin

writeln;

baru:=simpul_baru;

bantu:=awal;

for i:=1 to posisi – 2 do

bantu:=bantu^.berikut;

baru^.berikut:=bantu^.berikut;

bantu^.berikut:=baru

end;

end;

{proceedure hapus depan}

procedure hap[us_depan;

var bantu :simpul;

begin

if awal = nil; then

writeln(‘senarai masih kosong’);

else

bantu:= awal;

awal:=bantu^.berikut;

bantu^.berikut:=nil

end;

{prosedur mencari simpul tertentu}

proceedure cari_simpul;

var bantu,

bantu : simpul;

i:integer;

begin

i:=1;

writeln(‘mencari simpul tertentu’);

if awal = nil then writeln(‘senarai masih kosong’);

else

writeln(‘mencari simpul tertentu’);

bantu:=awal;

if baru^.no_mhs = bantu^.no_mhs then begin

writeln(‘no mahasiswa :’, bantu^.no_mhs:5);

writeln(‘nama : ‘, bantu^.nama);

writeln(‘alamat : ‘,bantu^.alamat);

end;

else

writeln(‘mahasiswa dengan no ‘,baru^.no_mhs:5,’

tidak ada’);

end;

{prosedu baca isi senarai}

procedure baca_senarai;

var bantu:simpul;

i:integer;

begin

i:=1;

writeln(‘Membaca isi senarai’);

writeln(‘teken <enter> untuk kembali ke menu’);

writeln(copy(garis,1,42));

writeln;

if bantu = nil then

writeln(‘Data masih kosong’);

else

bantu := awal;

while bantu <> nil do

begin

writeln(‘simpul : ‘, i:3,’ - nama :

‘,bantu^.nama);

writeln(‘ ‘:17,’ alamat : ‘,bantu^.alamat);

bantu:=bantu^.berikut;

inc(i)

end;

repeat until keypressed

end;

{program utama}

cacah:=0;

awal:=nil;

akhir:=nil;

repeat

pilih:=menu;

clrscr;

case pilih of

‘A’ :tambah_awal(1);

‘B’ : tambah_akhir(1);

‘C’ :baca_senarai;

end;

if pilih in[‘A’,’B’] then inc(cacah)

until pilih = ‘D’

end.

Cobalah untuk simpul berikut:

Nomor Nama Alamat

0001 Dian-1 Jogja-1

0002 Dian-2 Jogja-2

0003 Dian-3 Jogja-3

0004 Dian-4 Jogja-4

0005 Dian-5 Jogja-5

1. Jelaskan perbedaan tambah simpul di awal, di akhir dan di tengah pada suatu

senarai dan bagaimana ilustrasinya.

2. Jelaskan perbedaan hapus simpul diawal, diakhir dan ditengah pada suatu

senarai dan bagaimana ilustrasinya.

D. TUGAS

Pada program diatas tambahlah procedure

1. Hapus simpul ditengah dan penghapusan simpul bisa diatur pada

posisi berapa simpul tersebut dihapus.

2. Hapus simpul diakhir.

MODUL V

ANTRIAN (QUEUE)

A. MAKSUD DAN TUJUAN

1. MAKSUD

Memberikan pemahaman tentang tipe data antrian beserta operasinya.

2. TUJUAN

Agar mahasiswa menggunakan tipe data antrian dengan melakukan operasi

menambah dan menghapus elemen.

B. TEORI

Antrian (queue) sering digunakan untuk mensimulasikan keadaan pada

dunia nyata. Antrian adalah suatu kumpulan data yang penambahan elemen hanya

bisa dilakukan pada suatu ujung (disebut dengan sisi belakang atau rear), dan

penghapusan (pengambilan elemen) dilakukan lewat ujung lain (disebut dengan

sisi depan atau front).

Prinsip pada antrtian adalah FIFO (First In First Out) atau’masuk pertama

keluar pertama”. Dengan kata lain, urutan keluar elemen akan sama dengan

urutan masuknya.

Dalam antrian dikenal 2 operasi dasar yaitu menambah elemen baru yang

akan ditempatkan di belakang antrian dan menghapus elemen yang terletak di

depan antrian. Disamping itu juga sering dilihat apakah antrian mempunyai isi

atau dalam keadaan kosong.

Implementasi Antrian dengan Larik

Untuk menyajikan antrian menggunakan larik, maka deklarasi antrian adalah:

Const max_elemen = 100;

Type antri = array [1..max_elemen] of integer;

Var

Antrian : antri;

Depan, belakang: integer;

Di bawah ini disajikan gambar antrian dengan menggunakan larik. Antrian

mempunyai 6 elemen, yaitu A, B, C, D, E, dan F. Elemen A terletak dibagian

depan antrian dan elemen F terletak di belakang antrrian. Dengan demikian, jika

ada elemen baru yang akan masuk ia akan diletakkan disebelah kanan F. Jika ada

elemen yang akan dihapus maka A akan dihapus lebih dulu.

Implementasi Antrian dengan Senarai Berantai

Jika dilihat pada penambahan dan penghapusan elemen pada antrian,

maka antrian sebenarnya juga merupakan bentuk khusus dari suatu senarai

berantai. Dengan demikian apa yang telah dipelajari pada senarai berantai bisa

digunakan pada antrian.

Untuk memanipulasi sebuah antrian akan digunakan 2 perubah yang

menyimpan posisi elemen paling depan dan elemen yang paling belakang.

Dengan cara yang sama, apabila ingin diimplementasikan antrtaian menggunakan

senarai berantai maka digunakan 2 pointer yang diletakkan pada elemen paling

depan (kepala) dan elemen paling belakang (ekor). Dalam hal ini bisa digunakan

senarai bernatai tunggal atau senarai berantai ganda baik yang bisa memutar atau

tidak. Disisni akan digunakan senarai berantai tunggal berkepala dan memutar,

sehingga deklarasi simpul sebagai berikut:

Type antri = ^simpul;

Simpul = record

Info : char;

Berikut : antrti;

End;

Var kepala, ekor : antri;

Pada waktu inisialisasi bentuk dari simpul kepala sebagai berikut:

Kepala

Ekor

Dengan memperhatikan gambar diatas maka prosedur inisialisasi adalah

Procedure init_antrian (var kepala, ekor : antri);

Begin

New(kepala);

Kepala^.info:=chr(0);

Kepala^.berikut:=kepala;

Ekor := kepala;

End;

C. PRAKTIK

1. Cobalah program dibawah ini, amati untuk beberapa masukan yang berbeda.

Program queue_contoh;

Uses crt;

Const max = 10;

Type antri = array [1..max] of char;

Var antrian:antri;

Depan, belakang, pilih, i : integer;

Elemen :char;

Function kosong (q:antri) :boolean;

Begin

Kosong:=(depan=belakang);

End;

Procedure tambah(var antrian:antri; x:char);

Begin

{menambah elemen baru}

if belakang = max then belakang := 1

else

belakang := belakang-1;

if not (kosong(antrian)) then

begin

antrian[belakang] := x;

write(‘hasil antrian = ‘,x)

end;

else

{antrian penuh}

begin

write(‘antrian penuh’);

repeat

until keypressed;

write(‘ ‘:30);

belakang:=belakang-1;

if belakang=0 then belakang:= max;

end;

End;

Begin {program utama}

Clrscr;

Depan:=0;

Belakang:=0;

Writeln(;menambah elemen’);

I:=1;

Write(‘isikan elemen =’);

Readln(elemen);

Tambah(antrian,elemen);

readln

End.

2. Modifikasi program diatas sehingga bisa menerima masukkan dalam bentuk

string.

Contoh input : stmik el rahma

Hasil akhir : stmik el rahma

3. Diberikan suatu fungsi untuk menghapus elemen dari antrian sebagai berikut :

Function hapus(var antrian:antri):char;

Begin

If depan = max then depan:=1

Else

Begin

Depan:=depan+1;

Hapus:=antrian[depan]

End;

End;

D. TUGAS

Implementasikan program queue_contoh diatas dengan menggunakan senarai

berantai.

MODUL VI

POHON (TREE)

A. MAKSUD DAN TUJUAN

1. MAKSUD

Memberikan pemahaman tentang tipe data pohon (khususnya pohon biner)

serta sifat-sifat dari pohon biner.

2. TUJUAN

Agar mahasiswa mampu membuat pohon biner, mencari data dan membaca data

dengan cara inorder, preorder,dan postorder.

B. TEORI

Pohon (tree) merupakan struktur data tak linier yang mempunyai sifat-

sifat dan ciri-ciri khusus. Struktur ini biasanya digunakan untuk menggambarkan

huubungan yang bersifat hirarkis antara lemen-elemen yang ada.

Pohon biner (binary tree) bisa didefinisikan sebagai suatu kumpulan

simpul yang mungkin kosong atau mempunyai akar dan dua sub pohon yang

saling terpisah yang disebut dengan subpohon kiri (left subtree) dan sub pohon

kanan (right subtree). Sub pohohn juga disebut dengan cabang. Karakteristik yang

dimiliki oleh pohon biner adalah bahwa setiap simpul paling banyak hanya

mempunyai dua bauh anak. Dengan kata lain, derajat tertinggi dari setiap simpul

dalam pohon adalah dua. Karakteristik yang lain adalah pohon biner

dimungkinkan tidak mempunyai simpul.

Mendeklarasikan Struktur Pohon Biner

Setiap simpul pada pohon terdiri 2 komponen utama:

1. data

2. Pointer yang menunjuk ke anak

Pointer anak ada 2 macam, yaitu:

1. Pointer yang menunjuk ke anak kiri

2. pointer yang menunjuk ke anak kanan

Sebuah contoh struktur untuk menyatakan simpul pohon biner dapat dilihat

dibawah ini:

Type

Tipedata = char;

Pointerpohon = ^simpulpohon

Simpulpohon = record

Data : tipedata;

Kiri,kanan : pointerpohon

End;

Menampilkan Data

Ada berbagai cara untuk menampilkan data pada setiap simpul. Pada pohon biner

terdapat cara yang disebut preorder, inorder, dan postorder. Cara ini bertumpu

pada cara mengunjungi setiap simpul.

Dengan cara inorder (LNR = Left Node Right), data akan ditampilkan dengan

cara urut naik. Kunjungan dilakukan dari posisi kiri simpul. Bila posisi kiri tidak

memiliki anak, maka isi simpul ditampilkan. Kemudian dilanjutkan dengan

kunjungan di posisi kanan.

Implementasi dari metode ini dapat dilihat sebagai berikut :

Procedure inorder (pointerakar : pointerpohon);

Begin

If pointerakar <> nil then

Begin

With pointerakar^ do

Begin

Inoder(kiri);

If data <> ‘0’ then write (data)

Inorder (kanan)

End;

End;

End;

Dengan cara preorder prosesnya dilakukan dengan cara NLR (Node Left Right).

Pada setiap simpul yang dikunjungi, data pada simpul akan ditampilkan terlebih

dahulu, kemudian mengarah ke simpul kiri dan akhirnya ke simpul kanan.

Implementasi dari metode ini dapat dilihat sebagai berikut :

Procedure preorder(pointerakar : pointerpohon);

Begin

If pointerakar <> nil then

Begin

With pointerakar^ do

Begin

If data <> ‘0’ then write(data);

Inorder(kiri);

Inorder(kanan)

End;

End;

End;

Dengan cara postorder, prosesnya dilakukan secara LNR (Left Node Right). Pada

setiap simpul yang dikunjnjungi, data pada simpul akan ditampilkan terlebih

dahulu kemudian mengarah ke simpul kiri dan akhirnya ke simpul kanan.

Implementasi dari metode ini dapat dilihat sebagai berikut :

Procedure postorder(pointerakar : pointerpohon);

Begin

If pointerakar <> nil then

Begin

With pointerakar^ do

Begin

Inorder(kiri);

Inorder(kanan)

If data <> ‘0’ then write(data);

End;

End;

End;

Selain ketiga metode diatas, masih ada satu metode yaitu metode levelorder.

Dalam hal ini akan ditampilkan simpul dari tingkat 1 (akar) diteruskan dengan

simpul-simpul pada tingkat 2,3, dst. Untuk mengimplementasikan prosedurnya

maka digunakan struktur antrian.

C. PRAKTIK

1. Cobalah program dibawah ini, dan amati untuk beberapa masukan yang

berbeda.

Program pohon;

Uses crt;

Type tipedata=char;

Pointerpohon=^simpulpohon;

Simpulpohon=record

Data:tipedata;

Kiri, kanan:pointerpohon;

End;

Var pointerakar:pointerpohon;

Entri:tipedata;

Procedure

sisipkankepohon(varp[ointerakar:pointerpohon;entri:tip

edata);

Begin

If pointerakar=nil then

Begin

New(pointerakar);

With pointerakar^ do

Begin

Data:=entri;

Kiri:=nil;

Kanan:=nil;

End;

End;

Else

If entri<pointerakar^.data then

Sisipkankepohon(pointerakar^.kiri,entri)

Else

Sisipkankepohon(pointerakar^.kanan,entri)

End;

Procedure inorder(pointerakar:pointerpohon);

Begin

If pointerakar <> nil then

Begin

With pointerakar^ do

Begin

Inorder(kiri);

If data <> ‘0’ then write(data);

Inorder(kanan);

End

End;

End;

Begin{program utama}

Clrscr;

Pointerakar:=nil;

Writeln(‘buat pohon’);

Repeat

Read(entri);

Sisipkankepohon(pointerakar,entri);

Until entrti=’0’;

Writeln(;penulisan inorder’);

Inorder(pointerakar);

Writeln;

Readln;

2. Lengkapilah program diatas sehingga bisa digunakan untuk mencek sebuah

karakter ada di pohon atau tidak. (Petunjuk : gunakan fungsi di bawah ini)

Function

cari(pointerakar:pointerpohon;entri:tipedata):pointerp

ohon;

Begin

if pointerakar = nil then cari := nil

else

with pointerakar^ do

if entri = data then cari := pointerakar

else

if entri < data then cari := cari(kiri,entri)

else

cari:=cari(kanan,entrri);

end;

D. TUGAS

Buatlah prosedur untuk menampilkan data pada pohon secara preorder dan

postorder.

MODUL VII

PENGURUTAN DATA NUMERIS (SORTING)

A. MAKSUD DAN TUJUAN

1. MAKSUD

Pengenalan proses pengurutan data numeris (sorting)

2. TUJUAN

Agar praktikan bisa memahami proses pengurutan data numeris dan bisa

memanfaatkan pada penerapannya.

B. TEORI

Secara umum ada dua macam model/bentuk urutan data numeris, yaitu

model uruitan membesar (ascending) dan model urutan mengecil yaitu

descending. Untuk melakukan proses pengurutan data numeris ada beberapa

metode, misal metode seleksi, metode penyisipan langsung dan metode

gelembung.

Cara kerja metode seleksi didasarkan pada pencarian elemen dengan

nilai terkecil, kemudian dilakukan penukaran dengan elemen ke 1. Secara

ssingkat, metode ini bisa dijelaskan sebagai berikut. Pada langkah pertama, dicari

data terkecil tersebut kita tukar dengan data pertama. Dengan demikian, data

pertama sekarang mempunyai nilai paling kecil dibanding data yang lain. Pada

langkah kedua, data terkecil kita cari mulai data kedua. Demikian seterusnya

sampai seluruh vektor dalam keadaan terurutkan. Untuk lebih memperjelas proses

pengurtan dengan metode seleksi, berrikut disajikan contoh metode ini.

Iterasi ke A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]

I=1, lok=3

I=2, lok=9

I=3, lok=3

I=4, lok=8

I=5, lok=8

I=6, lok=7

I=7, lok=7

I=9, lok=9

23

12

12

12

12

12

12

12

45

45

16

16

16

16

16

19

12

23

23

23

23

23

23

23

24

24

24

23

23

23

23

23

56

56

56

56

56

24

24

24

34

34

34

34

34

34

27

27

27

27

27

27

27

27

34

34

23

23

23

23

23

56

56

56

16

16

45

45

45

45

45

45

Akhir 12 16 23 23 24 27 34 45

Metode ini secara garis besar merupakan kebalikan dari metode penyisipan

langsung. Dalam setiap langkah pada metode penyisipan langsung kita hanya

memperhatikan satu elemen dari sumber dan semua elemen dari larik tujuan

untuk menentukan posisinya yang tepat. Sehingga sering disebut dengan one

source multiple destinations. Dalam metode seleksi terjadi sebaliknya, yakni kita

memperhatikan semua elemen dalam larik sumber untuk menentukan elemen

terkecil yang akan kita tempatkan pada tujuan, sehingga sering disebut dengan

multiple source one destination.

C. PRAKTIK

Program sorting1;

Uses crt;

Tuype larik = array [1..100] of real;

Var vektor:larik;

I,cacah:integer;

Bantu:real;

Procedure sort_sleksi(var x : larik;n:integer);

Var i,j,lokasi:integer;

Bantu:real;

Begin

For i:=1 to n do

Begin

Lokasi := i;

For j:= i+1 to n do

If x[lokasi]>x[j] then

Lokasi:=j;

Bantu:=x[i];

X[i]:=x[lokasi];

X[lokasi]:=bantu

End

End;

Procedure cetak_larik(x:larik;n:integer);

Var i:integer;

Begin

For i:=1 to n do

Begin

Writeln(x[i]:8:2);

If i mod 8 = 0 then

Writeln;

End

End;

Begin

Clrscr;

Writeln(mensorttir bilangan dengan metode seleksi’);

Writeln(cacah data :’);

Readln(cacah);

Writeln;

Writeln(‘masukan data 8 data per baris;);

Bantu:=1;

For i:=1 to cacah do

Begin

Read (vektor[i]);

Goptoxy(wherex+(i mod 8)*8, wherey-i);

Id i mod 8 = 0 then

Writeln;

End;

Clrscr;

Writeln(‘ data sebelum disorttir’);

Writeln;

Ctak_larik(vektor,cacah);

Writeln(writeln;

Sort_seleksi(vektor,cacah);

Writeln(‘data setelah disoprtir’);

Writel;n;

Cetak_larik(vektor,cacah);

End.

Pertanyaan:

1. Ujialah dengan data yang telah tersedia pada ilustrasi di tas.

2. Model urutan di atas diganti

D. TUGAS

Pada program di atas procedure metode seleksi gantilah

1. dengan metode penyisipan langsung.

2. dengan metode gelembung.

MODUL VIII

PENCARIAN (SEARCHING)

A. MAKSUD DAN TUJUAN

1. MAKSUD

Memberikan pemahaman tentang cara pencarian data dalam vektor terurut

maupun vektor tidak terurut.

2. TUJUAN

Agar mahasiswa mampu mecari data dalam vektor dengan metode pencarian

berurutan (sequential searching) dan metode pencarian biner (binery searching).

B. TEORI

Pencarian data sering juga disebut dengan table look up atau storage and rerievel

information adalah suatu proses untuk mengumpulkan sejumlah informasi di

pengingat komputer dan mencari kembali informasi yang diperlukan secepat

mungkin.

Pencarian data bisa dikelompokkan 2 cara yaitu pencarian internal dan

pencarian eksternal. Efisiensi pencarian data dipengaruhi struktur data yang

digunakan untuk menyimpan data. Dalam hal ini akan digunakan struktur data

vektor dengan deklarasi tipe array dimensi 1. Adapun vektor yang digunakan

mempunyai deklarasi sebagai berikut :

Type larik = array[1..100] of integer;

SEQUENTIAL SEARCHING

Metode yang paling sederhana dari sejumlah pencarian adalah metode pencartian

berurutan (sequential searching). Secara garus besar metode ini bisa dijelaskan

sebagai berikut. Dari vektor yang diketahui, data yang dicari dibandingkan satu

per satu sampai data tersebut ditemukan atau tidak. Pada saat data yang dicari

sudah ketemu maka proses pencarian dihentikan. Tetapi jika tidak, pencarian akan

diteruskan smpai seluruh data dibandingkan.

Implementasi dari metode ini adalah:

Procedure cari_vektor_urut (var ada : boolean; var n,

posisi : integer; var A : larik: data : integer);

Var i : integer;

Begin

{dianggap tidak ada data}

ada := false;

for i := 1 to n do

if A[i] = data then

begin

posisi := i;

ada := true;

exit;

end;

if not ada then

{data yang dicari tidak ketemu, sisipkan ke vektor}

begin

inc(n);

a[n] := data;

end;

End;

PENCARIAN BINER

Metode pencarian biner yang dapat dijelaskan sebagai berikut. Setelah yang

diketahui diurutkan, vektor dibagi menjadi 2 sub vektor yang mempunyai jumlah

elemen sama. Kemudian data dibandingkan dengan data terakhir dari sub vektor

pertama. Jika data yang dicari lebih kecil, pencarian diteruskan pada su vektor

pertama dengan terlebih dahulu membagi dua sub vektor tersebut. Tetapi jika data

yang dicari lebih besar dari data terakhir dari sub vektor pertama berarti data

terletak pada sub vektor kedua. Dengan demikian pencarian dilakukan pada sub

vektor kedua. Proses di atas diulang sampai data yang dicari ketemu atau tidak

ketemu.

C. PRAKTIK

1. Buatlah program untuk mencari elemen / data pada suatu vektor yang sudah terurut

dengan menggunakan procedure car_vektor_urut di atas.

2. Buatlah program untuk mencari data / elemen pada suatu vektor yang belum

terurut (dengan pencarian biner)

D. TUGAS

Bandingkan kedua metode diatas. Metode mana yang lebih efisien? Buktikan dalam

bentuk program