Anda di halaman 1dari 82

1.

STRUKTUR DATA

Struktur Data merupakan cara penyimpanan, pengorganisasian, dan pengaturan


data dalam media penyimpanan sehingga dapat digunakan secara aktif dan efektif
(sedikit menggunakan memory).

1.1. Hierarki Struktur Data


Level 0 Bit Byte Word
Level 1 Integer Real Char
(tipe data sederhana) Boolean String Pointer
Level 2 Array Record Set
(tipe data terstruktur) File
Level 3 Stack Queque List
(tipe data abstrak) Tree Graph

ADT (Abstrack Data Type) merupakan sekumpulan tipe dan operasi-operasinya


terhadap tipe data tersebut.
Struktur data dapat dibagi atas 2 bagian, yaitu :
A. Struktur Data Linear
Struktur data yang mempunyai hubungan dari satu ke satu.
A.1 Array
A.2 Linked List
B. Struktur Data Non Linear
Struktur data yang mempunyai hubungan dari satu ke banyak (one to many).
B.1 Tree
B.2 Graph

1
2. VARIABEL DAN TIPE DATA

2.1 Variabel
Variabel adalah suatu lokasi di memory yang disiapkan oleh programmer dan
diberi nama yang khas untuk menampung suatu nilai dan atau mengambil kembali nilai
tersebut.
Bentuk umum :
Var Identifier : Tipe Data;
Contoh : Var Nama : String[25];
Deklarasi variabel dengan tipe data sama :
Var Id1, Id2, Id3, Idn : Tipe Data;
Contoh : Var GajiBersih, Pajak, Tunjangan : Real;
Deklarasi variabel dengan tipe data berbeda :
Var Id1 : Tipe data1;
Id2 : Tipe data2;
Id3 : Tipe data3;
Contoh : Var Nama : String[25]
Umur : Integer;
Status : Char;

2.2 Tipe Data


3 Bentuk tipe data yang digunakan dalam struktur data, yaitu :
1. Tipe Data Sederhana (Tunggal dan Majemuk)
Tipe data yang umum atau serng dipakai oleh program yang terdiri dari :
a) Bilangan Bulat (Integer)
Bilangan yang tidak mengandung pecahan (desimal).
Beberapa bagian dari tipe data Integer :
Tipe Ukuran Range
Byte 1 byte 0.. 255
Shortint 1 byte -128.. 127
Integer 2 byte -32768.. 32767
Word 2 byte 0..65535

2
Longint 4 byte -2144483648..214748

b) Bilangan Pecahan (Real)


Beberapa bagian dari tipe data Real :
Tipe Ukuran Range Digit
Single 4 byte ± 1,5x10-45..3,4x1038 7-8
Real 6 byte ± 2,9x10-39..1,7x1038 11-12
Double 8 byte ±5,0x10-45..1,7x1038 15-16
Comp 8 byte -9,2x1018..9,218 19-20
Extended 10 byte ±3,4x104932..1,1x104932 19-20

c) Bilangan Logic (Boolean)


Merupakan tipe data yang bentuknya bercabang yang sifatnya menentukan
kondisi logika yang bernilai true dan false.
Beberapa bagian dari tipe data Boolean :
Tipe Ukuran Range
Boolean Byte-sized 1 (8 bit)
ByteBool Byte-sized 1 (8 bit)
WordBool Word-sized 2 (16 bit)
LongBool Longint-sized 4 (32 bit)

d) Character (Char)
Jenis data yang merupakan karakter tunggal/jenis karakter yang terdapat dalam
kode ASCII (American Standard Code of Information Interchange).
e) String (Susunan dari beberapa char)
Merupakan tipe data yang berupa kumpulan karakter dengan panjang tertentu.
Jika string tidak didefinisikan maka akan memakai memory sebesar 255 byte.
Contoh program menggunakan tipe data sederhana :
Programnya :
program datakaryawan;
uses crt;
var
nama:string[20];

3
gaji:real;
utang:real;
gaber:real;
gol:integer;
begin
clrscr;
write('Masukkan nama karyawan:');readln(nama);
write('Masukkan gaji:');readln(gaji);
write('Masukkan utang:');readln(utang);
write('Masukkan golongan:');readln(gol);
gaber:=gaji-utang;
writeln;writeln;
Writeln('Nama karyawan=',nama);
Writeln('Gaji karyawan=',gaji:4:2);
Writeln('Utang karyawan=',utang:4:2);
Writeln('Golongan karyawan=',gol);
writeln('Gaji bersih=',gaber:4:2);
readln;
end.

Output :

2. Tipe Data Terstruktur (Bentukan)


Tipe data yang dibentuk tersendiri dalam bentuk pernyataan yang terdiri dari :
a) Record (Rekaman)
Terdiri dari satu/lebih field yang berisi data dari tipe data dasar atau kumpulan
elemen yang bertipe data berbeda.
Bentuk Umum :

4
Type Nama_Tipe = Record
Field1 : tipe data;
Field2 : tipe data;
Fieldn : tipe data;
End;
Programnya :
program cobarecord;
uses crt;
type
hasil=record
nama :string[20];
npm:string[10];
iuran:integer;
end;
var
mhs:hasil;
begin
clrscr;
with mhs do
begin
write('Masukkan nama=');readln(nama);
write('Masukkan NPM=');readln(npm);
write('Masukkan iuran=');readln(iuran);
writeln('Nama=',nama);
writeln('NPM=',npm);
writeln('Iuran=',iuran);
readln;
end;
end.

Output :

b) Set (Himpunan)
Kumpulan elemen atau objek yang mempunyai tipe data yang sama tanpa
memperhatikan urutan penulisan.

5
Bentuk Umum :
Type Nama_Tipe = (Himpunan);
Pengenal : Set Of Nama_Tipe
Var Nama_Variabel : Fengenal;
Contoh : Type NamaHari = (Minggu, Senin, Selasa, Rabu, Kamis, Jumat,
Sabtu)
Hari : Set Of NamaHari;
Var HariKerja : Hari;
c) Array (Larik)
Kumpulan elemen yang bertipe data sama dalam satu variabel.
Bentuk Umum :
Type Nama_Tipe = Array[range] Of Tipe Data;
Var Nama_Variabel : Nama_Tipe;
Programnya :
program contoharray;
uses crt;
var
i:array[1..5]of integer;
begin
clrscr;
write('Masukkan nilai1:');readln(i[1]);
write('Masukkan nilai2:');readln(i[2]);
write('Masukkan nilai3:');readln(i[3]);
write('Masukkan nilai4:');readln(i[4]);
i[5]:=i[1]+i[2];
writeln(i[1]);
writeln(i[2]);
writeln(i[3]);
writeln(i[4]);
writeln('Hasil jumlah=',i[5]);
readln;
end.

6
Output :

d) File (Berkas)
Merupakan sekumpulan byte yang disimpan dalam media penyimpanan.
Bentuk Umum :
Type NamaTipe = Record
Pengenal : File Of NamaTipe
Var NamaVariabel : Pengenal;
Contoh :
Type Data = Record
DataMahasiswa : File Of Data
Var Nama_Variabel : DataMahasiswa;
Programnya :
program cobatulisreco;
uses crt;
type
tsiswa=record
npm:string[10];
nama:string[30];
jurusan:string[10];
end;
tfilesiswa=file of tsiswa;
var
filesiswa:tfilesiswa;
siswa:array[0..9]of tsiswa;
jumlah:integer;

procedure inputsiswa;
var i:integer;
begin
clrscr;
write('Masukkan jumlah data[max 10]:');
readln(jumlah);
for i:=0 to jumlah-1 do begin

7
write('Masukkan NIP siswa :');readln(siswa[i].npm);
write('Masukkan Nama siswa :');readln(siswa[i].nama);
write('Masukkan Jurusan siswa :');readln(siswa[i].jurusan);
writeln;writeln;
end;
assign(filesiswa,'d:\fileis.dat');
rewrite(filesiswa);
for i:=0 to jumlah do
write(filesiswa,siswa[i]);
close(filesiswa);
end;

procedure bacaberkas;
var panjangfile:integer;
i:integer;j:integer;
begin
clrscr;
assign(filesiswa,'d:\fileis.dat');
{$i-}
reset(filesiswa);
{$i+}
if IOresult=0 then begin
while not eof(filesiswa) do begin
read(filesiswa,siswa[i]);
inc(i);
end;
close(filesiswa);
for j:=0 to i-1 do begin
writeln(siswa[j].npm);
writeln(siswa[j].nama);
writeln(siswa[j].jurusan);
writeln;writeln;
end;
end
else
writeln('File bermasalah');
end;
begin
clrscr;
inputsiswa;
bacaberkas;
readln;
end.

8
Output :

3. Tipe Data Pointer


Merupakan tipe data dimana nilai yang simpan berupa alamat di memory.
Bentuk Umum :
Type nama_tipe=array[range] of tipedata;
Var Nama_Variabel : ^Tipe Data;
Programnya :
program pointer;
uses crt;
type
tipestring=string[15];
penunjukstring=^tipestring;
var
nama:penunjukstring;
begin
clrscr;
nama^:='turbo pascal';
writeln(nama^);
writeln(nama^);
writeln(nama^);
writeln(nama^);
readln;
end.
Output :

9
3. ARRAY

Array merupakan suatu tipe data terstruktur yang terdapat dalam memory yang
terdiri dari sejumlah elemen (tempat) yang mempunyai tipe data sama dan merupakan
gabungan dari beberapa variabel sejenis serta memiliki jumlah komponen yang jumlah
tetap.
Elemen-elemen dari array tersusun secara sequintal dalam memori computer.
Array dapat berupa satu dimensi, dua dimensi, tiga dimensi ataupun banyak dimensi.

3.1 Array Satu Dimensi


Array satu dimensi tidak lain adalah kumpulan elemen-elemen yang identik,
yang tersusun dalam satu baris. Elemen-elemen tersebut memiliki tipe data yang sama,
tetapi isi dari elemen tersebut boleh berbeda.
 123456789ABCDEF

0 1 2 3 4 5 6 7 8 9

17 21 33 1 48 0 2 16 72 9 Konsep array satu dimensi

Bentuk Umum :
Type NamaArray = Array[IndeksArray] Of Tipe Data;
Contoh :

3.1.1 Array Mapping Function (AMF) Satu Dimensi


Berfungsi untuk memetakan nilai indeks ke alamat di elemen.
Rumus :
@A[i] = @A[b] + L (i-b)
@A[i] : Alamat indeks yang dicari b : Indeks awal
@A[b] : Alamat indeks awal i : Indeks yang dicari
L : Panjang memory (menurut tipe data)
Programnya :
program contoharray;
uses crt;
var

10
i:array[1..3]of string;
begin
clrscr;
write('Masukkan nama 1:');readln(i[1]);
write('Masukkan nama 2:');readln(i[2]);
write('Masukkan nama 3:');readln(i[3]);
writeln;
writeln(i[1]);
writeln(i[2]);
writeln(i[3]);
readln;
end.
Output :

3.2 Array Data Dimensi


Array dua dimensi yang sering digambarkan dengan sebuah matriks merupakan
perlusan dari sebuah array satu dimensi. Jika pada array satu dimensi hanya terdiri dari
sebuah baris dengan beberapa kolom elemen, maka pada array dua dimensi terdiri dari
beberapa baris dan beberapa kolom elemen yang bertipe data sama sehingga dapat
digambarkan sebagai berikut ini :
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
[1] 10 2 32 54 84 1 2 65 5 4
[2] 21 45 65 98 23 44 99 10 14 28
[3] 13 95 27 71 73 6 7 88 9 11

Bentuk Umum :
Type NamaArray = Array [indeks baris, indeks kolom’ of TipeData;
Contoh :
Type Matriks = Array [1..3, 1..5] of Byte;
Var : Larik : Matriks;

11
Programnya :
program contoharray2dimensi;
uses crt;
var
tabel:array[1..3,1..2]of byte;
i,j:integer;
begin
clrscr;
tabel[1,1]:=5;
tabel[1,2]:=8;
tabel[2,1]:=9;
tabel[2,2]:=7;
tabel[3,1]:=1;
tabel[3,2]:=3;
for i:=1 to 3 do
begin
for j:=1 to 2 do
write(tabel[i,j]:10);
writeln;
end;
readln;
end.

Output :

3.2.2 Array Mapping Function (AMF) Dua Dimensi


Bentuk Umum :
Type NamaTipe = Array [indeks baris, indeks kolom] of TipeData;
Var NamaVariabel : Array [indeks baris, indeks kolom] of TipeData;
Melinearkan dan AMF Array Dua Dimensi :
1) Row Major Order (Baris per baris)
 @B[i,j] = @B [a,b] + { ((i-a) n + (j-b)) L}
2) Column Major Order (Kolom per kolom)
 @B[i,j] = @B [a,b] + { ((j-b) k + (i-a)) L}

12
Ket : @B [i,j] : Alamat yang dicari;
@B [a,b] : Alamat awal;
i : Indeks baris yang dicari; n : Jumlah elemen per baris;
j : Indeks kolom yang dicari; k : Jumlah elemen per kolom;
a : Indeks awal baris; L : Panjang memori;
b : Indeks awal kolom;
Contoh :
Sebuah array dua dimensi dengan ordo 3 x 5 menggunakan tipe data double,
dimana alamat awal berada di @A[2,3]/1588H.
a) Buat Array A sebagai tipe data baru!
b) Berapa jumlah elemen dan panjang memori untuk Array A?
c) Buat susunan elemen Array tersebut!
d) Tentukan alamat @A[4,6] dengan RMO dan CMO!
Pembahasan :
a) Type David = Array [2..4, 3..7] of Double;
Var Larik : David;
b) Jumlah elemen = (u – i + 1) * (u – j + 1)
=3*5
Panjang Memori = 15 * 8
= 120

c)
A[2,3] A[2,4] A[2,5] A[2,6] A[2,7]
A[3,3] A[3,4] A[3,5] A[3,6] A[3,7]
A[4,3] A[4,4] A[4,5] A[4,6] A[4,7]

d) RMO
@B[i,j] = @B[a,b] + {((i-a) n + (j-b)) L}
= 1588H + {((4-2) 5 + (6-3)) 8}
= 1588H + 104D
= 1588H + 68H
= 15F0H + 104D

13
CMO
@B[i,j] = @B[a,b] + {((j-b) k + (i-a)) L}
= 1588H + {((6-3) 3 + (4-2)) 8}
= 1588H + 88D
= 1588H + 58H
= 15E0H

3.3 Array Multi Dimensi


Bentuk Umum :
Type NamaTipe = Array [id1, id2, id3,...,idn] of TipeData;
Var NamaVariabel : Array [id1, id2, id3,...idn] of TipeData;
Menentukan Alamat di Memori :
@A[i1, i2,...,in] = @A[a1, a2,...an] + {[1i1-a1) d2.d3.dn + (i2 – a2).d3.dn +
...+ (in – an)] L}
Ket : @A[i1, i2, ...,in] : Alamat yang dicari;
@A[a1, a2, ...an] : Alamat awal;
i1, i2, ..., in : Indeks yang dicari;
a1, a2, ...an : Indeks awal;
d1, d2, d3, dn : Jumlah elemen tiap dimensi;
Contoh :
Array A mempunyai 4 dimensi dengan jumlah elemen per dimensi 2, 3,
2, 2 dengan tipe data single. Alamat awal berada di A[2, 0, 1, 3] atau
11BCH.
a) Buat Array A sebagai tipe data baru!
b) Buat susunan elemen di memori!
c) Tentukan alamat untuk @A[3, 2, 2, 3]!
Pembahasan :
a) Type David = Array [2..3, 0..2, 1..2, 3..4] Of Single
Var Larik : David;
b)
A[2,0,1,3] A[2,0,1,4]
A[2,0,2,3] A[2,0,2,4]

14
A[2,1,1,3] A[2,1,1,4]
A[2,1,2,3] A[2,1,2,4]
A[2,2,1,3] A[2,2,1,4]
A[2,2,2,3] A[2,2,2,4]
A[3,0,1,3] A[3,0,1,4]
A[3,0,2,3] A[3,0,2,4]
A[3,1,1,3] A[3,1,1,4]
A[3,1,2,3] A[3,1,2,4]
A[3,2,1,3] A[3,2,1,4]
A[3,2,2,3] A[3,2,2,4]

c) @A[3,2,2,3] = @A[2,0,1,3] + {[(3-2)3.2.2 + (2-0)2.2 + (2-1)2 + {(12


+ 8 + 2 + 0)4}
Contoh program array multi dimensi :

15
4. STACK (TUMPUKAN)

Merupakan struktur data yang penambahan dan pengurangan elemen dilakukan


di satu ujung yaitu ujung yang paling kanan. Konsep utamanya adalah LIFO (Last In
First Out), benda yang terakhir masuk dalam stack akan menjadi benda pertama yang
keluar dari stack.
Dua cara penerapan prinsip stack yaitu array dan linked list.

4.1 Single Stack dengan Array


Berikut diberikan contoh deklarasi konstanta, tipe, dan variabel yang akan
dipakai dalam penkelasan operasi-operasi stack dengan array.
Const Max = 7
Type TipeData = Byte;
Stack = Array[1..max] of TipeData;
Var
Top : TipeData;
Operasi-operasi pada Single Stack dengan Array :
- Create : Membuat sebuah stack baru yang masih kosong.
Procedure Create;
Begin
Top : = 0
End;
Ket : jika tinggi tumpukan adalah 0, berarti tumpukan kosong.
- Full : Function untuk memeriksa apakah stack yang ada sudah penuh.
Function Full : Boolean;
Begin
Full := False;
If Top = Max then Full := True;
End;
- Push : Menambahkan sebuah elemen ke dalam stack. Tak bisa dilakukan jika
stack sudah penuh.
Procedure Push (elemen : TipeData);

16
Begin
If not Full then
Begin
Top := Top+1; {atau : Inc(Top);}
Stack[Top] := elemen;
End;
End;
- Empty : Function untuk menentukan apakah stack kosong atau tidak.
Function Empty : Boolean;
Begin
Empty := False;
If Top = 0 Then Empty := True;
End;
- Pop : Mengambil elemen teratas dari stack. Stack tidak boleh kosong.
Procedure Pop (elemen : TipeData);
Begin
If Not Empty then
Begin
Elemen := Stack[top];
Top := Top-1; {atau : Dec(top);}
End;
End;
- Clear : Mengosongkan stack (ket : jika Top = 0, stack dianggap kosong).
Procedure Clear;
Begin
Top := 0;
End;

4.2 Double Stack dengan Array


Merupakan teknik khusus yang dikembangkan untuk menghemat pemakaian
memory dalam pembuatan dua stack dengan array. Intinya adalah penggunaan hanya
sebuah array untuk menampun dua stack.

17
Berikut diberikan contoh deklarasi konstanta, tipe, dan variabel yang akan
dipakai dalam penjelasan operasi-operasi double stack dengan array.
Const Max = 8
Type TipeData = Integer;
Stack = Array[1..max] of Byte;
Var Top : Array [1...2] of Byte;
Operasi-operasi pada Double Stack dengan Array :
- Create : Membuat sebuah stack baru yang masih kosong.
Procedure Create;
Begin
Top[1] : = 0; {stack1 dianggap kosong jika top[1] = 0}
Top[2] : = Max + 1; {stack dianggap kosong jika top[2] = Max +1}
End;
- Full : Function untuk memeriksa apakah stack yang ada sudah penuh.
Function Full : Boolean;
Begin
Full := False;
If Top[1]+1 >= Top[2] then Full := True;
End;
- Push : Memasukkan sebuah elemen ke salah satu stack.
Procedure Push (elemen : TipeData; NoStack : Byte);
Begin
If not Full then
Begin
Case NoStack Of
1 : Top[1] := Top[1] +1;
2 : Top[2] := Top[2] -1;
End;
Stack[Top[NoStack]] := elemen;
End;

18
- Empty : Function untuk menentukan apakah stack1 atau stack2 kosong atau
tidak.
Function Empty (NoStack : Byte): Boolean;
Begin
Empty := False;
Case NoStak Of
1 := If Top[1] = 0 then
Empty := True;
2 := If Top[2] = Max + 1 then
Empty := True;
End;
- Pop : Mengambil elemen teratas dari salah satu stack.
Procedure Pop (Var elemen : TipeData; NoStack : Byte);
Begin
If Not Empty (NoStack) then
Begin
Elemen := Stack[top[NoStack]];
1 := Top[1] := Top[1] – 1;
2 := Top[2] := Top[2] + 1;
End;
End;
End;
- Clear : Mengosongkan salah satu stack
Procedure Clear (NoStack : Byte);
Begin
Case NoStack Of
1 := Top[1] := 0;
2 := Top[2] := Max + 1;
End;
End;

19
4.3 Stack dengan Single Linked List
Keunggulan single linked list dibanding array adalah penggunaan alokasi
memori yang dinamis sehingga menghindari pemborosan memori.
Type TipeData = Byte;
Point = ^Simpul;
Isi : TipeData;
Next : Point;
End;
Var Top : Point;
Ket : Untuk stack digunakan konsep single linked list, LIFO
Operasi-operasi pada Stack dengan Single Linked List :
- Create : Membuat sebuah stack baru yang masih kosong.
Procedure Create;
Begin
Top : = Nil
End;
- Push : Memasukkan sebuah elemen baru ke dalam stack.
Procedure Push (elemen : TipeData);
Var Now : Point;
Begin
New (Now);
Now^.Isi := elemen;
If Empty then
Now^.Next := Nil;
Else
Now^.Next := Top;
Top := Now;
End;
- Empty : Function untuk menentukan apakah stack yang ada masih kosong atau
tidak.

20
Function Empty : Boolean;
Begin
Empty := False;
If Top = Nil Then Empty := True;
End;
- Pop : Mengambil elemen teratas dari stack.
Procedure Pop (Var elemen : TipeData);
Var Now : Point;
Begin
If Not Empty then
Begin
Elemen := Now^.Isi;
Now := Top;
Top := Top^.Next;
Dispose (Now);
End;
End;
- Clear : Menghapus stack yang ada.
Procedure Clear;
Var Trash : TipeData;
Begin
White not empty do Pop(Trash);
End;
Programnya :
program stack;
uses crt;
type ptr = ^simpul;
simpul = record
nama : string;
tinggi : real;
next : ptr;
end;
var
list,baru: ptr;
i,n,pil : integer;
nama : string;

21
tinggi: real;
procedure tambahdata_dpn(var listnya : ptr; namanya : string; tingginya
: real);
var baru : ptr;
begin
new(baru);
baru^.nama:=namanya;
baru^.tinggi:=tingginya;
if listnya=nil then
listnya:=baru
else
baru^.next:=listnya;
listnya:=baru;
end;
procedure tampildata_dpn(var listnya : ptr);
var bantu : ptr;
begin
bantu:=listnya;
writeln('NAMA - TINGGI');writeln;
while bantu<> nil do
begin
writeln(bantu^.nama,' - ',bantu^.tinggi:0:2);
bantu:=bantu^.next;
end;
end;
procedure hapusdata_dpn(var listnya : ptr);
var bantu : ptr;
begin
if listnya=nil then
writeln('List kosong')
else
if listnya^.next=nil then
begin
bantu:=listnya;
listnya:=nil;
dispose(bantu);
end
else
begin
bantu:=listnya;
listnya:=listnya^.next;
dispose(bantu);
end;
end;
begin
list:=nil;
repeat
clrscr;
writeln(' M E N U : ');

22
writeln;
writeln('(1). Tambah Data');
writeln('(2). Ambil Data');
writeln('(3). Lihat Data');
writeln('(0). Keluar');
write('PILIHAN = ');readln(pil);writeln;
case pil of
1 : begin
write('Banyak Data yang ditambah [PUSH] = ');readln(n);
for i:=1 to n do
begin
writeln('-------------');
write('NAMA = '); readln(nama);
write('TINGGI = '); readln(tinggi);
tambahdata_dpn(list,nama,tinggi);
end;
end;
2 : begin
hapusdata_dpn(list);
writeln('Data Telah Diambil [POP]');
readln;
end;
3 : begin
tampildata_dpn(list);
readln;
end;
end;
until (pil=0);
readln;
end.

Output :

23
24
5. QUEUE (ANTRIAN)

Queue merupakan salah satu contoh aplikasi dari pembuatan double linked list
yang cukup sering kita temui dalam kehidupan sehari-hari, misalnya pada saat kita
mengantri di loket untuk membeli tiket.
Istila yang cukup sering dipakai apabila seseorang masuk ke dalam sebuah
antrian adalah ENQUEUE, sedangkan apabila seseorang keluar dari antrian adalah
DEQUEUE.
Untuk dapat membuat aplikasi antrian dapat menggunakan 2 metode :
1. Array
- Linear Array
- Circular Array
2. Linked List
Implementasi Queue dengan Array
a) Linear Array
Merupakan satu array yang dibuat seakan-akan merupakan suatu garis lurus
dengan satu pintu masuk dan satu pintu keluar. Berikut penggalan konstanta, type, dan
variabel yang akan dipakai untuk menjelaskan operasi-operasi dalam queue linear array.
Const MaxQueue = 6;
Type TypeQueue = Byte;
Var Queue : Array [1..MaxQueue] of TypeQueue;
Head, Tail : Byte;
Operasi-operasi pada Queue dengan Linear Array:
- Create : Menciptakan Queue yang baru dan kosong dengan cara memberikan nilai
awal (head) dan nilai akhir (tail) dengan nol (0).
Procedure Create;
Begin
Head : = 0; Tail := 0;
End;

25
- Empty : Mengecek apakah Queue masih kosong atau sudah berisi data.
Function Empty : Boolean;
Begin
If Top = 0 Then
Empty := True;
Else
Empty := False;
End;
- Full: Mengecek apakah Queue sudah penuh atau masih bisa menampung data.
Function Full : Boolean;
Begin
If Tail = MaxQueue then
Full := True
Else
Full := False;
End;
- EnQueue : Memasukkan satu elemen ke dalam queque.
Procedure Enqueue (elemen : Byte);
Begin
If Empty then
Begin
Head := 1;
Tail := 1;
Queue [Head] := elemen;
End;
Else
If Not Full then
Begin
Inc(Tail);
Queue[Tail] := Elemen;
End;
End;

26
- DeQueue : Mengambil satu elemen dari queque, operasi ini sering disebut SERVE.
Procedure Dequeue;
Var 1 := Byte;
Begin
If Not Empty then
Begin
For I := Head to Tail-1 do;
Queue [i] := Queue[i+1];
Dec(Tail);
End;
End;

- Clear : Menghapus semua elemen dalam queue.


Procedure Clear;
Begin
White not empty then;
Dequeue;
End;

b) Circular Array
Merupakan suatu array yang dibuat seakan-akan merupakan sebuah lingkaran
dengan titik awal (head) dan titik akhir (tail) saling bersebelahan jika array tersebut
masih kosong.
Operasi-operasi pada Queue dengan Circular Array :
- Create : Menciptakan Queue yang baru dan kosong.
Procedure Create;
Begin
Head : = 1;
Tail := MaxQueue;
End;

27
- Empty : Mengecek apakah Queue masih kosong atau sudah berisi data.
Function Empty : Boolean;
Begin
If (Tail Mod MaxQueue) + 1 = Head then
Empty := True;
Else
Empty := False;
End;
- Full: Mengecek apakah Queue sudah penuh atau masih bisa menampung data.
Function Full : Boolean;
Var X : 1..Maxqueue;
Begin
X := (Tail Mod MaxQueue) + 1;
If (X Mod MaxQueue) + 1 = Head then
Full := True
Else
Full := False;
End;
- EnQueue : Memasukkan satu elemen ke dalam queque. (Tail dan Head mula-mula
adalah nol).
Procedure EnQueue (elemen : TypeElement);
Begin
If Not Full then
Begin
Tail := (Tail Mod MaxQueue) + 1;
Queue[Tail] := Elemen;
Queue [Head] := elemen;
End;
End;
- DeQueue : Mengambil satu elemen dari Queque.
Procedure Dequeue;

28
Begin
If Not Empty then
Head := (Head Mod MaxQueue) + 1;
End;

Implementasi Queue dengan Double Linked List


Type Point =^Simpul;
Simpul = Record
Isi : Tipedata;
Next : Point;
End;
Queue = Record
Head : Point;
Tail : Point;
End;
Var Q : Queue
N : 0..MaxQueue; {jumlah antrian}

Operasi-operasi Pembuatan Queue dengan Double Linked List :


- Create : Menciptakan Queue yang baru dan kosong dengan mengarahkan pointer
head dan tail kepada NIL.
Procedure Create;
Begin
Q.Head : = NIL;
Q.Tail := Q.Head;
N := 0;
End;

- Empty : Mengecek apakah Queue masih kosong atau sudah berisi data.
Function Empty : Boolean;

29
Begin
If Q.Head = Nil then
Empty := True;
Else
Empty := False;
End;
- Full: Mengecek apakah Queue sudah penuh atau masih bisa menampung data.
Function Full : Boolean;
Begin
If N = MaxQueue then
Full := True
Else
Full := False;
End;
- EnQueue : Memasukkan satu elemen ke dalam queque. (Tail dan Head mula-mula
adalah Nil).
Procedure EnQueue (elemen : TypeData);
Var Now : Point;
Begin
If Not Full then
Begin
New (Now);
Now^.Isi := Elemen;
Now^.Next := Nil;
If Empty then
Begin
Q.Head := Now;
Q.Tail := Now;
N := 1;
End Else
Begin
Q.Tail^.Next := Now;

30
Q.Tail := Now;
Inc (N);
End;
End;
End;
- DeQueue : Mengambil satu elemen dari Queque.
Procedure Dequeue;
Var Now : point;
Begin
If Not Empty then
Begin
Now := QHead;
Q.Head := Q.Head^..Next;
Dispose (Now);
Dec(N);
End;
End;
Programnya :
Program antrian;
uses crt;
Type
list=^node;
node=record
isi:char;
next:List;
end;
Queue=record
depan,belakang:List;
end;
{--------------------------------------------------------------------}
Procedure initQueue(var q:queue);
begin
q.depan:=nil; q.belakang:=nil;
end;
{--------------------------------------------------------------------}
Procedure EnQueue(data:char; var Q:queue);
var b:list;
begin
new(b); b^.isi:=data; b^.next:=nil;

31
if q.belakang=nil then begin
q.belakang:=b;q.depan:=b;
end else begin
q.belakang^.next:=b; q.belakang:=b;
end;
end;
{--------------------------------------------------------------------}
Procedure Dequeue(var q:queue; var hasil:char);
var b:list;
begin
if q.depan <> nil then begin
hasil:=q.depan^.isi; b:=q.depan;
q.depan:=b^.next; dispose(b);
if q.depan=nil then q.belakang:=nil;
end;
end;
{--------------------------------------------------------------------}
var x:char;
q:queue;
begin
clrscr;
initqueue(q);
writeln('Memasukkan data ke dalam queue');
repeat
write('Nilai data : ');x:=upcase(readkey);writeln(x);
if x<>#13 then EnQueue(x,Q);
until x=#13;
writeln;
readln;
writeln('Pengambilan data dari queue yang pertama kali');
while q.depan<>nil do
begin
deQueue(Q,x);writeln(x);
end;
readln;
writeln('Pengambilan data dari queue yang kedua kali');
while q.depan<>nil do
begin
deQueue(Q,x);writeln(x);
end;
end.

32
Output :

33
6. POINTER

Tipe data pointer bersifat dinamis, variabel akan dialokasikan hanya pada saat
dibutuhkan dan sesudah tidak dibutuhkan dapat didealokasikan kembali.
Pendeklarasian variabel pointer tidak jauh berbeda dengan pendeklarasian
variabel biasa, hanya perlu ditambahkan symbol (^) sebelum tipe data. Simbol tersebut
menunjuk ke lokasi tertentu pada memori.

Deklarasi Variabel Pointer


Bentuk Umum :
Var NamaVariabel :^TipeData;
(Bertipe Pointer)
Type NamaPointer =^NamaRecord;
NamaRecord : Record
Item1 : TipeData1;
Item2 : TipeData2;
End;
Var NamaVariabel : NamaPointer;
Variabel pointer adalah suatu variabel yang menuju ke alamat memori yang
digunakan untuk menampung data yang akan diproses.
Programnya :
program pointer2;
uses crt;
type
penunjukkaryawan=^catatankaryawan;
catatankaryawan=record
kode:string[5];
nama:string[25];
gaji:real;
end;
var
datakaryawan1,datakaryawan2,datakaryawan3,datakaryawan4:penunjukkaryawan;
begin
clrscr;
writeln('Masukkan 4 buah data karyawan:');
writeln;
writeln('Karyawan ke 1:');
new(datakaryawan1);

34
with datakaryawan1^ do
begin
write('Kode karyawan?');readln(kode);
write('Nama karyawan?');readln(nama);
write('Gaji karyawan?');readln(gaji);
end;

writeln;
writeln('Karyawan ke 2:');
new(datakaryawan2);
with datakaryawan2^ do
begin
write('Kode karyawan?');readln(kode);
write('Nama karyawan?');readln(nama);
write('Gaji karyawan?');readln(gaji);
end;

writeln;
writeln('Karyawan ke 3:');
new(datakaryawan3);
with datakaryawan3^ do
begin
write('Kode karyawan?');readln(kode);
write('Nama karyawan?');readln(nama);
write('Gaji karyawan?');readln(gaji);
end;
writeln;
writeln('Karyawan ke 4:');
new(datakaryawan4);
with datakaryawan4^ do
begin
write('Kode karyawan?');readln(kode);
write('Nama karyawan?');readln(nama);
write('Gaji karyawan?');readln(gaji);
end;

writeln;
writeln('Data karyawan diambil dari heap:');
writeln('--------------------------------');
writeln;
writeln(' Kode Nama gaji');
writeln;
with datakaryawan1^ do writeln(kode:5,nama:20,gaji:12:2);
with datakaryawan2^ do writeln(kode:5,nama:20,gaji:12:2);
with datakaryawan3^ do writeln(kode:5,nama:20,gaji:12:2);
with datakaryawan4^ do writeln(kode:5,nama:20,gaji:12:2);
readln;
end.

35
Output :

36
7. LINKED LIST

7.1 Single Linked List


Dalam pembuatan single linked list dapat menggunakan dua metoda :
1) LIFO (Last In First Out), aplikasinya : Stack (Tumpukan).
Merupakan suatu metoda pembuatan linked list dimana data yang masuk
paling akhir adalah data yang keluar paling awal.
Pendeklarasian Type;
Type Point = ^RecPoint;
RecPoint = Record
Isi : TipeData;
Next : Point;
End;
Var Head, Tail, Now : Point;

- Procedure Insert
Menambahkan sebuah simpul baru ke dalam suatu linked list.
Procedure Insert (elemen : TipeData);
Var Now : Point;
Begin
New (Now);
Now^.Isi := elemen;
If Head = Nil then
Now^.Next := Nil;
Else
Now^.Next := Head;
Head := Now;
End;

2) FIFO (First In First Out), Aplikasinya : Queue (Antrian)


Merupakan metoda pembuatan linked list dimana data yang masuk paling
awal adalah data yang keluar paling awal juga.

37
- Procedure Insert
Menambahkan sebuah simpul baru ke dalam suatu linked list.
Procedure Insert (element :TipeData);
Var Now : Point;
Begin
New (Now);
If Head = Nil then
Head := Now;
Else
Tail^.Next := Now;
Tail := Now;
Tail^.Next := Nil;
Now^.Isi := Elemen;
End;

Procedure dan Function Linked List Lainnya


- Create : Membuat sebuah linked list yang baru dan masih kosong.
Procedure Create;
Begin
Head := Nil;
Tail := Nil;
End;

- Empty : Function untuk menentukan apakah linked list kosong atau tidak.
Function Empty : Boolean;
Begin
If Head = Nil then
Empty := true
Else
Empty := false;
End;

38
- Find First : Mencari elemen pertama dari linked list.
Procedure Find_First;
Begin
Now := Head;
End;

- Find Next : Mencari elemen sesudah elemen yang ditunjuk now.


Procedure Find_Next;
Begin
If Now^.Next < > Nil then
Now := Now^.Next;
End;

- Retrieve : Mengambil elemen yang ditunjuk oleh now. Elemen tersebut lalu
ditampung pada satu variabel.
Procedure Retrieve (var r : TipeData);
Begin
r := Now^.Isi;
End;

- UpDate : Mengubah elemen yag ditunjuk oleh Now dengan isi dari suatu
variabel.
Procedure UpDate (u : TipeData);
Begin
Now^.Isi := u;
End;

- Delete Now : Menghapus elemen yang ditunjuk oleh Now. Jika yang
dihapus adalah elemen pertama dari linked list, maka head akan berpindah
ke elemen berikut.

39
Procedure Delete_Now;
Var x : Point;
Begin
If Now < > Head then
Begin
x := Head;
While x^.next < > Now do
x := x^.next;
x^.next := Now^.next;
End
Else
Head := Head^.next;
Dispose (Now);
Now := Head;
End;

- Delete Head : Menghapus elemen yang ditunjuk head. Head berpindah ke


elemen sesudahnya.
Procedure DeleteHead;
Begin
If Head < > Nil then
Begin
Now := Head;
Head := Head^.next;
Dispose (Now);
Now := Head;
Now^.next := Head;
Head := Now;
Head^.Prev := Nil;
End;
End;

40
- Delete After : Menghapus simpul dari belakang.
Procedure DeleteAfter;
Var Now : Point;
Begin
Now := Tail;
If Now < > Head then
Begin
Tail := Now^.Prev;
Tail^.Next := Nil;
End Else
Begin
Tail := Nil;
Head := Nil;
End;
If Now < > nil then Dispose (Now);
End;

- Delete Before : Kebalikan dari procedure Delete After, menghapus simpul


dari depan.
Procedure DeleteBefore;
Var Now : Point;
Begin
Now := Head;
If Now < > Tail then
Begin
Head := Now^.next;
Head^.Prev := Nil;
End;
Else
Begin
Tail := Nil;
Head := Nil;

41
End;
If Now < > Nil then dispose (Now);
End;

- Delete At Position : Menghapus simpul pada posisi yang diinginkan, yang


memerlukan 2 buah variabel pointer.
Procedure DeleteAtFos;
Var Bantu1, Bantu2 : Point;
Begin
Bantu1 := Now^.Prev;
Bantu2 := Now^.Next;
If Bantu1 < > Nil then
Bantu1^.Next := Bantu2
Else
Head := Bantu2;
If Bantu2 < > Nil then
Bentu2^.Prev := Bantu1
Else
Tail := Bantu 1,
If Now < > Nil then Dispose (Now);
End;
Programnya :
program linklistLIFO;
uses crt;
type
penunjuk=^recnama;
recnama=record
nama:string[15];
berikut:penunjuk;
end;
var
datanama,
namaawal:penunjuk;
lagi:char;
begin
clrscr;
namaawal:=nil;

42
lagi:=' ';
repeat
new(datanama);
write('Nama ?');readln(datanama^.nama);
datanama^.berikut:=namaawal;
namaawal:=datanama;
write('Menambah data lagi (Y/T)?');readln(lagi);
writeln;
until upcase(lagi)<>'Y';

writeln('Menampilkan kembali isi dari daftar berkait:');


writeln('--------------------------------------------');
datanama:=namaawal;
while datanama<>nil do
begin
writeln(datanama^.nama);
datanama:=datanama^.berikut;
end;
readln;
end.

Output :

7.3 Circular Double Linked List


Merupakan double linked list yang simpul terakhirnya menunjuk ke simpul awal
dan simpul awalnya menunjuk ke simpul akhir sehingga membentuk suatu
lingkaran.
Operasi-operasi pada Circular Double Linked List

43
- Insert After : Berguna untuk menambah simpul di belakang pada sebuah double
linked list.
Procedure InsertAfter (e : elemen_Type);
Var Now : Point;
Begin
New(Now);
If Head = Nil then
Head := Now;
Else
Begin
Now^.Prev := Tail;
Tail^.Next := Now;
End;
Now^.Isi := e;
Tail := Now;
Tail^.Next := Head;
Head^.Prev := Tail;
End;

- Insert Before : Menambah simpul di depan (Sebelah kiri).


Procedure InsertBefore (e : elemen_Type);
Begin
If Head = Nil then
Begin
Head := Now;
Tail := Now;
End Else
Else
Begin
Now^.Prev := Head;
Head^.next := Now;
End;

44
Now^.Isi := e;
Now^.next := Tail;
Tail^.Prev := Now;
Tail := Now;
End;
- Delete After : Menghapus simpul dari belakang
Procedure DeleteAfter;
Var Now : Point;
Begin
Now := Tail;
If Head = Tail then
Begin
Tail := Nil;
Head := Nil;
End Else
Begin
Tail := Now^.Prev;
Tail^.Next := Head;
Head^.Prev := Tail;
End;
If Now < > nil then Dispose (Now);
End;

- Delete Before : Kebalikan dari procedure Delete After, menghapus simbul dari
depan.
Procedure DeleteBefore;
Var Now : Point;
Begin
Now := Head;
If Head = Tail then
Begin
Tail := Nil;

45
Head := Nil;
End else
Begin
Head := Now^.Next;
Head^.Prev := Tail;
Tail^.Next := Head;
End;
If Now < > Nil then dispose (Now);
End;

- Delete At Position : Menghapus simpul pada posisi yang diinginkan, yang


memerlukan 2 buah variabel pointer.
Procedure DeleteAtPos;
Var Bantu1, Bantu2 : Point;
Begin
Bantu1 := Now^.Prev;
Bantu2 := Now^.Next;
If Bantu1 < > Now then
Begin
Bantu1^.Next := Bantu2;
Bantu2^.Prev := Bantu1;
If Bantu2 = Tail then Head := Bantu1;
If Bantu2 = Head then Tail := Bantu2;
End Else
Begin
Head := Nil;
Tail := nil;
End;
If Now < > Nil then Dispose (Now);
End;
- UpDate : Mengganti isi suatu simpul dengan data yang lain.
Procedure UpDate (x, y : Elemen_Type);

46
Begin
Cari(x);
Now^.Isi := y;
End;
Programnya :
program linklistFIFO;
uses crt;
type penunjuksimpul=^simpul;
simpul=record
kode:string[5];
nama:string[15];
banyak:word;
harga:real;
berikut:penunjuksimpul;
end;
var
databrg,
simpulawal,
simpulakhir:penunjuksimpul;
lagi:char;
begin
clrscr;
mark(databrg);
simpulawal:=databrg;
simpulakhir:=databrg;
lagi:='Y';
while upcase(lagi)='Y' do
begin
new(databrg);
write('Kode barang ? ');readln(databrg^.kode);
write('Nama barang ? ');readln(databrg^.nama);
write('Banyak barang ? ');readln(databrg^.banyak);
write('Harga barang ? ');readln(databrg^.harga);
simpulakhir^.berikut:=databrg;
databrg^.berikut:=nil;
simpulakhir:=databrg;
write('Ada lagi (Y/T)?');readln(lagi);
writeln;
end;
writeln(' Kode Nama Barang Banyaknya Harga ');
writeln;
databrg:=simpulawal;
while databrg<>nil do
begin
with databrg^ do
begin

47
writeln(kode:5,nama:15,banyak:11,harga:12:2);
databrg:=berikut;
end;
end;
readln;
end.

Output :

48
8. TREE

Merupakan salah satu bentuk struktur data tidak linear yang menggambarkan
hubungan yang bersifat hierarkis (hubungan one to many) antara elemen-elemen. Tree
bisa didefinisikan sebagai kumpulan simpul/node dengan satu elemen khusus yang
disebut root dan node lainnya terbagi menjadi himpunan-himpunan yang saling tak
berhubungan satu sama lain (Subtree).
a. Predecessor : Node yang berada di atas node tertentu.
b. Successor : Node yang berada di bawah node tertentu.
c. Ancestor : Seluruh node yang terletak sebelum node tertentu dan terletak pada
jalur yang sama.
d. Descendant : Seluruh node yang terletak sesudah node tertentu dan terletak pada
jalur yang sama.
e. Parent : Predecessor satu level di atas satu suatu node.
f. Child : Successor satu level di bawah suatu node.
g. Sibling : Node-node yang memiliki parent yang sama dengan suatu node.
h. Subtree : Bagian dari tree yang berupa suatu node beserta descendantnya dan
memiliki semua karakteristik dari tree tersebut.
i. Size : Banyaknya node dalam satu tree.
j. Height : Banyaknya tingkatan/level dalam suatu tree.
k. Root : Satu-satunya node khusus dalam tree yang tak punya predecessor.
l. Leaf : Node-node dalam tree yang tak memiliki successor.
m. Degree : Banyaknya child yang dimiliki suatu node.

B C

D E F G

49
Ancestor (F) :C
Descendent (C) :G
Parent (D) :B
Child (A) : B; C
Sibling (F) :G
Size :7
Height :3
Root :A
Leaf : D, E, F, G
Degree (C) :2

Beberapa Jenis Tree yang Memiliki Sifat Khusus


1. Binary Tree
Binary Tree adalah tree dengan syarat bahwa tiap mode hanya boleh memiliki
maksimal dua subtree dan kedua subtree tersebut harus terpisah. Sesuai dengan
definisi tersebut, maka tipa node dalam binary tree hanya boleh memiliki paling
banyak child.
A

B C

D E F G

H I J

Jenis-jenis Binary Tree :


a. Full Binary Tree
Binary Tree yang tiap nodenya (kecuali leaf) memiliki dua child dan tiap subtree
harus mempunyai panjang path yang sama.

50
A

B C

b. Complete Binary Tree


Mirip dengan Full Binary Tree, namun tiap subtree hanya boleh memiliki
panjang path yang berbeda. Node kecuali leaf memiliki 0 atau 2 child.

B C

D E

c. Skewed Binary Tree


Binary Tree yang semua nodenya (kecuali leaf) hanya memiliki satu child.

A D

B E

C F

Implementasi Binary Tree


Binary Tree dapat diimplementasikan dalam pascal dengan menggunakan
double linked list. Untuk nodenya, bisa dideklarasikan sebagai berikut :
Type Tree = ^Node;
Node = Record
Isi : TipeData;
Left, Right : Tree;
End;
Contoh ilustrasi Tree yang disusun dengan double linked list :

51
Root

Left Right

LeftLeft RightLeft LeftRight RightRight

Operasi-operasi pada Binary Tree :


 Create : membentuk sebuah tree baru yang kosong. pohon = NULL;
 Clear : menghapus semua elemen tree. pohon = NULL;
 Empty : mengetahui apakah tree kosong atau tidak. int isEmpty(Tree
*pohon. {if(pohon = NULL) return 1; else return 0;}
 Insert : menambah node ke dalam Tree secara rekursif. Untuk data
pertama akan menjadi elemen root.
 Find : mencari node di dalam Tree secara rekursif sampai node
tersebut ditemukan dengan menggunakan variabel bantuan ketemu.
Syaratnya adalah tree tidak boleh kosong.
 Update : Mengubah isi dari node yang ditunjuk oleh pointer current (Tree
tidak boleh kosong).
 Retrieve : Mengetahui isi dari node yang ditunjuk oleh pointer current.
(Tree tidka boleh kosong).
 DeleteSub : Menghapus sebuah sub tree (node beserta seluruh
descendentnya) yang ditunjuk current. Tree tidak boleh kosong. Setelah itu
pointer current akan berpindah ke parent dari node yang dihapus.
 Characteristic : Mengetahui karakteristik dari suatu tree, yakni : size,
height, serta average lenghtnya. Tree tidak boleh kosong. (Average Length =
[JmlNodeLvl] * 1 + JmlNodeLvl2 * 2 + ... + JmlNodeLvln*n] / size)
 Traverse : yaitu operasi kunjungan terhadap node-node dalam pohon
dimana masing-masing node akan dikunjungi sekali.

Langkah-langkah traverse :
PreOrder : cetak node yang dikunjungi, kunjungi left, kunjungi right.

52
InOrder : kunjungi left, cetak node yang dikunjungi, kunjungi right.
PostOrder : kunjungi left, kunjungi right, cetak node yang dikunjungi.

Notasi Matematika
Misalkan suatu ekspresi berikut : 3 + 2 * 5 – 4

Prefiks : - + 3 * 2 5 4
Infiks : 3 + 2 * 5 – 4
Prefiks : 3 2 5 * ÷ 4
+ 4

3 x

2 5

Ilustrasi operasi Insert :


1. Insert (root, 65)

65

2. Insert (leftchild, 5)

65

3. Find Root
4. Insert (rightchild, 70)

65

5 70

53
5. Find root
6. Insert (left, 3)

65

5 70

7. Insert (right, 10)


65

5 70

5 10

Programnya :

uses crt;
type
ptr=^Simpul;
simpul=record
data:integer;
kanan,kiri:ptr;
end;
{--------------------------------------------------------------------}
procedure Init(var p:ptr);
begin
clrscr;
p:=nil;
end;
{--------------------------------------------------------------------}
procedure masukdata(var p:ptr; d:integer);
begin
if p=nil then
begin
new(p);
p^.data:=d;
p^.kiri:=nil;
p^.kanan:=nil;
end
else

54
if p^.data < d then
masukdata(p^.kanan,d)
else

masukdata(p^.kiri,d);
end;
{--------------------------------------------------------------------}
procedure postorder(p:ptr;var ka:integer);
begin
if p<>nil then
begin
postorder(p^.kiri,ka);
postorder(p^.kanan,ka);
writeln(p^.data);
end;
end;
{====================Procedure Hitung Sebelah
Kiri===================}
procedure hitungnode(p:ptr;var ka:integer);
begin
if p<>nil then
begin
inc(ka);
hitungnode(p^.kiri,ka);
hitungnode(p^.kanan,ka);
end;
end;
{=============================Program Utama
==========================}
var
pohon,p,T:ptr;
dt,jum,k,ki,ka :integer;
begin
init(pohon);
repeat
write('Data masuk ke :');readln(dt);
if dt <> 0 then
masukdata(pohon,dt);
until dt=0;
writeln;
ki:=0;
hitungnode(pohon^.kiri,ki);
writeln('banyak Simpul sebelah kiri =',ki);
ka:=0;
hitungnode(pohon^.kanan,ka);
writeln('banyak Simpul sebelah kanan=',ka);
writeln('Jumlah simpul = ',ki+ka+1);
readln;
end.

55
Output :

2. Binary Search Tree


Binary Tree dengan sifat bahwa semua left child harus lebih kecil daripada right
child dan parentnya. Juga semua right child harus lebih besar dari left child serta
parentnya. Binary search tree dibuat untuk mengatasi kelemahan pada binary tree
biasa, yaitu kesulitan dalam searching/pencarian node tertentu dalam binary tree.
Contoh :
Data : +45, +56, +30, +50, -45, +54, +34, +55, -30, -34
Insert 45 45
Insert 56 45

56

45
Insert 30
30 56
45
Insert 50
30 56

50

Delete 45 50

30 56
56
Ket : pada operasi di atas, delete dilakukan pada Node dengan dua child, maka
untuk menggantikannya diambil node paling kiri dari right subtree yaitu 50.
Programnya :
Program treedinamis;
uses crt;
Type pohon=^node;
node=record
data:integer;
kiri,kanan:pohon;
end;
var T:pohon;
info:integer;
{--------------------------------------------------------------------}
Procedure Buat_BST(info :integer;var T:pohon);
var
b:pohon;
begin
if T=nil then
begin

new(b);b^.data:=info;b^.kiri:=nil;b^.kanan:=nil;
T:=b;
end
else
begin
if T^.data<info then
Buat_Bst(info,T^.kanan);
if T^.data>info then
Buat_Bst(info,T^.kiri);
end;
end;
{--------------------------------------------------------------------}
Procedure Baca_BST_pre(b:pohon);
begin
if (b<>nil) then
begin
write(b^.data);
Baca_BST_pre(b^.kiri);
Baca_BST_pre(b^.kanan);
end;
end;
{--------------------------------------------------------------------}
Procedure Baca_BST_in(b:pohon);

57
begin
if (b<>nil) then
begin
Baca_BST_in(b^.kiri);
write(b^.data);
Baca_BST_in(b^.kanan);
end;
end;
{--------------------------------------------------------------------}
Procedure Baca_BST_post(b:pohon);
begin
if (b<>nil) then
begin
Baca_BST_post(b^.kiri);
Baca_BST_post(b^.kanan);
write(b^.data);
end;
end;
{--------------------------------------------------------------------}
begin
clrscr;
new(T);T^.kiri:=nil;T^.kanan:=nil;
writeln('Memasukkan data ke dalam tree');
repeat
write('Nilai data : ');readln(info);
if info<>0 then Buat_BST(info,T);
until info=0;
writeln;
readln;
writeln('Pembacaan secara Pre order');
baca_BST_pre(T);
writeln;
readln;
writeln('Pembacaan secara In order');
baca_BST_in(T);
writeln;
readln;
writeln('Pembacaan secara Post order');
baca_BST_post(T);
writeln;
readln;
end.

58
Output

AVL TREE
Merupakan binary search tree yang memiliki perbedaan tinggi/level antara sub
tree kiri dan subtree kanan maksimal adalah 1. AVL Tree muncul untuk
menyeimbangkan Binary Search Tree. Dengan AVL Tree, waktu pencarian dan bentuk
tree dapat dipersingkat dan disederhanakan.
Selain AVL Tree terdapat pula Height Balanced n Tree, yakni Binary Search
Tree yang memiliki perbedaan level antara subtree kiri dan subtree kanan maksimal
adalah n. Sehingga AVL Tree adalah Height Balanced 1 Tree.
Untuk mempermudah menyeimbangkan tree, maka digunakan simbol-simbol
bantu :
 - (tanda minus) : digunakan apabila subtree kiri lebih panjang dari subtree kanan.
 + (tanda positif) : digunakan apabila subtree kanan lebih panjang dari subtree kiri.
 0 (nol) : digunakan apabila subtree kiri dan subtree kanan mempunyai
height yang sama.

59
9. GRAPH

Merupakan struktur data bentuk jaringan / network dimana hubungan antar


elemennya adalah many to many. Graph terdiri dari :
1. Vertex (Nod/Simpul/Titik)
Elemen graph yang berisi data/informasi.
2. Edge (Arc/Ruas/Garis)
Path yang menghubungkan simpul-simpul.
Jenis-jenis Graph :
a. Graph Terhubung (Connected Graph)
Bila dari sembarang titik atau node yang ada dapat dibuat jalur ke titik lain. Jika
jalur tersebut berakhir pada titik awal, maka akan terbentuk jalur tertutup yang
dalam bentuk sederhana dinamakan dengan lingkaran.
Contoh :

A B
C
E D

b. Graph Tak Terhubung (Unconnected Graph)


Graph yang tidak mempunyai lingkar, sering disebut dengan istilah graph pohon
(tree graph) / pohon bebas / free tree.
Contoh :

A D

B C

c. Graph Berarah (Directed Graph)


Bila edge yang menghubungkan dua node memiliki arah ke satu node.

60
Contoh :
A B

D C

d. Graph tah Berarah (Undirect Graph)


Bila edge yang menghubungkan dua node tidak memiliki arah sehingga bisa
menunjuk ke dua arah.
Contoh :
A B

D C

e. Graph Lengkap (Completed Graph)


Bila dari simpul/titik yang ada bisa dibuat jalur ke semua simpul.
Contoh :

A B
C
E D

Bobot atau Panjang Lintasan


Merupakan jumlah busur dari simpul asal (Vx) ke simpul tujuan (Vy)
Contoh :
4
A B
5 4 3 3

D C
2
Bila simpul asal (Vx) = A
dan simpul tujuan (Vy) = C
tentukan jalur terpanjang dan terpendek !
1. A-B-C = 7
2. A-C = 4 Criticial path : 9
3. A-D-C = 7 Minimum spanning tree : 4
4. A-B-D-C = 9

61
Representasi Graph
1. Adjacency Matrices / Matriks Tetangga
Graph yang dinyatakan dalam matriks n x n dimana n adalah jumlah simpul matriks.
Matriks ini sering disebut dengan istilah matriks bit / matriks boolean.

Kelebihan :
Mudah disimpan, dapat digunakan untuk operasi-operasi aljabar matriks /
menentukan suatu lintasan / suatu siklus.

Kelmahan :
Sulit menyimpan informasi tambahan, dan jumlah simpul harus sudah ditentukan
sebelumnya.

2. Adjacency List
Graph yang dinyatakan dengan linked list / senarai berantai.

Programnya :
program menampilkan_grafik;
uses crt;
type tahun=array[1..6] of byte;
procedure input(var thn:tahun);
var i:byte;
begin
clrscr;
gotoxy(5,1);write('Data Jutaan');
for i:=1 to 6 do
begin
repeat
gotoxy(5,2+i);write('tahun',i,':');
gotoxy(17,2+i);clreol;
gotoxy(17,2+i);readln(thn[i]);
until (thn[i]>0) and (thn[i]<16);
end;
end;
procedure gambar(thn:tahun);
var i,j:byte;
begin
for i:=0 to 14 do
begin
gotoxy(35,2+i);write(15-i:2,'|');

62
end;
gotoxy(36,17);write(0,' ');
for i:=1 to 35 do write('-');
gotoxy(39,18);write('1995 1996 1997 1998 1999 2000');
gotoxy(41,21);write('Jumlah penduduk Jakarta');
for i:=1 to 6 do
for j:=1 to thn[i] do
begin
gotoxy(33+i*6,17-j);write('###');
end;
readkey;
end;
var data:tahun;
begin
input(data);
gambar(data);
end.

Output :

63
10. SORTING

Sort adalah pengurutan data yang sebelumnya disusun secara acak sehingga
menjadi tersusun secara teratur menurut suatu aturan tertentu.
Pada umumnya terdapat dua jenis pengurutan :
1. Ascending (Naik)
2. Descending (Turun)
Beberapa Metoda Sorting :
a. Bubble/Exchange Sort
Membandingkan elemen yang sekarang dengan elemen yang berikutnya, jika
elemen sekarang > elemen berikutnya, maka tukar.
- Procedure Tukar
Procedure Tukar_Data (Var a, b : Word);
Var c :Word;
Begin
c := a;
a := b;
b := c;
End;

- Procedure Bubble Sort Ascending


Procedure Asc_Bubble (Var data : Array; JmlData : Integer);
Var i,j :Integer;
Begin
For I := 2 to JmlData do
For J := JmlData down to I do
If data[j] < data[j-1] then
TukarData (data[j], data[j-1]);

- Procedure Bubble Sort Descending


Procedure Des_Bubble (var data : Array; JmlData : Integer);

64
Var i,j : Integer
Begin
For I := 2 to JmlData do
For J := JmlData down to I do
If data[j] >data[j-1] then
TukarData (data[j], data[j-1]);
End;
Programnya :
Program Sorting_Bubble;
Uses Crt;
Const
Max = 5;
Type
Arr = Array[1..max] Of Byte;
Var
Data : Arr;
i : Byte;
Procedure Input;
Begin
Clrscr;
Writeln('Masukkan 5 Data ');
Writeln('=================');
For I:=1 To Max Do
Begin
Write('Data Ke :',I,'=');Readln(Data[i]);
End;
Clrscr;
For i:=1 to Max Do
Write(Data[i],' ');
Writeln;
Writeln('=========================');
Writeln('Data Yang telah Diurutkan');
Writeln;
{ Readln;}
End;
Procedure Change (Var a,b :Byte);
Var c:Byte;
Begin
C:=a;a:=b;b:=c;
End;
Procedure Asc_Bubble;
Var
P,Q : Byte;
Flag: Boolean;

65
Begin
Flag:=False;
P:=2;
While (P<Max) And (Not Flag) Do
Begin
Flag:=True;
For Q:=Max Downto P Do
If Data[Q]<Data[Q-1] Then
Begin
Change(Data[Q],data[Q-1]);
Flag:=False;
End;
Inc(i);
End;
Write(' Ascending ');
End;
Procedure Desc_Bubble;
Var
P,Q : Byte;
Flag: Boolean;
Begin
Flag:=False;
P:=2;
While (P<Max) And (Not Flag) Do
Begin
Flag:=True;
For Q:=Max Downto P Do
If Data[Q]>Data[Q-1] Then
Begin
Change(Data[Q],data[Q-1]);
Flag:=False;
End;
Inc(i);
End;
Write('Descending ');
End;
Procedure Output;
Begin
For I:=1 To Max Do
Write(Data[I],' ');
Writeln;
End;
Begin
Input;
Asc_Bubble; Output;
Desc_Bubble; OutPut;
Writeln;
Write('Tekan Enter Untuk Lanjut');
Readln;

66
End.

Output :

b. Selection Sort
Membandingkan elemen yang sekarang dengan elemen yang berikutnya sampai
dengan elemen yang terakhir. Jika ditemukan elemen yang lebih kecil dari elemen
yang sekarang maka dicatat posisinya dan kemudian ditukar.
- Procedure Selection Sort Ascending
Procedure Asc_Selection;
Var Min, Pos : Byte
Begin
For I := 1 to max-1 do
Begin
Pos := I;
For J := i+1 to max do
If data[j] < data[pos] then Pos := j;
If I < > Pos then TukarData (data[i], data[pos]);
End;
End;

- Procedure Selection Sort Descending

67
Procedure Des_Selection;
Var Min, Pos : Byte
Begin
For I := 1 to max-1 do
Begin
Pos := I;
For J := i+1 to max do
If data[j] < data[pos] then Pos := j;
If I < > Pos then TukarData (data[i], data[pos]);
End;
End;
Contoh program selection sort dengan interface grafik-bar horisonral :

c. Insertion Sort
Pengurutan dilakukan dengan cara membandingkan data ke-I (dimana I dimulai dari
data ke-2 sampai dengan data yang terakhir. Jika ditemukan data yang lebih kecil
maka data tersebut disisipkan ke depan sesuai dengan posisi yang seharusnya.
- Procedure Insertion Sort Ascending
Procedure Asc_Insert;
Var i,j, temp : Byte;
Begin
For I := 2 to max do
Begin
Temp := data[i];
J := i-1;
While (data[j]>temp) and (j>0) do
Begin
Data[j+1] := data[j];
Dec(j);
End;
Data[j+1] := temp;

68
End;
End;

- Procedure Insertion Sort Descending


Procedure Ds_Insert;
Var i,j, temp : Byte;
Begin
For I := 2 to max do
Begin
Temp := data[i];
J := i-1;
While (data[j]>temp) and (j>0) do
Begin
Data[j+1] := data[j];
Dec(j);
End;
Data[j+1] := temp;
End;
End;
Contoh Sorting dengan metoda Insertion, Searching dengan metoda Binary :

d. Quick Sort
Membandingkan suatu elemen (disebut pivot) dengan elemen yang lain dan
menyusun sedemikian rupa sehingga elemen-elemen lain yang kecil daripada pivot
tersebut terletak di sebelah kirinya dan elemen-elemen lain yang lebih besar
daripada tersebut terletak pada sebelah kanannya. Sehingga dengan demikian telah
terbentuk dua sublist kiri dan kanan yang kita anggap sebuah list baru dan kita
kerjakan proses yang sama sebelumnya. Demikian seterusnya sampai tidak terdapat
sublist lagi. Sehingga di dalamnya telah terjadi proses rekursif.
- Procedure Quick Sort dengan nilai paling kiri sebagai pembanding (pivot)
Procedure Asc_Quick (L, R : Integer);

69
Var I,J : Integer;
Begin
If L<R then
Begin
I := L; J := R+1;
Repeat
Repeat inc(i) until data[i] >= data[1];
Repeat dec(j) until data[j] <= data[1];
If I < J then TukarData (data[i], data[j]);
Untuk I > j;
TukarData (data[1], data[j]);
Asc_Quick (L, j-1);
Ascc_Quick (j+1, R);
End;
End;

- Procedure Quick Sort Desending


Procedure Asc_Quick (L, R : Integer);
Var I,J : Integer;
Begin
If L<R then
Begin
I := L; J := R+1;
Repeat
Repeat inc(i) until data[i] >= data[1];
Repeat dec(j) until data[j] <= data[1];
If I < J then TukarData (data[i], data[j]);
Untuk I > j;
TukarData (data[1], data[j]);
Asc_Quick (L, j-1);
Ascc_Quick (j+1, R);
End;

70
End;

- Procedure Quick_sort dengan nilai tengah sebagai pembanding (pivot)


Procedure Des_Quick (L, R : Integer);
Var Mid I,J : Integer;
Begin
I := L; J := R+1; Mid := data[(L+R div 2];
Repeat
While data[i] < Mid do inc(i);
While data[j] < Mid do dec(j);
If I <= j then
Begin
Change (data[i], data[j]);
Inc(i); dec(j);
End;
Until I > j;
If L < J then Asc_Quick (L,J);
If L < R then Asc_Quick (I,R);
End;

- Procedure Quick Sort Descending


Procedure Des_Quick (L, R : Integer);
Var Mid I,J : Integer;
Begin
I := L; J := R+1; Mid := data[(L+R div 2];
Repeat
While data[i] < Mid do inc(i);
While data[j] < Mid do dec(j);
If I <= j then
Begin
Change (data[i], data[j]);
Inc(i); dec(j);

71
End;
Until I > j;
If L < J then Asc_Quick (L,J);
If L < R then Asc_Quick (I,R);
End;

Programnya :
program progquicksort;
uses crt;
type
tipelarik=string;
larikurut=array[1..100] of tipelarik;
procedure quicksort(var x:larikurut;
bawah,atas:word);
var
i,j:word;
sementara:tipelarik;
begin
while atas>bawah do
begin
i:=bawah;
j:=atas;
sementara:=x[bawah];
{memecah larik menjadi dua bagian}
while i<j do begin
while x[j]>sementara do j:=j-1;
x[i]:=x[j];
while (i<j) and (x[i]<=sementara) do i:=i+1;
x[j]:=x[i];
end;

x[i]:=sementara;
{urutkan rekursi}
quicksort(x, bawah, i-1);
bawah:=i+1;
end;
end;

var
data:larikurut;
n,i:word;
begin
clrscr;
write('Jumlah data yang akan diurutkan?');readln(n);
writeln;

72
writeln('Masukkan data:');
for i:=1 to n do begin
write('Data ke',i,'?');readln(data[i]);
end;
{urutkan dengan prosedure quicksort}
quicksort(data,1,n);
{tampilkan data yang telah urut}
writeln;
writeln('Data yang telah urut:');
writeln('---------------------');
for i:=1 to n do
writeln(data[i]);
readln;
end.

Output :

73
11. SEARCHING

Dalam searching akan dibahas metoda pencarian data dalam suatu array, baik
pada array yang sudah terurut maupun yang belum terurut. Metode pencarian yang akan
digunakan adalah :
1. Sequential Search
Metode ini sering disebut pencarian beruntun dapat digunakan untuk melakukan
pencarian data baik pada array yang sudah terurut maupun yang belum terurut.
Proses yang terjadi pada metode pencarian ini adalah sebagai berikut :
1) Membaca array data.
2) Menentukan array yang dicari.
3) Mulai dari data yang pertama sampai dengan data yang terakhir, data yang dicari
dibandingkan dengan masing-masing data di dalam array.
a. Jika data yang dicari tidak ditemukan maka semua data atau elemen array
dibandingkan sampai selesai.
b. Jika data yang dicari ditemukan maka perbandingan akan dihentikan.
Programnya :
program sequential_searh2_boolean;
uses crt;
const nmax=100;
type tabinteger=array[1..nmax] of integer;
var
tabint:tabinteger;
jml_data,data,indeks:integer;
found:boolean;
cari:char;
procedure inputdata(n:integer; var t:tabinteger);
var
i:integer;
begin
for i:=1 to n do
begin
write ('nilai ke - ',i,' : ');
readln(t[i]);
end;
end;
procedure seqsearch(t :tabinteger; n,x :integer;var idx:integer);
var i:integer;
begin
i:=1;

74
found :=false;
while (i<=n) and (not found) do
begin
if t[i]=x then
found:=true
else
i:=i+1;
end;
if found then
idx:=i
else
idx:=0;
end;
begin
clrscr;
write('banyaknya integer : ');readln(jml_data);
inputdata(jml_data,tabint);
repeat
write('data yang akan dicari : ');readln(data);
seqsearch(tabint, jml_data,data,indeks);
if indeks=0 then
writeln('data tidak ditemukan')
else
writeln('data ditenukan pada posisi ke-',indeks);
write('cari data lagi (y/t) ? ');readln(cari);
until(cari='t')or (cari='T');
readln;
end.

Output :

75
2. Binary Search
Metoda ini sering juga disebut pencarian biner, hanya digunakan untuk pencarian
data pada array yang sudah teurut. Proses yang terjadi pada pencarian dengan
metoda ini adalah sebagai berikut :
1. Membaca array data.
2. Apabila array belum terurut, maka diurutkan terlebih dahulu.
3. Menentukan data yang akan dicari.
4. Menentukan elemen tengah dari array.
5. Jika nilai elemen tengah sama dengan data yang dicari maka pencarian selesai.
6. Jika nilai elemen tengah tidak sama dengan data yang dicari maka :
a. Jika nilai elemen tengah lebih besar daripada data yang dicari maka
pencarian dilakukan pada setengah array pertama.
b. Jika nilai elemen tengah lebih kecil daripada data yang dicari maka
pencarian dilakukan pada setengah array berikutnya.
Programnya :
program progcaribiner;
uses crt;
type
tipelarik=word;
larik=array[1..8] of tipelarik;
procedure caribiner( x :larik;
cari:tipelarik;
bawah,atas:word;
var urutketemu:word);
var
tengah:word;
begin
if bawah>atas then
urutketemu:=0
else
begin
tengah:=(bawah+atas)div 2;
if cari=x[tengah] then
urutketemu:=tengah
else
if cari<x[tengah] then
caribiner(x,cari,bawah,tengah-1,urutketemu)
else
caribiner(x,cari,tengah+1,atas,urutketemu)
end;
end;

76
type
stringnama=string[20];
const
nomermhs:larik=(1,2,3,4,5,6,7,8);
namamhs:array[1..8] of stringnama=('Arief','Hadi','Dewi','Cakil','Joni','eni','Badu','Amir');
var
cari:word;
ketemu:word;
lagi:char;
begin
lagi:='Y';
while upcase(lagi)='Y' do
begin
clrscr;
write('Nomer mahasiswa yang dicari?');readln(cari);
writeln;
caribiner(nomermhs,cari,1,8,ketemu);
if ketemu=0 then
writeln('Tidak ada nomer mahasiswa ini!!!')
else
begin
writeln('Nomer mahasiswa:',nomermhs[ketemu]);
writeln('Nama mahasiswa:',namamhs[ketemu]);
end;
writeln;
write('Cari yang lain lagi (y/t)?');readln(lagi);
end;
end.

Output :

77
78
DAFTAR ISI

Bab 1 Struktur Data .............................................................................................. 04


Bab 2 Variabel Dan Tipe Data .............................................................................. 05
Bab 3 Array ........................................................................................................... 11
3.1 Array Satu Dimensi ............................................................................. 11
3.2 Array Dua Dimensi ............................................................................. 12
3.3 Array Multi Dimensi ........................................................................... 16
Bab 4 Stack ........................................................................................................... 19
4.1 Single Stack dengan Array .................................................................. 19
4.2 Double Stack dengan Array ................................................................ 21
4.3 Stack dengan Single Linked List ......................................................... 23
Bab 5 Queue .......................................................................................................... 29
5.1 Implementasi Queue dengan Array ..................................................... 29
5.1.1 Linear Array .............................................................................. 29
5.1.2 Circular Array ........................................................................... 31
5.2 Implementasi Queue dengan Double Linked List ............................... 33
Bab 6 Pointer ........................................................................................................ 42
Bab 7 Linked List ................................................................................................. 48
7.1 Single Linked List ............................................................................... 48
7.2 Double Linked List .............................................................................. 52
7.3 Circular Double Linked List ............................................................... 56
Bab 8 Tree ............................................................................................................. 64
8.1 Tree ...................................................................................................... 64
8.2 AVL Tree ............................................................................................ 73
Bab 9 Graph .......................................................................................................... 75
Bab 10 Sorting ........................................................................................................ 79
10.1 Bubble Sort ........................................................................................ 79
10.2 Selection Sort .................................................................................... 83
10.3 Insertion Sort ..................................................................................... 86
10.4 Quick Sort .......................................................................................... 90

79
Bab 11 Searching .................................................................................................... 96
11.1 Metoda Sequential Search ................................................................. 96
11.2 Metoda Binery Search ....................................................................... 97

80
Struktur
Data
Menggunakan Turbo Pascal

Disusun oleh :

Bay Haqi, M.Kom


NIDN : 0330037503

UNIVERSITAS INDRAPRASTA PGRI (UNINDRA)


JAKARTA 2013

81
82

Anda mungkin juga menyukai