M O D U L P R A K T I K U M
STRUKTUR DATA
TIM DOSEN
Yulison Herry, C., S.T., M.T Ridwan Ilyas, S.Kom., M.T Wina Witanti, S.T., M.T.
L A B O R A T O R I U M J U R U S A N I N F O R M A T I K A
TERAKREDITASI “B” SK.DIRJEN DIKTI: 8304/SK/BAN-PT/Ak-PPJ/S/XII/2020
Jl. Terusan Jend. Sudirman, PO BOX 148 Cimahi Selatan, Kota Cimahi, Jawa Barat 40531
http://if.unjani.ac.id | e-mail: informatika@unjani.ac.id
STRUKTUR DATA
OLEH : TIM DOSEN
DAFTAR ISI
DAFTAR ISI.............................................................................................................................. 1
MODUL 1 PERKENALAN ADT ............................................................................................. 2
MODUL 2 ADT LINE............................................................................................................. 16
MODUL 3 ADT TabInt (Tabel Integer) .................................................................................. 20
MODUL 4 ADT Linear Linked List ........................................................................................ 24
MODUL 5 ADT Stack Representasi Kontigu ......................................................................... 35
MODUL 6 ADT Queue Representasi Kontigu “Non Circular” .............................................. 44
MODUL 7 ADT Queue Representasi Kontigu “Circular” ...................................................... 55
MODUL 8 ADT Double Linked List ...................................................................................... 64
MODUL 9 ADT Binary Tree (BTree) ..................................................................................... 74
MODUL 10 Persoalan Struktur Data ....................................................................................... 81
REFERENSI ............................................................................................................................ 81
Halaman
1 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
ADT adalah definisi TYPE dan sekumpulan PRIMITIF (operasi) terhadap TYPE tersebut.
Selain itu, dalam sebuah ADT yang lengkap, disertakan juga definisi juga definisi invarian
dari TYPE dan operasi yang berlaku bagi type tersebut. ADT merupakan definisi statik.
Definisi type dari sebuah ADT dapat mengandung sebuah definisi ADT lain.
Type diterjemahkan menjadi type terdefinisi dalam bahasa yang bersangkutan, misalnya
menjadi struct dalam bahasa C.
Primitif adalah konteks prosedural, diterjemahkan menjadi fungsi atau prosedur. Primitif
dikelompokkan menjadi:
- Kontruktor, pembentukan nilai type (biasanya namanya diawali dengan Create)
- Selector, untuk mengakses komponen dari type (biasanya namanya diwali dengan Get)
- Pengubahan nilai, untuk mengubah nilai komponen (biasanya namanya diwali dengan Set)
- Destruktor, untuk “menghancurkan” nilai objek (dealokasi memori)
- Baca/tulis, untuk interface dengan input/output device
- Operator relasional, melakukan operasi relasional (lebih besar, lebih kecil, sama dengan
dsb)
- Aritmatika terhadap type, operasi aritmatika terhadap type hanya terdefinisi untuk tipe
numerik.
- Konversi type, yaitu konversi type tersebut ke type dasar dan sebaliknya
Implementasi ADT
ADT diimplementasikan menjadi dua buah modul, yaitu:
1. Definisi/ spesifikasi type primitif.
a. Spesifikasi type sesuai dengan bahasa yang bersangkutan.
b. Spesifikasi dari primitif sesuai dengan kaidah dalam konteks prosedural, yaitu
- Fungsi: nama, domain, range dan prekondisi jika ada
Halaman
2 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#ifndef boolean_H
#define boolean_H
#define true 1
#define false 0
#define boolean unsigned char
#endif
Halaman
3 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
typedef struct {
int Hour ; /* Hour [0..23] */
int Minute; /* Minute [0..59] */
int Second; /* Second [0..59] */
} JAM;
Halaman
4 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
*/
void SetMinute(JAM *J, int newMinute);
/* I.S : J terdefinisi, dengan nilainya sembarang
F.S : Mengubah nilai komponen MInute dari J dengan Minute=newMinute
*/
void SetSecond(JAM *J, int newSecond);
/* I.S : J terdefinisi, dengan nilainya sembarang
F.S : Mengubah nilai komponen Second dari J dengan Second=newSecond
*/
Halaman
5 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#endif
#include "jam.h"
#include <stdio.h>
#include <conio.h>
Halaman
6 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
7 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
scanf("%d", &ss);
}while (hh<0 || hh>23 || mm<0 || mm>59 || ss<0 || ss>59);
CreateJam(&(*J), hh, mm, ss);
}
void PrintJam (JAM J) {
/* I.S. : J diisi dengan nilai sembarang
F.S. : Menampilkan jam (J) ke layar dengan format HH:MM:SS
*/
printf("%d:%d:%d", J.Hour, J.Minute, J.Second);
}
Halaman
8 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
jamBaru = J;
if (N > 0 && N <= 86400) { // menambahkan detik hanya sampai 24 jam
for (i=1; i<=N; i++){
jamBaru = NextDetik (jamBaru);
}
Halaman
9 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
}
return (jamBaru);
}
detikAwl = JamToDetik(JAw);
detikAkh = JamToDetik(JAkh);
result = detikAwl - detikAkh;
if (result < 0) {
result = result * (-1);
}
return (result);
}
/** {Kelompok Konversi Terhadap Type} **/
long int JamToDetik (JAM J) {
/* melakukan konversi jam menjadi Detik
Rumus : detik = 3600*hour+menit*60 + detik
nilai maksimum = 3600*23+59*60+59*60
*/
long int detik;
int main () {
// Kamus Data
JAM J1, J2, J3, J4;
int tambahanDetik;
// Algoritma
ReadJam(&J1);
Halaman
10 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
printf("Nilai J1 = ");
PrintJam(J1);
printf("\n");
J2 = NextDetik(J1);
printf("Nilai J2 = ");PrintJam(J2);printf("\n");
if (JEQ(J3, J1))
printf("nilai J3 sama dengan J1\n");
if(JLT(J3, J1))
printf("nilai J3 lebih kecil dari J1\n");
if(JGT(J3, J1))
printf("nilai J3 lebih besar dari J1\n");
if (JEQ(J1, J4))
printf("nilai J1 sama dengan J4\n");
if(JLT(J1, J4))
printf("nilai J1 lebih kecil dari J4\n");
if(JGT(J1, J4))
printf("nilai J1 lebih besar dari J4\n");
Reset(&J4);
printf("Nilai J4 = ");PrintJam(J4);printf("\n");
TUGAS PRAKTIKUM
Latihan 1
1. Ketikan source code ADT JAM diatas yaitu header file, body file dan driver dengan
nama file jam.h, jam.c dan mjam.c. File program diletakan dalam satu folder yang sama.
2. Buat projek untuk ADT JAM pada DevC++/IDE lain dengan cara:
a. Klik “file” pada menu bar
b. Pilih New > Project. Beri judul project dengan nama ADTJam
Halaman
11 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
c. Tambahkan source code ADT JAM pada project dengan cara : Klik kanan pada
project, kemudian pilih “Add to Project”, selanjutnya pilih file boolean.h, jam.h,
jam.c dan mjam.c
PENGUMPULAN
1. File yang dikumpulkan adalah file dengan extensi .h, .c dan word (untuk soal no 3 pada
Latihan 1.
2. Kompres hasil Latihan 1 dan Latihan 2 dalam bentuk zip dengan penamaan :
[Prak. Struktur Data]_Kelas_Modul 1_NIM_NAMA
Contoh : [Prak. Struktur Data]_A_Modul 1_3411161001_Rahmania Aulia I.P
3. Tugas dikumpulkan maksimal satu minggu setelah praktikum
ADT POINT
Bagian file Header Point
/* Program : point.h
Author : (Nim, Nama)
Kelas :
Deskripsi: Header file dari prototype point
Tanggal :
*/
#ifndef _POINT_H
#define _POINT_H
#include "boolean.h"
#include <stdio.h>
#include <conio.h>
#define Absis(P) (P).X
Halaman
12 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
/* Prototype POINT */
Halaman
13 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#endif
Halaman
14 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
15 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
Sebuah ADT tidak hanya dibentuk dari tipe data primitif saja (misalnya integer, real, char dan
boolean) tetapi juga dapat dibentuk dari ADT lain.
Persoalan :
ADT Garis adalah pembentukan sebuah garis pada bidang kartesian dwiwarta yang dibentuk
dari dua buah Point (Titik) yaitu titik awal dan titik akhir. Dari kedua titik tersebut dapat
dibentuk sebuah garis.
#ifndef _LINE_H
#define _LINE_H
#include "boolean.h"
#include "point.h"
#include <stdio.h>
#include <conio.h>
Halaman
16 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
/* Prototype Line */
Halaman
17 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#endif
TUGAS PRAKTIKUM
1. Dengan cara yang sama seperti pada Modul 1, ketikan header file untuk ADT Line
diatas.
2. Buat body file dari setiap prototype (prosedur dan fungsi) pada header file ADT Line
3. Buat file drivernya: mline.c
Sebagai catatan: Pada main driver panggil semua modul untuk memastikan bahwa body
dari modul program adalah benar
4. Buat projek untuk ADT Line, sertakan ADT Point pada Project (header dan body) karena
operasi pada ADT Line menggunakan operasi pada ADT Point
5. Kemudian Simpulkan oleh anda, apa yang anda pelajari pada latihan modul 2 ?
(Simpulan ditulis dalam file word)
PENGUMPULAN
1. File yang dikumpulkan adalah file dengan extensi .h, .c dan word (untuk soal no 5)
2. Kompres hasil Tugas Praktikum dalam bentuk zip dengan penamaan :
[Prak. Struktur Data]_Kelas_Modul 2_NIM_NAMA
Contoh : [Prak. Struktur Data]_A_Modul 2_3411161001_Rahmania Aulia I.P
3. Tugas dikumpulkan maksimal satu minggu setelah praktikum
Halaman
18 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
19 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
Sebuah ADT Tabel integer adalah pembentukan Tabel (array) yang berisi sekumpulan data
bertipe integer. ADT tabel integer terdiri dari tempat penyimpanan obyek dalam array yang
terdefinisi dengan tipe integer, serta variable pencacah bagi obyek tersebut, sehingga proses
akses terhadap obyek dapat dilakukan dengan mudah. Variable pencacah dapat disebut juga
sebagai variable yang menyimpan jumlah data/ elemen yang ada pada tabel.
Tab
nEff = 2 karena jumlah data/ elemen pada tabel sebanyak 2 buah (10 dan 5)
#ifndef _TABINT_H
#define _TABINT_H
Halaman
20 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#include "boolean.h"
#include <stdio.h>
#include <conio.h>
#define nMax 10
#define IdxUndef -999
#define ElType int
/* Prototype TabInt */
Halaman
21 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
*/
Halaman
22 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
TUGAS PRAKTIKUM
1. Dengan cara yang sama seperti pada Modul 1, ketikan header file untuk ADT TabInt
diatas.
2. Buat body file dari setiap prototype (prosedur dan fungsi) pada header file ADT TabInt
3. Buat file drivernya: mtabint.c
Sebagai catatan: Pada main driver panggil semua modul untuk memastikan bahwa body
dari modul program adalah benar
4. Buat projek untuk ADT TabInt
5. Kemudian Simpulkan oleh anda, apa yang anda pelajari pada latihan modul 3 ?
(Simpulan ditulis dalam file word)
PENGUMPULAN
1. File yang dikumpulkan adalah file dengan extensi .h, .c dan word (untuk soal no 5)
2. Kompres hasil Tugas Praktikum dalam bentuk zip dengan penamaan :
[Prak. Struktur Data]_Kelas_Modul 3_NIM_NAMA
Contoh : [Prak. Struktur Data]_A_Modul 3_3411161001_Rahmania Aulia I.P
3. Tugas dikumpulkan maksimal satu minggu setelah praktikum
Halaman
23 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
List Linier
List linier adalah sekumpulan elemen bertype sama yang saling terkait dengan elemen
selanjutnya dan mempunyai keterurutan tertentu. Setiap elemen pada List Linear terdiri
dari dua bagian, yaitu: informasi mengenai nilai elemennya, dan informasi mengenai
alamat elemen suksesornya atau alamat elemen selanjutnya.
Spesifikasi untuk tipe list linear adalah:
type ElmtList : <info : InfoType, Next : address>
InfoType adalah sebuah type terdefinisi yang menyimpan informasi sebuah elemen list.
Next adalah address ("alamat") dari elemen berikutnya (suksesor).
Dengan demikian, jika didefinisikan First adalah alamat elemen pertama list, maka elemen
berikutnya dapat diakses secara berurutan dari field Next elemen tersebut.
Jika address ("alamat") berisi sebuah nilai yang menunjukkan alamat elemen list maka
disebut sebagai pengalokasian elemen. Sebaliknya jika address ("alamat") bernilai suatu
konstanta Nil, maka tidak menunjuk ke elemen list atau alamat tidak terdefinisi. Alamat ini
nantinya akan didefinisikan secara lebih konkret ketika list linier diimplementasi pada
struktur data fisik.
Halaman
24 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
25 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
26 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
INSERT-After :
Menyisipkan sebuah elemen beralamat P setelah suksesor dari sebuah elemen list linier
yang beralamat Prec. Jika yang disisipkan adalah sebuah nilai, maka lakukan terdahulu
alokasi untuk mendapatkan alamat elemen tersebut (proses alokasi sudah disebutkan diatas).
Halaman
27 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
INSERT-Last
Menyisipkan sebuah elemen beralamat P setelah sebagai elemen terakhir sebuah list linier.
Jika yang disisipkan adalah sebuah nilai, maka lakukan terdahulu alokasi untuk mendapatkan
alamat elemen tersebut (proses alokasi sudah disebutkan diatas).
Ada dua kemungkinan sebelum penyisipan elemen yaitu kondisi list kosong dan tidak
kosong.
Halaman
28 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
DELETE-First
Menghapus elemen pertama list linier. Untuk proses penghapusan harus dipastikan bahwa
element pada list tidak kosong.
DELETE-After
Menghapus elemen yang berada ditengah list linier. Untuk proses penghapusan harus
dipastikan bahwa element pada list tidak kosong dan jumlahnya lebih dari 1.
Penghapusan suksesor sebuah elemen :
Halaman
29 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
DELETE-Last
Menghapus elemen terakhir list dapat dilakukan jika alamat dari elemen sebelum
elemen terakhir diketahui. Untuk proses penghapusan harus dipastikan bahwa element pada
list tidak kosong. Persoalan selanjutnya menjadi persoalan DELETE AFTER, jika Last
bukan satu-satunya elemen list linier. Ada dua kemungkinan setelah proses penghapusan
yaitu kondisi list menjadi kosong atau tidak.
Kasus list menjadi kosong setelah penghapusan :
Halaman
30 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
/* Destruktor/Dealokator: */
address Alokasi (infotype X);
Halaman
31 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
/**Penambahan Elemen***/
void InsFirst (List *L, infotype X);
/*I.S : L terdefinisi, mungkin kosong
F.S : melakukan alokasi sebuah elemen dan
menambahkan elemen pertama pada List dengan nilai X jika alokasi
berhasil. Jika alokasi gagal IS = FS
*/
void InsLast (List * L, iinfotype X);
/*I.S : L terdefinisi, mungkin kosong
F.S : melakukan alokasi sebuah elemen dan
menambahkan elemen terakhir pada List dengan nilai X jika alokasi
berhasil. Jika alokasi gagal IS = FS
*/
void InsAfter (List * L, infotype X, infotype Y);
/*I.S : L terdefinisi, mungkin kosong
F.S : melakukan alokasi sebuah elemen dengan nilai x dan
menambahkan elemen list setelah y ditemukan pertama kali pada list
*/
/*Penghapusan Elemen*/
void DelFirst (List * L, infotype *X);
/*I.S : L tidak kosong
F.S : Elemen pertama List dihapus, nilai info disimpan ke X
dan alamat elemen pertama di dealokasi. Sehingga elemen pertama pada List
adalah elemen berikutnya sebelum penghapusan.
*/
void DelLast (List *L, infotype *X);
/*I.S : L tidak kosong
F.S : Elemen terakhir list dihapus: nilai info disimpan pada X
dan alamat elemen terakhir di dealokasi. Sehingga elemen terakhir pada
List adalah elemen sebelumnya sebelum penghapusan.
*/
void DelAfter (List * L, infotype *X, infotype Y);
/*I.S : L terdefinisi, mungkin kosong
F.S : melakukan dealokasi sebuah elemen dengan nilai x setelah nilai y
pertama ditemukan pada list.
Halaman
32 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#endif
TUGAS PRAKTIKUM
1. Dengan cara yang sama seperti pada Modul 1, ketikan header file untuk ADT List diatas.
2. Buat body file dari setiap prototype (prosedur dan fungsi) pada header file ADT List
3. Buat file drivernya: mlist.c
Sebagai catatan: Pada main driver panggil semua modul untuk memastikan bahwa body
dari modul program adalah benar
4. Buat projek untuk ADT List
5. Kemudian Simpulkan oleh anda, apa yang anda pelajari pada latihan modul 4 ?
(Simpulan ditulis dalam file word)
PENGUMPULAN
1. File yang dikumpulkan adalah file dengan extensi .h, .c dan word (untuk soal no 5)
2. Kompres hasil Tugas Praktikum dalam bentuk zip dengan penamaan :
Halaman
33 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
34 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
Stack
Stack merupakan tumpukan yang terdiri dari sekumpulan elemen dengan operasi
penambahan (push) pada bagian paling atas (top) dari tumpukan dan pengambilan elemen
(pop) yang selalu diambil dari yang paling atas (top). Sebuah stack dikenali dengan :
1. elemen puncaknya disebut TOP
2. aturan penyisipan dan penghapusan elemennya tertentu :
- Penyisipan selalu dilakukan "di atas" TOP
- Penghapusan selalu dilakukan pada TOP
Oleh karena aturan penyisipan dan penghapusan semacam itu, maka TOP adalah satu-satunya
alamat tempat terjadi operasi. Elemen yang ditambahkan paling akhir akan menjadi elemen
yang akan dihapus. Dengan demikian bahwa elemen Stack akan tersusun secara LIFO
(Last In First Out), artinya elemen yang terakhir masuk adalah elemen yang akan pertama
dikeluarkan dari Stack. Ilustrasinya dapat digambarkan seperti tumpukan CD atau tumpukan
sate.
Struktur data ini banyak dipakai dalam informatika, misalnya untuk merepresentasi :
- pemanggilan prosedur
- perhitungan ekspresi artimatika
- rekursifitas
- backtracking dan algoritma lanjut yang lain
Halaman
35 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Perhatikan bahwa dengan definisi semacam ini, representasi tabel sangat tepat untuk
mewakili stack, karena operasi penambahan dan pengurangan hanya dilakukan di salah
satu ujung tabel.
“Perilaku” yang diubah adalah bahwa dalam stack, operasi penambahan hanya dapat
dilakukan di salah satu ujung sedangkan pada tabel, boleh dimanapun.
Definisi Fungsional
Diberikan S adalah Stack dengan elemen ElmtS, maka definisi fungsional stack adalah :
CreateStack : S {Membuat sebuah stack kosong}
IsEmpty : S boolean
{Cek apakah stack kosong, true jika stack kosong dan false jika S
tidak kosong}
IsFull : S boolean
{Cek apakah stack penuh, true jika stack penuh dan false jika S
tidak penuh}
Push : ElmtS x S S
{Menambahkan sebuah elemen baru sebagai TOP dan nilai TOP bertambah
1}
Pop : S ElmtS x S
{Mengambil nilai elemen TOP, sehingga TOP yang baru adalah elemen
yang datang sebelum elemen TOP, dan nilai TOP berkurang 1, sehingga
memungkinkan Stack menjadi kosong.
Definisi Selektor
Jika S adalah sebuah Stack, maka
Top(S) adalah alamat elemen TOP, tempat operasi penyisipan/penghapusan dilakukan
InfoTop(S) adalah informasi yang disimpan pada Top(S).
Definisi Stack kosong adalah Stack dengan Top(S)=Nil (tidak terdefinisi).
Halaman
36 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Stack dengan representasi sebuah Tabel yaitu : elemen Stack dari index 1 sampai dengan
index Maximum (idxMax). Sehingga TOP adalah index elemen TOP (elemen paling atas)
dari Stack. Jika Stack kosong maka TOP=0, sebaliknya jika Stack penuh maka TOP=idxMax.
Ilustrasi Stack tidak kosong dan tidak penuh, dengan 5 elemen dan index maksimumnya 10 :
Halaman
37 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#ifndef _STACK_H
#define _STACK_H
#include "boolean.h"
#include <stdio.h>
#include <conio.h>
#define Nil 0
#define MaxEl 10
/* Nil adalah stack dengan elemen kosong
Karena indeks dalam bhs C dimulai 0 maka tabel dengan indeks 0 tdk
dipakai*/
/* Definisi akses dengan Selektor : Set dan Get */
#define Top(S) (S).TOP
#define InfoTop(S) (S).T[(S).TOP]
Halaman
38 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
/*
S kosong S.TOP = Nil
Elemen yang dipakai menyimpan nilai Stack T[l]..T[MaxEl]
Jika S adalah Stack maka akses elemen :
S.T[(S.TOP)] untuk mengakses elemen TOP
S.TOP adalah alamat elemen TOP
*/
/* Prototype Stack */
/** { Operasi terhadap komponen : selektor Get dan Set } : tidak perlu
sudah di define diatas**/
Halaman
39 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
F.S : mengambil elemen pada Top sehingga X berisi nilai elemen TOP yang
lama, kemudian TOP berkurang l
*/
#endif
TUGAS PRAKTIKUM
Latihan 1
1. Dengan cara yang sama seperti pada Modul 1, ketikan header file untuk ADT Stack
diatas.
2. Buat body file dari setiap prototype (prosedur dan fungsi) pada header file ADT Stack
3. Buat file drivernya: mstack.c untuk menyelesaikan persoalan dibawah ini
Pernyataan :
Buatlah sebuah program utama dalam Bahasa C yang membaca N (integer). N bernilai
positif, yaitu N>0. Definisikan sebuah stack (dengan memanfaatkan ADT stack yang
sudah anda buat) dan isi stack tersebut dengan nilai ganjil dari 1 s.d. N. Selanjutnya, isi
stack di-pop satu per satu sampai stack kosong. Di akhir program, tampilkan pesan
bahwa stack kosong dan jumlah elemen yang sudah di-pop dari stack.
Contoh input/output :
Input Output Keterangan
5 5 N=5
3 Bilangan yang di pop secara terurut = {5, 3, 1}
1 Elemen stack = 3
Empty stack
3
10 9 N = 10
7 Bilangan yang di pop secara terurut = {9, 7, 5, 3, 1}
5 Elemen stack = 5
Halaman
40 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
3
1
Empty stack
5
0 Masukan tidak valid N=0
-1 Masukan tidak valid N=-1
Sebagai catatan: Pada main driver panggil semua modul untuk memastikan bahwa body
dari modul program adalah benar.
4. Buat projek untuk ADT Stack
5. Kemudian Simpulkan oleh anda, apa yang anda pelajari pada latihan modul 5 ?
(Simpulan ditulis dalam file word)
Latihan 2
1. Buatlah kelompok dengan anggota 3 orang (tidak boleh lebih). Kemudian selesaikan
persoalan ADT Stack representasi Pointer dibawah dengan memanfaatkan konsep linear
linked list pada modul sebelumnya. Buatlah body dan main driver-nya.
File header Stack dengan representasi Pointer
/* Program : stack2.h
Author : (Nim, Nama) tuliskan anggota kelompok
Kelas :
Deskripsi: Header file dari prototype stack
Tanggal :
*/
#ifndef _STACK2_H
#define _STACK2_H
#include "boolean.h"
#include <stdio.h>
#include <conio.h>
//Pendefinisian Pointer
#define nil NULL
#define info(P)
#define next(P)
#define TOP(S) (S).TOP
Halaman
41 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
typedef struct {
address BUTTOM;
address TOP;
}Stack;
//Konstruktor
void CreateStack(Stack *S);
/* I.S : S terdefinisi tidak diketahui isinya
F.S : S diinisialisasi dengan TOP(S)=nil
*/
address Alokasi(infotype x);
/* mengirim sebuah elemen Stack dalam bentuk address */
//Destruktor
void DeAlokasi(address P);
/* me—release memori dari P sebuah elemen stack */
//Operasi Stack
void Push (Stack *S, infotype X);
/* Menambahkan X sebagai elemen Stack S. */
/* I.S : S terdifinisi, mungkin kosong, dan
S penampung elemen stack tidak penuh.
F.S : X menjadi TOP yang baru,TOP bertambah 1
*/
#endif
PENGUMPULAN
1. File yang dikumpulkan adalah file dengan extensi .h, .c dan word (untuk soal no 5)
Halaman
42 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
43 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
Queue
Queue adalah sekumpulan obyek yang berupa antrian linear yang :
1. dikenali elemen pertama (HEAD) dan elemen terakhirnya (TAIL),
2. aturan penyisipan dan penghapusan elemennya didefinisikan sebagai berikut:
- Penyisipan selalu dilakukan setelah elemen terakhir
- Penghapusan selalu dilakukan pada elemen pertama
Karena aturan penyisipan dan penghapusan semacam itu, maka elemen Queue tersusun
secara FIFO (First In First Out), artinya elemen yang pertama masuk adalah elemen yang
akan pertama di keluarkan dari Queue. Implementasi antrian dapat ditemukan seperti pada
penjualan karcis kereta, bioskop dsb.
Struktur data ini banyak dipakai dalam informatika, misalnya untuk merepresentasi :
- antrian job yang harus ditangani oleh sistem operasi
- antrian dalam dunia nyata.
Halaman
44 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Definisi Selektor
Jika Q adalah sebuah Queue, maka
Head(Q) adalah alamat elemen pertama dari Queue, sebagai tempat operasi penyisipan
dilakukan.
Tail(Q) adalah alamat elemen terakhir dari Queue, sebagai tempat operasi penghapusan
dilakukan.
Info(Head(Q)) adalah informasi yang disimpan pada Head(Q)
Info(Tail(Q)) adalah informasi yang disimpan pada Tail(Q)
Definisi Queue kosong adalah Queue dengan Head(Q)=Nil dan Tail(Q)=Nil (tidak
terdefinisi).
Definisi Queue penuh adalah Queue dengan Tail(Q)=idxMax (index Tail sudah mencapai
maksimum).
Alternatif I :
Halaman
45 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Tabel dengan representasi TAIL sebagai indeks elemen terakhir, HEAD selalu diisi dengan 1
jika Queue tidak kosong. Sedangkan jika Queue kosong, maka HEAD=0.
Ilustrasi Queue tidak kosong, dengan 5 elemen :
Algoritma Penambahan
Algoritma paling sederhana untuk penambahan elemen jika masih ada tempat
adalah dengan memajukan TAIL. Kasus khusus untuk Queue kosong karena HEAD
harus diset nilainya dengan nilai 1. Pada operasi ini, pastikan dahulu bahwa Queue
tidak penuh.
Ilustrasi penambahan pada Queue kosong :
Algoritma penghapusan
Halaman
46 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Algoritma paling sederhana dan “naif” ketika penghapusan elemen jika Queue
tidak kosong: ambil nilai elemen HEAD, geser semua elemen mulai dari HEAD+1
s/d TAIL (jika ada) ke kiri, kemudian TAIL mundur. Kasus khusus untuk Queue
dengan keadaan awal yang hanya memiliki satu elemen, yaitu menyesuaikan HEAD dan
TAIL sesuai dengan DEFINISI. Algoritma ini mencerminkan pergeseran orang yang
sedang mengantri di dunia nyata, tapi tidak efisien. Pada operasi ini, pastikan dahulu
bahwa Queue tidak kosong.
Ilustrasi penghapusan pada Queue penuh :
Kondisi Awal, Queue penuh dengan 10 elemen
Alternatif II :
Tabel dengan representasi HEAD dan TAIL. jika Queue tidak kosong, HEAD selalu bergerak
ke kanan ketika sebuah elemen dihapus. Sedangkan jika Queue kosong, maka HEAD=0.
Halaman
47 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Ilustrasi Queue tidak kosong dengan 5 elemen dan HEAD sedang berada di posisi awal:
Ilustrasi Queue tidak kosong dengan 5 elemen dan HEAD tidak berada di posisi awal. Hal
ini terjadi akibat algoritma penghapusan yang dilakukan.
Head(Q) = Tail(Q) + 1 :
Algoritma Penambahan
Algoritma untuk penambahan elemen sama dengan alternatif I: jika masih ada tempat
adalah dengan “memajukan” TAIL. Kasus khusus untuk Queue kosong karena HEAD
harus diset nilainya menjadi 1. Pada operasi ini, pastikan dahulu bahwa Queue tidak penuh.
Algoritma Penghapusan
Algoritma untuk penghapusan elemen jika Queue tidak kosong: ambil nilai elemen HEAD,
kemudian HEAD “maju”. Kasus khusus untuk Queue dengan keadaan awal berelemen 1,
yaitu menyesuaikan HEAD dan TAIL sesuai dengan DEFINISI. Algoritma ini TIDAK
mencerminkan pergeseran orang yang sedang mengantri di dunia nyata, tapi efisien.
Pada operasi ini, pastikan dahulu bahwa Queue tidak kosong.
Halaman
48 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Namun suatu saat terjadi keadaan Queue penuh tetapi “semu” sebagai berikut :
Halaman
49 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Jika keadaan ini terjadi, haruslah dilakukan aksi menggeser elemen untuk menciptakan
ruangan kosong. Pergeseran hanya dilakukan jika dan hanya jika TAIL sudah mencapai
IndexMax.
Implementasi ADT Queue
ADT Queue diimplementasikan menjadi dua buah modul yaitu, :
- Definisi/ spesifikasi type dan primitif
type Queue : < TabElm : array [1 ... nMax] of infotye,
HEAD : address of infotype,
TAIL : address of infotype>
- Body atau realisasi dari operasi primitif pada file header.
Halaman
50 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#ifndef _QUEUE_H
#define _ QUEUE _H
#include "boolean.h"
#include <stdio.h>
#include <conio.h>
#define Nil 0
#define MaxEl 10
Halaman
51 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
/* Definisi Queue : */
/* Queue kosong: Head=Nil, TAIL=Nil
Atau Head = Tail + 1 untuk alternatif 2
Elemen yang dipakai menyimpan nilai Stack T[l]..T[MaxEl]
Jika Q adalah Queue maka akses elemen
Q.T[(Q.HEAD)] untuk mengakses elemen pertama
Q.T[(Q.TAIL)] untuk mengakses elemen terakhir
Q.HEAD adalah alamat elemen pertama
Q.TAIL adalah alamat elemen terakhir
*/
typedef int infotype; /*elemen queue bertipe integer*/
typedef int address; /* indeks tabel */
/* Versi pembentukan Queue dengan menyimpan tabel dan alamat head maupun
tail secara eksplisit */
typedef struct { infotype T[MaxEl+1]; /* tabel penyimpan elemen */
address HEAD; /* alamat HEAD: elemen pertama */
address TAIL; /* alamat TAIL: elemen terakhir */
} Queue;
/* Prototype Queue */
/* Konstruktor membentuk Queue */
void CreateQueue(Queue *Q);
/* I.S : Q terdefinisi tidak diketahui isinya
F.S : Q diinisialisasi dengan HEAD(Q)=nil, TAIL(Q)=nil
*/
/** { Operasi terhadap komponen : selektor Get dan Set } : tidak perlu
sudah di define diatas**/
Halaman
52 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#endif
TUGAS PRAKTIKUM
Implementasikan ADT Queue dengan Algoritma Alternatif I dan Algoritma Alternatif II
dengan :
1. Dengan cara yang sama seperti pada Modul 1, ketikan header file untuk kedua alternatif
ADT Queue diatas dengan nama file queue1.h dan queue2.h
2. Buat body file dari setiap prototype (prosedur dan fungsi) pada header file ADT Queue
dengan nama file queue1.c dan queue2.c
3. Buat file drivernya: mqueue1.c dan mqueue2.c
Halaman
53 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Sebagai catatan: Pada main driver panggil semua modul untuk memastikan bahwa body
dari modul program adalah benar
4. Buat projek untuk ADT Queue1 dan ADT Queue2
5. Kemudian Simpulkan oleh anda, apa yang anda pelajari pada latihan modul 6 ?
(Simpulan ditulis dalam file word)
PENGUMPULAN
1. File yang dikumpulkan adalah file dengan extensi .h, .c dan word (untuk soal no 5)
2. Kompres hasil Tugas Praktikum dalam bentuk zip dengan penamaan :
[Prak. Struktur Data]_Kelas_Modul 6_NIM_NAMA
Contoh : [Prak. Struktur Data]_A_Modul 6_3411161001_Rahmania Aulia I.P
3. Tugas dikumpulkan maksimal satu minggu setelah praktikum
Halaman
54 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
Queue
Queue dengan Circular sebenarnya prinsipnya sama saja dengan queue dengan cara biasa
(non circular). Perbedaannya terletak pada proses penyisipan / penambahan dan penghapusan
pada elemennya. Untuk mempermudah penggambaran lajur linear digambarkan dalam bentuk
melingkar (lihat Gambar dibawah ini).
Halaman
55 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
- Sedangkan untuk proses penghapusan, Jika Head(Q) = indxMax dan jumlah elemen
Queue tidak kosong, maka Head(Q) = 1.
Definisi kondisi Queue pada tabel Circular
Kondisi Definisi
Kosong Head(Q) = 0 dan Tail(Q) = 0
1 elemen Head(Q) = Tail(Q) dan Head(Q) <> 0
> 1 elemen tetapi tidak penuh Head(Q) <> (Head(Q)-Tail(Q)) dan Head(Q) <> 0
Penuh (Head(Q) = 1 dan Tail(Q) = indxMax) atau
Head(Q) – Tail(Q) = 1
Dibawah ini algoritma yang dipakai untuk proses Queue dengan Circular
Alternatif Queue Circular :
Tabel dengan representasi HEAD dan TAIL yang “berputar” mengelilingi indeks tabel dari
awal sampai akhir, kemudian kembali ke awal. Jika Queue kosong, maka HEAD=0.
Representasi ini memungkinkan tidak perlu lagi ada pergeseran yang harus dilakukan
seperti pada alternatif II pada saat penambahan elemen.
Ilustrasi Queue tidak kosong, dengan 5 elemen, dengan HEAD sedang berada di
posisi awal:
Ilustrasi Queue tidak kosong, dengan 5 elemen, dengan HEAD tidak berada di
posisi awal, tetapi masih “lebih kecil” atau “sebelum” TAIL. Hal ini terjadi akibat
algoritma penghapusan/Penambahan yang dilakukan (lihat keterangan).
Halaman
56 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Ilustrasi Queue tidak kosong, dengan 5 elemen, HEAD tidak berada di posisi awal, tetapi
“lebih besar” atau “sesudah” TAIL. Hal ini terjadi akibat algoritma
penghapusan/Penambahan yang dilakukan (lihat keterangan)
Algoritma Penambahan
Pada operasi ini, pastikan dahulu bahwa elemen pada Queue tidak penuh.
Jika TAIL belum mencapai idxMax, maka memajukan TAIL. Tetapi jika TAIL sudah
mencapai IdxMax, maka suksesor dari IdxMax adalah 1 sehingga TAIL yang baru
adalah 1.
Jika TAIL belum mencapai IdxMax, maka algoritma penambahan elemen sama dengan
alternatif II. Kasus khusus untuk Queue kosong karena HEAD dan TAIL harus diset
nilainya menjadi 1.
Algoritma Penghapusan
Pada operasi ini, pastikan dahulu bahwa elemen pada Queue tidak kosong.
Pertama, ambil nilai elemen HEAD, kemudian HEAD maju. Penentuan suatu suksesor
dari indeks yang diubah/maju dibuat seperti pada algoritma penambahan elemen:
Jika HEAD mencapai IdxMAx, maka suksesor dari HEAD adalah 1.
Kasus khusus untuk Queue dengan keadaan awal berelemen 1, yaitu menyesuaikan
HEAD dan TAIL dengan DEFINISI.
Algoritma ini efisien karena tidak perlu pergeseran, dan seringkali strategi pemakaian
tabel semacam ini disebut sebagai circular buffer, dimana tabel penyimpan elemen dianggap
sebagai buffer.
Salah satu variasi dari representasi pada alternatif III adalah : menggantikan representasi
TAIL dengan COUNT, yaitu banyaknya elemen Queue. Dengan representasi ini,
banyaknya elemen diketahui secara eksplisit, tetapi untuk melakukan penambahan
elemen harus dilakukan kalkulasi TAIL.
Halaman
57 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#ifndef _QUEUECIRCULAR_H
#define _ QUEUECIRCULAR_H
#include "boolean.h"
#include <stdio.h>
#include <conio.h>
#define Nil 0
#define MaxEl 10
/* Nil adalah queue dengan elemen kosong . */
/* Karena indeks dalam bhs C dimulai O maka tabel dg indeks O tidak */
/* dipakai */
/* Prototype Queue */
/* Konstruktor membentuk Queue */
void CreateQueue(Queue *Q);
/* I.S : Q terdefinisi tidak diketahui isinya
F.S : Q diinisialisasi dengan HEAD(Q)=nil, TAIL(Q)=nil
Halaman
58 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
*/
/** { Operasi terhadap komponen : selektor Get dan Set } : tidak perlu
sudah di define diatas**/
Halaman
59 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#endif
TUGAS PRAKTIKUM
Latihan 1
1. Dengan cara yang sama seperti pada Modul 1, ketikan header file untuk ADT
QueueCircular
2. Buat body file dari setiap prototype (prosedur dan fungsi) pada header file ADT
QueueCircular
3. Buat file drivernya: mqueuecircular.c untuk menyelesaikan persoalan mensimulasikan
antrian di sebuah loket di suatu bank
Pernyataan :
Elemen queue menyatakan lama waktu pengunjung loket mengantri di loket tersebut
(dalam menit). Program harus melakukan hal sebagai berikut:
- Menerima masukan ukuran queue, yaitu ukuran queue selalu > 0. Jika queue <= 0
maka tuliskan pesan “masukan tidak valid”
- Dalam satu loop, pengguna bisa memilih untuk menambah pengunjung dalam antrian
atau menghapus pengunjung (menghapus pengunjung berarti pengunjung tsb
dilayani).
Jika memilih menambah antrian, masukkan kode operasi = 1 diikuti panjang waktu
mengantri (elemen queue). Contoh: 1 5 (berarti menambah elemen queue dengan
waktu antrian = 5 menit).
Untuk menghapus elemen antrian, masukkan kode operasi = 2.
Penambahan dan penghapusan harus mengikuti ketentuan operasi Add dan Del queue
(perhatikan untuk kasus queue kosong dan queue penuh). Jika dilanggar, seharusnya
tidak terjadi apa pun pada queue.
Untuk menghentikan proses, masukkan kode operasi = 0.
- Di akhir program, ditampilkan statistik queue, yaitu panjangnya antrian (berapa
banyak orang yang sedang mengantri) dan waktu rata-rata orang mengantri (dalam
menit, tulis dengan 2 digit di belakang koma). Jika panjang antrian kosong, tuliskan
pesan “Tidak bisa dihitung”
Buatlah fungsi sebagai berikut ke dalam program utama Anda:
float AvgElmt (Queue Q);
/* Menghasilkan rata-rata elemen dalam queue yang tidak kosong */
Contoh input/output :
Halaman
60 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
61 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#include "boolean.h"
#include <stdio.h>
#include <conio.h>
//pendefinisian pointer
#define nil NULL
#define info(P) (P)->info
#define next(P) (P)—>next
#define HEAD(Q) (Q).HEAD
#define TAIL(Q) (Q).TAIL
typedef struct{
address HEAD;
address TAIL;
}Queue;
//Operasi Queue
void AddQue(Queue *Q, int X);
/* I.S : Q terdefinisi sembarang mungkin kosong
F.S : Q bertambah sebuah elemen bernilai X dibelakang
proses : HEAD (Q) merupakan elemen terakhir dari Q
*/
Halaman
62 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
PENGUMPULAN
1. File yang dikumpulkan adalah file dengan extensi .h, .c dan word (untuk soal no 5)
2. Kompres hasil Tugas Praktikum dalam bentuk zip dengan penamaan :
[Prak. Struktur Data]_Kelas_Modul 7_NIM_NAMA
Contoh : [Prak. Struktur Data]_A_Modul 7_3411161001_Rahmania Aulia I.P
3. Untuk tugas kelompok dikumpulkan pada email terpisah dengan penamaan :
[Prak. Struktur Data]_Kelas_TGS Modul 7_NIM1_NIM2_NIM3
Contoh :
[Prak. Struktur Data]_A_TGS Modul 7_3411161001_3411161002_3411161003
4. Tugas dikumpulkan maksimal satu minggu setelah praktikum
Halaman
63 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
Salah satu kelemahan single linked list adalah pointer (penunjuk) hanya dapat bergerak satu
arah saja, maju/mundur, atau kanan/kiri sehingga pencarian data pada single linked list hanya
dapat bergerak dalam satu arah saja. Untuk mengatasi kelemahan tersebut, dapat
menggunakan metode double linked list. Linked list ini dikenal dengan nama Linked list
berpointer Ganda atau Double Linked List.
Double linked list adalah suatu senarai/list berkait dimana setiap node (elemen) mempunyai 2
penunjuk yaitu satu penunjuk ke node(elemen) pendahulunya (predesesor) dan satu penunjuk
ke node (elemen) penerusnya (suksesor).
Ada 2 kondisi yang harus diperhatikan dalam penambahan data di awal yaitu :
a. Ketika linked list masih kosong
Kalau kondisi linked list masih kosong, maka elemen baru akan menjadi awal dan akhir
linked list.
Perhatikan gambar di bawah ini :
Kondisi sebelum disisipkan
Halaman
64 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
65 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Ada 2 kondisi yang harus diperhatikan dalam penambahan data di akhir yaitu :
a. Ketika linked list masih kosong
Kalau kondisi linked list masih kosong, maka elemen baru akan menjadi awal dan akhir
linked list.
Perhatikan gambar di bawah ini :
Kondisi sebelum penambahan
Halaman
66 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
67 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Proses penghapusan yaitu dengan menghilangkan data dari memori dengan perintah
free(awal) atau free(akhir).
Pindahkan pointer awal ke data berikutnya (bantu kanan atau awal kanan).
Setelah data dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini.
Halaman
68 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Proses penghapusan yaitu dengan menghilangkan data dari memori dengan perintah
free(awal) atau free(akhir).
Halaman
69 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Pindahkan pointer akhir ke data sebelumnya (bantu kiri atau akhir kiri).
Setelah data dihapus, maka kondisi linked list adalah seperti di gambar di bawah ini.
#ifndef DoubleLinkList_H
#define DoubleLinkList_H
#include <stdlib.h>
Halaman
70 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#include "boolean.h"
#define Nil NULL
typedef struct
{
address First;
}List;
Halaman
71 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#endif
TUGAS PRAKTIKUM
1. Dengan cara yang sama seperti pada Modul 1, ketikan header file untuk ADT Double
Link List diatas.
2. Buat body file dari setiap prototype (prosedur dan fungsi) pada header file ADT Double
Link List
3. Buat file drivernya: mdoublelist.c untuk persoalan proses antrian di Bank.
Persoalan :
Jika petugas menekan tombol nomor antrian, maka antrian bertambah.
Jika petugas menekan tombol layani antrian, maka hapus antrian dan tampilkan
antrian yang sedang dilayani.
Setiap petugas menekan tombol manapun, maka tampilkan informasi ke laya
monitor. Informasi yang ditampilkan adalah jumlah antrian dan antrian yang sedang
dilayani.
Sebagai catatan: Pada main driver panggil semua modul untuk memastikan bahwa body
dari modul program adalah benar
4. Buat projek untuk ADT Double Link List
5. Kemudian Simpulkan oleh anda, apa yang anda pelajari pada latihan modul 8 ?
(Simpulan ditulis dalam file word)
PENGUMPULAN
1. File yang dikumpulkan adalah file dengan extensi .h, .c dan word (untuk soal no 5)
2. Kompres hasil Tugas Praktikum dalam bentuk zip dengan penamaan :
[Prak. Struktur Data]_Kelas_Modul 8_NIM_NAMA
Contoh : [Prak. Struktur Data]_A_Modul 8_3411161001_Rahmania Aulia I.P
3. Tugas dikumpulkan maksimal satu minggu setelah praktikum
Halaman
72 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Halaman
73 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Dasar Teori
Struktur pohon adalah struktur yang penting dalam bidang informatika yang memungkinkan
kita untuk :
- Mengorganisasikan informasi berdasarkan suatu struktur lojik
- Memungkinkan cara akses yang khusus terhadap suatu elemen, misalnya pohon
keputusan, pohon sintaks serta pohon ekspresi matematika
Sebuah pohon adalah himpunan terbatas tidak kosong, dengan elemen yang dibedakan
sebagai berikut:
- Sebuah elemen dibedakan dari yang lainnya yang disebut sebagai Akar (root) dari
pohon
- Elemen yang lain (jika masih ada) dibagi-bagi menjadi beberapa sub himpunan yang
disjoint, dan masing-masing sub himpunan tersebut adalah pohon yang disebut
sebagai Sub Pohon dari pohon yang dimaksud.
Simpul (node) adalah elemen dari pohon yang memungkinkan akses pada sub pohon dimana
simpul tersebut berfungsi sebagai akar (root).
Daun adalah simpul terminal dari pohon, semua simpul selain daun adalah simpul non-
terminal
Path (jalan) adalah suatu urutan tertentu dari cabang. Derajat sebuah pohon adalah banyaknya
anak dari pohon tersebut. Sebuah simpul berderajat N disebut sebagai pohon N-aire
Tingkat (level) pohon adalah panjangnya jalan dari root (akar) sampai dengan simpul yang
bersangkutan
Kedalaman (depth) atau tinggi sebuah pohon adalah nilai maksimum dari tingkat simpul yang
ada pada pohon tersebut. Kedalaman adalah panjang maksimum jalan dari akar menuju ke
sebuah daun
Halaman
74 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
Karena adanya arti bagi sub pohon kiri dan sub pohon kanan, maka dua buah pohon biner
sebagai berikut berbeda (pohon berikut disebut pohoncondong/skewed tree)
// preprosesor
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
/* Deklarasi Btree */
#define nil NULL
#define info(P) (P)->info
#define left(P) (P)->left
Halaman
75 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
//prototype BinTree
//Kelompok konstruktor
void CreateTree(Tree *T, int x, Tree L, Tree R);
/* I.S : T terdefinisi sembarang
F.S : menghasilkan sebuah pohon T
menghasilkan sebuah pohon T dari x, L, R jika alokasi berhasil,
menghasilkan pohon T = nil jika alokasi gagal
*/
//Kelompok selektor
int getRoot(Tree T);
/* mengirim nilai root pada T */
//Operasi I/O
Tree InsSearch(Tree T, int x);
/* menghasilkan sebuah pohon dengan nilai X */
Halaman
76 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#include "bTree.h"
#include <stdio.h>
#include <conio.h>
// algoritma
*T = Alokasi(x);
if(*T != nil){
left(*T) = L;
right(*T) = R;
}
}
Halaman
77 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
// kamus
address P;
// algoritma
P = (address) malloc(sizeof(Node));
if(P!=nil){
info(P) = X;
left(P) = nil;
right(P) = nil;
}
return(P);
}
//Kelompok selektor
int getRoot(Tree T);
/* mengirim nilai root pada T */
//algoritma
tinggi = 0
if(T!=nil){
tinggi = 1 + Maksimum(TinggiPohon(left(T)),TinggiPohon(right(T)));
}
return(tinggi);
}
//Operasi I/O
Tree InsSearch(Tree T, int x){
/* menghasilkan sebuah pohon dengan nilai x */
Halaman
78 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
//kamus
//algoritma
if(T == nil)
CreateTree(&T,x,nil,nil);
else if(x < info(T))
left(T) = InsSearch(left(T), x);
else
right(T) = InsSearch(right(T), x);
return(T);
}
Halaman
79 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
#include "bTree.c"
#include <stdio.h>
#include <conio.h>
int main(){
// kamus global
Tree MyPohon=nil;
int N;
// algoritma
clrscr();
printf("Masukan Bilangan :");scanf("%d",&N);
while(N!=9999){
MyPohon = InsSearch(MyPohon,N);
printf("Masukan Bilangan :");scanf("%d",&N);
}// N = 9999
PreOrder(MyPohon);
printf("\nTinggi Pohon : %d", TinggiPohon(MyPohon));
getch();
return O;
}
TUGAS PRAKTIKUM
1. Dengan cara yang sama seperti pada Modul 1, ketikan header file untuk ADT Binary
Tree diatas.
2. Lengkapilah body file dari setiap prototype (prosedur dan fungsi) pada header file ADT
Binary Tree.
Halaman
80 / 81
STRUKTUR DATA
OLEH : TIM DOSEN
REFERENSI
Liem, Inggriani. (2007). Diktat Algoritma dan Pemrograman Prosedural. Teknik Informatika
ITB
Marcus Zakaria, Teddy dan Prijono, Agus. (2005). Konsep dan Implementasi Struktur Data.
Bandung : Informatika
Sjukani, Moh. (2007). Algoritma (Algoritma dan Struktur Data 1) dengan C, C++, dan Java.
Jakarta : Mitra Wacana Media
Halaman
81 / 81