Modul Java Struktur Data
Modul Java Struktur Data
2
MODUL 1
1. Tujuan
2. Dasar Teori
3. Tugas Pendahuluan
4. Praktikum
package Hello;
5. Tugas Praktikum
1. Tujuan
2. Dasar Teori
3. Tugas Pendahuluan
4. Praktikum
package Mobil_1;
public class Mobil {
4
public Mobil() {
super();
}
package Mobil_1;
package Mobil_2;
public class Mobil {
public Mobil() {
super();
}
package Mobil_2;
package Mobil_3;
public class Mobil {
public Mobil() {
super();
}
package Mobil_3;
import Mobil_3.Mobil;
SELEKSI
1. Tujuan
Mampu membuat program menerima input dari keyboard
Memahami pernyataan IF
Memahami pernyataan Nested IF (IF bersarang)
Memahami switch...case
2. Dasar Teori
Terdapat dua cara untuk mendapatkan input:
menggunakan class BufferedReader, lewat console
menggunakan class JOptionPane , GUI(graphical user interface)
IF, Nested IF dan switch case merupakan bagian dari Struktur kontrol
keputusan, yang digunakan untuk memilih bagian dari code yang akan
dieksekusi.
3. Tugas Pendahuluan
4. Praktikum
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class IF {
public static void main (String[] args) {
System.out.println("Masukkan bilangan Anda : ");
BufferedReader bfr = new BufferedReader
(new InputStreamReader(System.in));
String angkaInput = null;
try {
angkaInput = bfr.readLine();
11
} catch (IOException e) {
e.printStackTrace();
}
int Data = Integer.valueOf(angkaInput).intValue(); if
(Data > 5) System.out.print
("Angka yang anda masukkan lebih besar dari 5");
}
}
Percobaan 2. Pernyataan IF
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
Percobaan 5. Program OR
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
14
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
5. Tugas Praktikum
1. Ambil tiga nilai ujian dari user dan hitung nilai rata-rata dari nilai
tersebut. Berikan output rata-rata dari tiga nilai ujian. Berikan juga smiley
face pada output jika nilai rata-rata lebih besar atau sama dengan 60,
selain itu beri output :-(
a. Gunakan BufferedReader untuk mendapatkan input dari user,
dan System.out untuk output hasilnya.
b. Gunakan JOptionPane untuk mendapatkan input dari user dan
output hasilnya
2. Ambil sebuah angka sebagai input dari user, dan outputnya berupa kata
yang sesuai dengan angka. Angka yang dimasukkan antara 1-10. Jika user
memasukkan nilai yang tidak sesuai berikan output Invalid number.
a. Gunakan statement if-else untuk menyelesaikan
b. Gunakan statement switch untuk menyelesaikan
16
MODUL 4
1. Tujuan
2. Dasar Teori
3. Tugas Pendahuluan
4. Praktikum
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class HanoiRekursif
{
static int nDisks = 4;
public static void main(String[] args)
{
doTowers(nDisks, 'A', 'B', 'C');
}
23
public static void doTowers(int topN,
char from, char inter, char to)
{
if(topN==1)
System.out.println("Disk 1 dari " + from + " ke "+ to);
else
{
doTowers(topN-1, from, to, inter); // dari --> media tengah.
System.out.println("Disk " + topN +
" dari " + from + " ke "+ to);
doTowers(topN-1, inter, from, to); // media tengah --> ke
}
}
} // Akhir kelas HanoiRekursif
5. Tugas Praktikum
1. Buat sebuah program yang mencetak nama Anda selama seratus kali. Buat
tiga versi program ini menggunakan while loop, do while dan for loop
2. Hitung pangkat sebuah nilai berdasarkan angka dan nilai pangkatnya.
Buat tiga versi dari program ini menggunakan while loop, do while dan
for loop
3. Buat program AnagramRekursif
24
MODUL 5
1. Tujuan
Memahami visibility
Memahami Pewarisan (Inheritance)
Memahami Antarmuka (interface)
2. Dasar Teori
3. Tugas Pendahuluan
4. Praktikum
package bigCat;
// Kelas abstrak
public abstract class Big_Cat {
protected static String name;
protected abstract void eat();
}
// Kelas turunan
class Lion extends Big_Cat {
// Kostruktor untuk kelas Lion
public Lion (String nameLion) {
// Mengisi peubah yang diwarisi dari kelas abstrak
Lion.name = nameLion;
25
}
// Implementasi metoda yang diwarisi dari kelas abstrak
public void eat() {
System.out.println("Lion can eat meat.");
}
}
//Kelas turunan
class Tiger extends Big_Cat {
// Kostruktor untuk kelas Lion
public Tiger (String nameTiger) {
// Mengisi peubah yang diwarisi dari kelas abstrak
Tiger.name = nameTiger;
}
// Implementasi metoda yang diwarisi dari kelas abstrak
public void eat() {
System.out.println("Tiger can eat meat and drink milk.");
}
}
//Kelas turunan
class Cat extends Big_Cat {
// Kostruktor untuk kelas Lion
public Cat (String nameCat) {
// Mengisi peubah yang diwarisi dari kelas abstrak
Cat.name = nameCat;
}
// Implementasi metoda yang diwarisi dari kelas abstrak
public void eat() {
System.out.println("Cat can eat meat, drink milk, and sometimes
rice.");
}
}
package bigCat;
26
public class TestBigCat {
public static void main(String[] args) {
package bigCatNoOverload;
//Kelas turunan
class WildTiger extends Big_Cat_NoOverload {
// Kostruktor untuk kelas Lion
public WildTiger (String nameTiger) {
27
// Mengisi peubah yang diwarisi dari kelas abstrak
WildTiger.name = nameTiger;
}
}
//Kelas turunan
class WildCat extends Big_Cat_NoOverload {
// Kostruktor untuk kelas Lion
public WildCat (String nameCat) {
// Mengisi peubah yang diwarisi dari kelas abstrak
WildCat.name = nameCat;
}
}
package bigCatNoOverload;
class Coba_Akses1 {
public static void main (String[] args) {
Kucing kucingku = new Kucing();
package KucingGarong;
class Kucing {
String Nama;
String Warna;
int Berat;
// Metoda
void Isi_Identitas
(String namaKucing, String warnaKucing, int beratKucing) {
Nama = namaKucing;
Warna = warnaKucing;
Berat = beratKucing;
}
String ambilNama() {
return Nama;
}
String ambilWarna() {
29
return Warna;
}
int ambilBerat() {
return Berat;
}
}
package MySweetyCat;
class Coba_Akses2 {
public static void main (String[] args) {
Kucingku_Manis kucingku = new Kucingku_Manis();
package MySweetyCat;
class Kucingku_Manis {
String Nama;
private String Warna;
private int Berat;
// Metoda
void Isi_Identitas
(String namaKucing, String warnaKucing, int beratKucing) {
Nama = namaKucing;
Warna = warnaKucing;
Berat = beratKucing;
}
30
String ambilNama() {
return Nama;
}
String ambilWarna() {
return Warna;
}
int ambilBerat() {
return Berat;
}
}
package OrangIndonesia;
// Overloading Metoda
public String hitungTHR (double persen){
32
if (persen > 0.5)
return "THR terlalu besar!";
else return "THR tahun ini sebesar " +
persen * Gaji;
}
package OrangIndonesia;
33
OrangSumba os = new OrangSumba
("Rocky", "Sumba", "Dosen");
os.setGaji(2000000);
System.out.println("Nama : " + os.getNama());
System.out.println("Alamat : " + os.getAlamat());
System.out.println("Pekerjaan : " + os.getPekerjaan());
System.out.println("Gaji : Rp " + os.getGaji());
System.out.println
("Keterangan : " + os.hitungTHR(30) + "\n");
package rumahAna;
package rumahAna;
import rumahAna.Alamat;
34
}
public void aturJalan() {
System.out.println("Jln. Hasanudin No. 8.");
}
public void aturNama() {
System.out.println("Namaku : Ana Mariana");
}
}
package rumahAna;
5. Tugas Praktikum
35
MODUL 6
1. Tujuan
2. Dasar Teori
3. Tugas Pendahuluan
4. Praktikum
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
39
Percobaan 3. Program class TestVector
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;
5. Tugas Praktikum
Name : Florence
Telp : 735-1234
Address : Manila
Name : Joyce
Telp : 983-3333
Address : Quezon City
Name : Becca
Telp : 456-3322
Address : Manila
41
MODUL 7
1. Tujuan
2. Dasar Teori
Pengurutan data dapat dilakukan secara urut naik (ascending) atau urut
turun (decending), keuntungan dari data terurut adalah kemudahan dalam
mencari data tertentu serta kemudahannya untuk dilakukan perbaikan,
disisipi data yang baru, dihapus dan digabungkan. Pengurutan data
terdapat beeberapa metode yaitu Bubble Sort, Selection Sort, Insertion
Sort, ShellSort, Quick Short
Pencarian elemen tertentu pada suatu vector yang telah terurut akan
menjadi lebih efektif dan cepat dibandingkan dengan melakukan
pencarian dalam vector yang belum terurut.
3. Tugas Pendahuluan
4. Praktikum
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
42
import java.util.Vector;
import java.util.Vector;
import java.util.Vector;
46
public class Selection {
public static Vector<Integer> Sort(Vector<Integer> vectorSelection) {
int i;
int ukuran = Data.getUkuranVector();
int max;
while (ukuran > 0){
max = 0;
for(i=1; i<ukuran; i++){
if (vectorSelection.get(max) <
vectorSelection.get(i)) {
max = i;
}
}
int temp = vectorSelection.get(max);
vectorSelection.set(max, vectorSelection.get(ukuran-
1));
vectorSelection.set(ukuran-1, temp);
ukuran--;
}
return vectorSelection;
}
}
import java.util.Vector;
static int N;
static int distance;
static int j;
static int i;
static Vector<Integer> vectorShell;
import java.util.Vector;
int hasil;
boolean ketemu = false;
private Vector<Integer> vectorArs;
50
import java.util.Vector;
int hasil;
boolean ketemu = false;
private Vector<Integer> vectorBnr;
import java.util.Vector;
5. Tugas Praktikum
1. Buat program dengan inputan NIM (empat digit terakhir), nama, dan
fakultas untuk beberapa mahasiswa, kemudian lakukan sorting terhadap
inputan berdasarkan NIMnya!
2. Buat sebuah program database pabrik, merk, CC dan harga sepeda motor
kemudian hasil tersebut bisa diurutkan berdasarkan harga dan CCnya
(secara ascending dan descending)!
Misal:
Yamaha >> Mio >> 135CC >> 12.000.000
Honda >> Revo >> 100CC >> 13.000.000
Viar >> ViarX >> 125CC >> 7.000.000
52
MODUL 8
1. Tujuan
2. Dasar Teori
3. Tugas Pendahuluan
4. Praktikum
//------------------------------------------------------------
public StackX(int s) {
maxSize = s; // Mengatur ukuran array.
stackArray = new Params[maxSize]; // Membuat array.
top = -1; // Saat stack kosong.
}
//------------------------------------------------------------//
Menaruh item di atas stack.
public void push(Params p)
{
55
// Melakukan penambahan top; menyisipkan item.
stackArray[++top] = p;
}
//------------------------------------------------------------//
Mengambil item dari bagian atas (top) stack.
//------------------------------------------------------------//
Melihat item di bagian atas stack.
public Params peek()
{
return stackArray[top];
}
//------------------------------------------------------------} //
end class StackX
package myStack;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//
------------------------------------------------------------public
static void recTriangle()
{
theStack = new StackX(50);
codePart = 1;
// Memanggil metoda step() hingga bernilai true.
while( step() == false)
// Pernyataan kosong.
;
}
//
------------------------------------------------------------public
static boolean step()
{
switch(codePart)
{
case 1: // Pemanggilan awal.
theseParams = new Params(theNumber, 6);
theStack.push(theseParams);
codePart = 2;
break;
case 2: // Jalan masuk metoda.
theseParams = theStack.peek();
if(theseParams.n == 1) // Pengujian.
{
theAnswer = 1;
codePart = 5; // Keluar (exit).
}
else
codePart = 3; // Pemanggilan rekursif.
break;
case 3: // Pemanggilan metoda.
Params newParams =
new Params(theseParams.n - 1, 4);
theStack.push(newParams);
57
codePart = 2; // Masuk ke metoda.
break;
case 4: // Perhitungan.
theseParams = theStack.peek();
theAnswer = theAnswer + theseParams.n;
codePart = 5;
break;
case 5: // Keluar (exit) metoda.
theseParams = theStack.peek();
codePart = theseParams.returnAddress; // (4 atau 6)
theStack.pop();
break;
case 6: // Titik kembali.
return true;
} // end switch
// -------------------------------------------------------------
public static String getString() throws IOException
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
// -------------------------------------------------------------
// stackTriangle.java
// Mengevaluasi segitiga Phytagoras, stack menggantikan rekursion.
58
Percobaan 3. Program simulasi Stack dengan teknik Rekursif
package myStack;
public class StackX2 {
int maxSize; // Ukuran array stack.
int[] stackArray;
int top; // Bagian atas (top) stack
StackX2(int s) // constructor
{
maxSize = s;
stackArray = new int[maxSize];
top = -1;
}
package myStack;
import java.io.BufferedReader;
import java.io.IOException;
59
import java.io.InputStreamReader;
//
------------------------------------------------------------public
static void stackTriangle() {
theStack = new StackX2(10000); // Membuat stack
theAnswer = 0; // Menginisialisasi theAnswer
while (theNumber > 0) // Hingga n bernilai 1,
{
theStack.push(theNumber); // Memasukkan nilai.
--theNumber; // Mengurangi nilai.
}
while (!theStack.isEmpty()) // Hingga stack kosong,
{
int newN = theStack.pop(); // Mengeluarkan (pop) nilai,
theAnswer += newN; // Menambah nilai theAnswer
}
}
// -------------------------------------------------------------
public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
// -------------------------------------------------------------
public static int getInt() throws IOException {
60
String s = getString();
return Integer.parseInt(s);
}
}
import java.util.*;
Contoh:
INFIKS POSTFIKS
3+7 37+
2-9 29-
8*7 87*
9/3 93/
Misal : algoritma 3 7 +
66
MODUL 9
1. Tujuan
2. Dasar Teori
Kode diatas apabila dicompile maka akan membentuk sebuah node bertipe
Gerbong dengan nama kepala. Karena bertipe list maka kepala juga memiliki 2
field seperti list yaitu field data dan field next. Bila diasumsikan dengan gerbong
maka pada proses ini dibentuk gerbong A.
//Tambah Depan
if (kepala->next==NULL)
{
baru-->next=kepala; //menyambung node baru dengan node kepala
kepala =baru ; //memindahkan kepala ke node baru
}
//Tambah Belakang
ekor - >next =baru ; //menyambung node paling akhir/ekor ke
node baru ekor =baru ; //meniindahkan ekor ke node terakhir
yaitu node baru .
ekor - >next =NULL ;
Tambah belakang berarti node baru yang terbentuk akan diletakan di posisi paling
belakang.
PENGHAPUSAN NODE
Pada senarai berkepala, penghapusan sebuah list dilakukan jika ada list lain
yang bukan list "kepala" dalam barisan senarai tersebut. Dengan kata lain, list yang
digunakan sebagai "kepala" tidak boleh dihapus, "kepala harus dipindahkan terlebih
dahulu. Keyword yang digunakan adalah delete. Contoh:
//Hapus Depan
68
if(kepala->next!=NULL)
{ if(kepala->next==ekor)
{ hapus=kepala;
kepala=kepala->next;
delete hapus;
}
}
else
{
kepala=NULL;
}
//Hapus Belakang
if(head->next!=NULL)
{
bantu=kepala;
while(bantu->next->next!=NULL)
{ bantu=bantu->next;
}
hapus=bantu->next;
bantu->next = NULL;
delete hapus;
}
else
{
head =NULL;
}
69
MENAMPILKAN ISI NODE
Untuk menampilkan isi suatu node dengan cara mengakses field yang ada di dalam
node tersebut. Yaitu dengan Contoh :
bantu =head;
while(bantu!=NULL)
{
print(%i ,bantu->data);
bantu=bantu->next;
}
3. Tugas Pendahuluan
4. Praktikum
public pLinkedList(){
head = null;
number = 0;
}
public boolean isEmpty(){
return head == null;
}
public int size(){
return number;
}
public void insert(Object obj){
head = new pOneChildNode(obj,head);
number++;
70
}
public Object remove(){
if(isEmpty())
return null;
pOneChildNode tmp = head;
head = tmp.getNext();
number--;
return tmp.getData();
}
public void insertEnd(Object obj){
if(isEmpty())
insert(obj);
else{
pOneChildNode t = head;
while(t.getNext() != null)
t=t.getNext();
pOneChildNode tmp =
new pOneChildNode(obj,t.getNext());
t.setNext(tmp);
number++;
}
}
public Object removeEnd(){
if(isEmpty())
return null;
if(head.getNext() == null)
return remove();
pOneChildNode t = head;
while(t.getNext().getNext() != null) t
= t.getNext();
Object obj = t.getNext().getData();
t.setNext(t.getNext().getNext());
number--;
return obj;
}
public Object peek(int n){
pOneChildNode t = head;
for(int i = 0;i<n && t != null;i++) t
= t.getNext();
return t.getData();
}
}
71
Percobaan 2. Single Link List
package defaultSinglyLinkedList;
import java.util.LinkedList;
72
// Konstruktor 1.
public pOneChildNode(){
next = null;
data = null;
}
// Konstruktor 2.
public pOneChildNode(Object d,pOneChildNode n){
data = d;
next = n;
}
// Pengaturan nilai pointer next.
public void setNext(pOneChildNode n){
next = n;
}
// Pengaturan nilai data.
public void setData(Object d){
data = d;
}
// Mengambil nilai pointer next.
public pOneChildNode getNext(){
return next;
}
// Mengambil nilai data yang tersimpan dalam Node.
public Object getData(){
return data;
}
// Mengubah nilai data ke bentuk String.
public String toString(){
return ""+data;
}
}
import java.lang.String;
import java.util.*;
74
protected void setHead(pTwoChildNode p) {
head = p;
}
public pDoublyLinkedList() {
setHead(new pTwoChildNode());
setTail(new pTwoChildNode());
getTail().setLeft(head);
getHead().setRight(tail);
num = 0;
}
pTwoChildNode p = getHead();
pTwoChildNode p = getTail();
public pTwoChildNode() {
data = null;
left = right = null;
}
public pTwoChildNode(String d) {
data = d;
left = right = null;
}
}
private static void isiList() {
System.out
.print("Mau tulis dari belakang-depan (1) atau
depan-belakang (9) : ");
int kendali = inputData();
79
System.out.println("Isi list :"); if
(kendali == 1) {
int i = 1;
Enumeration<Object> e = list.elementsHeadToTail();
while (e.hasMoreElements())
System.out.println("Kalimat " + (i++) + " : " +
((String) e.nextElement())
+ " ");
}
if (kendali == 9) {
int i = 1;
Enumeration<Object> e = list.elementsTailToHead();
while (e.hasMoreElements())
System.out.println("Kalimat " + (i++) + " : " +
((String) e.nextElement())
+ " ");
}
}
5. Tugas Praktikum
1. Buatlah sebuah linked list non circular yang berisi nim anda dan nama
lengkap anda.
80
2. Buat fungsi untuk menambahkan node single linked list non circular dimana
tiap node mengandung informasi nim dan nama. Peletakan posisi node
urut berdasar nim secara ascending, jadi bisa tambah depan, belakang
maupun tambah di tengah.
Isikan data nim dan nama lengkap teman sebelah kiri dan kanan anda!!!
3. Buatlah fungsi untuk menampilkan data 3 buah node yang telah anda bentuk
sebelumnya. Contoh tampilan
NIM Nama Lengkap
04511012 Adi Hendrawan
04511019 Januar Priya
04511028 Anggraeni
4. Buatlah fungsi untuk mencari nama yang telah diinputkan dengan
menggunakan NIM.
Contoh tampilan:
Inputkan nim yang dicari =
04511028 Nama yang
tercantum Anggraeni
5. Buatlah sebuah fungsi untuk menghapus nim yang diinputkan oleh user.
Contoh tampilan:
NIM yang mau dihapus = 04511028
NIM dengan nama Anggraeni ditemukan dan telah dihapus
6. Buatlah sebuah program dengan menggunakan single linked list non circular
dengan fungsi-fungsi:
menambah data(dari depan dan dari belakang)
search data yang telah diinputkan
menghapus data( dari depan dan dari belakang)
mencetak data
Buat dengan menggunakan menu ya..
7. (soal extended) Dengan menggunakan soal no 6 tambahkan 4 fungsi
tambahan:
menambah data(di tengah)
menghapus data tertentu(berada di tengah)
mengurutkan data acak secara acending
mengurutkan data acak secara decending
81
MODUL 10
TREE
1. Tujuan
2. Dasar Teori
Dalam ilmu komputer, tree adalah sebuah struktur data yang secara bentuk
menyerupai sebuah pohon, yang terdiri dari serangkaian node (simpul) yang saling
berhubungan. Node-node tersebut dihubungkan oleh sebuah vektor. Setiap node
dapat memiliki 0 atau lebih node anak (child). Sebuah node yang memiliki node
anak disebut node induk (parent). Sebuah node anak hanya memiliki satu node
induk. Sesuai konvensi ilmu komputer, tree bertumbuh ke bawah, tidak seperti
pohon di dunia nyata yang tumbuh ke atas. Dengan demikian node anak akan
digambarkan berada di bawah node induknya.
Node yang berada di pangkal tree disebut node root (akar), sedangkan node yang
berada paling ujung pada piramida tree disebut node leaf (daun).
Ilustrasi Tree:
3. Tugas Pendahuluan
4. Praktikum
85
public boolean delete(int id)
{ // (Asumsi pohon tidak kosong)
Node current = root;
Node parent = root;
boolean isLeftChild = true;
while(current.iData != id) // Mencari Node yang akan dihapus.
{
parent = current;
if(id < current.iData) // Pergi ke kiri?
{
isLeftChild = true;
current = current.leftChild;
}
else // Atau pergi ke kanan?
{
isLeftChild = false;
current = current.rightChild;
}
if(current == null) // Akhir baris
return false; // Node yang dicari tidak
ditemukan. } // end while
// Node yang akan dihapus ditemukan.
// Jika Node tidak memiliki anak, hapus!
if(current.leftChild==null &&
current.rightChild==null)
{
if(current == root) // Jika Node yang dihapus merupakan akar (Node).
root = null; // Pohon biner menjadi kosong.
else if(isLeftChild) // Jika Node yang dihapus adalah anak sebelah kiri.
parent.leftChild = null; // Pemutusan koneksi.
else // Jika Node yang akan dihapus adalah anak sebelah kanan.
parent.rightChild = null;
}
// Jika tidak ada anak kanan, ganti dengan subpohon kiri.
else if(current.rightChild==null)
if(current == root)
root = current.leftChild;
else if(isLeftChild) // Anak sebelah kiri induk.
parent.leftChild = current.leftChild;
else // Anak sebelah kanan induk.
parent.rightChild = current.leftChild;
// Jika tak ada anak kiri, gantikan dengan subpohon sebelah kanan.
86
else if(current.leftChild==null)
if(current == root)
root = current.rightChild;
else if(isLeftChild) // Anak sebelah kiri induk.
parent.leftChild = current.rightChild;
else // Anak sebelah kanan induk.
parent.rightChild = current.rightChild;
else // Dua anak, gantikan dengan successor inorder.
{
// Mendapatkan successor Node untuk dihapus (current)
Node successor = getSuccessor(current);
// Menghubungkan induk Node saat ini ke successor.
if(current == root)
root = successor;
else if(isLeftChild)
parent.leftChild = successor;
else
parent.rightChild = successor;
// connect successor to current's left child
successor.leftChild = current.leftChild; } //
end else two children
// (successor tidak mempunyai anak sebwlah kiri)
return true;
} // end delete()
Percobaan 3. Node
class Node
{
int iData; // data yang digunakan sebagai nilai kunci.
Node leftChild; // Simpul rujukan ke anak sebelah kiri.
Node rightChild; // Simpul rujukan ke anak sebelah kanan.
}
5. Tugas Praktikum
1. Buatlah fungsi untuk menghapus sebuah node tertentu. Inputnya adalah node
yang ingin dihapus.
2. Buatlah fungsi untuk mencari dan menampilkan node anak (kiri + kanan) dari
sebuah node tertentu. Inputnya adalah node yang ingin ditampilkan anaknya.
Untuk pengerjaannya boleh memakai 1 fungsi atau lebih.
88
MODUL 11
HASH TABLE
1. Tujuan
2. Dasar Teori
3. Tugas Pendahuluan
4. Praktikum
Percobaan 1. HashAssociation
package packageHashTable;
class HashAssociation<K extends Number, V> {
protected K theKey;
protected V theValue;
protected K key;
protected V value;
89
HashAssociation() {
this.theKey = key;
this.theValue = value;
}
V setValue(V value) {
V oldValue = theValue;
theValue = value;
return oldValue;
}
K getTheKey() {
return theKey;
}
V getTheValue() {
return theValue;
}
Percobaan 2. HashTable
package packageHashTable;
import java.util.Vector;
int count;
int hash;
final double maximumLoadFactor = 0.5;
public static HashAssociation<Integer, String> DATA;
public static Vector<HashAssociation<Integer, String>> data;
90
public HashTable(int initialCapacity) {
if (initialCapacity > 0) {
System.out.print("Kapasitas Hashtable positip.");
data = new Vector<HashAssociation<Integer,
String>>();
data.setSize(initialCapacity);
count = 0;
}
}
public HashTable() {
this(100);
}
Percobaan 3. TesthashTable
package packageHashTable;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
Percobaan 4. AbstractIterator
package packageTestVectorIterator;
import java.util.Enumeration;
import java.util.Iterator;
Percobaan 5. HashAssociation
package packageTestVectorIterator;
class HashAssociation<K extends Number, V> {
protected K theKey;
protected V theValue;
protected K key;
protected V value;
HashAssociation() {
this.theKey = key;
this.theValue = value;
}
V setValue(V value) {
V oldValue = theValue;
theValue = value;
return oldValue;
}
K getTheKey() {
return theKey;
}
V getTheValue() {
return theValue;
}
Percobaan 6. VectorIterator
package packageTestVectorIterator;
95
import java.util.Iterator;
import java.util.Vector;
@SuppressWarnings("hiding")
class VectorIterator<E> extends AbstractIterator<E> {
protected Vector<E> theVector;
protected int current;
public Iterator<E> iterator()
{
return new VectorIterator<E>();
}
public void reset()
{
current = 0;
}
public boolean hasNext()
{
return current < theVector.size();
}
public E get()
{
return theVector.get(current);
}
public E next()
{
return theVector.get(current++);
}
}
Percobaan 7. TestIteratorforVector
package packageTestVectorIterator;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Vector;
Percobaan 8. TestVectorIterator_forHash
package packageTestVectorIterator;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;
public TestVectorIterator_forHAssc
(Vector<HashAssociation<Integer, String>> v)
{ super();
}
5. Tugas Praktikum
Buat Kesimpulan dengan deskripsi tentang penggunaan struktur data hash table
dari beberapa percobaan diatas
100
MODUL 12
GRAPH
1.Tujuan
2. Dasar Teori
Graph merupakan salah satu dari beberapa struktur data yang paling
sering diaplikasikan dalam pemrograman komputer. Jika memutuskan
untuk menggunakan penyimpanan data yang bersifat eksternal (external
storage), tidak membutuhkan graph, tetapi untuk permasalahan dimana
diperlukan representasi internal dalam memori komputer untuk suatu
struktur data, graph harus digunakan. Graph terdiri dari graph tidak
berbobot (unweighted graph) dan graph berbobot (weighted graph)
3. Tugas Pendahuluan
4. Praktikum
Percobaan 1. Graph
package DFS_BFS_MFS;
class Graph
{
private final int MAX_VERTS = 20;
private Vertex vertexList[]; // Daftar simpul.
101
private int adjMat[][]; // adjacency matrix
private int nVerts; // jumlah simpul saat ini.
private static StackX theStack;
private static QueueX theQueue;
// ------------------
public Graph() // constructor
{
vertexList = new Vertex[MAX_VERTS];
// adjacency matrix
adjMat = new int[MAX_VERTS][MAX_VERTS];
nVerts = 0;
for(int j=0; j<MAX_VERTS; j++) // Menginisialisasi adjacency
for(int k=0; k<MAX_VERTS; k++) // matrix ke nilai 0.
adjMat[j][k] = 0;
theStack = new StackX();
theQueue = new QueueX();
} // end constructor
// ------------------
public void addVertex(char lab)
{
vertexList[nVerts++] = new Vertex(lab);
}
// ------------------
public void addEdge(int start, int end)
{
adjMat[start][end] = 1;
adjMat[end][start] = 1;
}
// ------------------
public void displayVertex(int v)
{
System.out.print(vertexList[v].label);
}
// ------------------
//-----------------------------------------------------------
public void bfs() // breadth-first search
{ // Mulai vertex 0
vertexList[0].wasVisited = true; // Tandai
displayVertex(0); // Tampilkan.
theQueue.insert(0); // Tambah di bagian belakang. int
v2;
while( !theQueue.isEmpty() ) // Hingga queue kosong,
{
int v1 = theQueue.remove(); // Hapus vertex di bagian depan.
// Hingga tidak ada simpul tetangga yang belum dikunjungi.
while( (v2=getAdjUnvisitedVertex(v1)) != -1 )
{ // get one,
vertexList[v2].wasVisited = true; // Tandai.
displayVertex(v2); // Tampilkan.
theQueue.insert(v2); // Sisipkan.
} // end while
} // end while(queue tidak kosong)
//Stack kosong
for(int j=0; j<nVerts; j++) // Pengaturan-ulang flags
103
vertexList[j].wasVisited = false;
} // end bfs()
// ------------------------------------------------------------
// ------------------
public void mps() {
vertexList[0].wasVisited = true; // Tandai.
theStack.push(0); // Masukkan (push) ke Stack.
while(!theStack.isEmpty() ) // Hingga stack kosong.
{ // Mendapatkan nilai pada bagian atas (top) stack. int
currentVertex = theStack.peek();
// Hingga tidak ada simpul tetangga yang belum dikunjungi. int
v = getAdjUnvisitedVertex(currentVertex);
if(v == -1) // Jika tidak ada simpul tetangga lagi.
theStack.pop(); // Lakukan pop.
else // Simpul tetangga ada.
{
vertexList[v].wasVisited = true; // Tandai.
theStack.push(v); // Masukkan (push) ke stack. //
Tampilkan lintasan.
displayVertex(currentVertex); // dari currentV
displayVertex(v); // ke v
System.out.print(" ");
}
} // end while(stack tidak kosong)
// Stack kosong
for(int j=0; j<nVerts; j++) // Pengaturan-ulang flags
vertexList[j].wasVisited = false;
} // end mst()
} // end class Graph
104
Percobaan 2. QueueX
package DFS_BFS_MFS;
class QueueX
{
private final int SIZE = 20;
private int[] queArray;
private int front;
private int rear;
public QueueX() // constructor
{
queArray = new int[SIZE];
front = 0;
rear = -1;
}
public void insert(int j) //Memasukkan item ke bagian belakang queue.
{
if(rear == SIZE-1)
rear = -1;
queArray[++rear] = j;
}
public int remove() // Mengambil item dari bagian depan queue.
{
int temp = queArray[front++];
if(front == SIZE)
front = 0;
return temp;
}
public boolean isEmpty() // Bernilai true queue kosong.
{
return ( rear+1==front || (front+SIZE-1==rear) );
}
} // end class Queue
Percobaan 3. StackX
package DFS_BFS_MFS;
//
--------------------------------------------------------class
StackX
{
private final int SIZE = 20;
private int[] st;
105
private int top;
public StackX() // Constructor.
{
st = new int[SIZE]; //Membuat array.
top = -1;
}
public void push(int j) // Menaruh item ke stack.
{ st[++top] = j; }
public int pop() // Mengambil item dari stack.
{ return st[top--]; }
public int peek() // Melihat simpul di atas (top) stack.
{ return st[top]; }
public boolean isEmpty() // Bernilai true jika stack kosong.
{ return (top == -1); }
} // end class StackX
Percobaan 4. TestGraph
package DFS_BFS_MFS;
theGraph.addVertex('A'); // 0
theGraph.addVertex('B'); // 1
theGraph.addVertex('C'); // 2
theGraph.addVertex('D'); // 3
theGraph.addVertex('E'); // 4
theGraph.addEdge(0, 1); // AB
theGraph.addEdge(0, 2); // AC
theGraph.addEdge(0, 3); // AD
theGraph.addEdge(0, 4); // AE
theGraph.addEdge(1, 2); // BC
theGraph.addEdge(1, 3); // BD
theGraph.addEdge(1, 4); // BE
theGraph.addEdge(2, 3); // CD
theGraph.addEdge(2, 4); // CE
theGraph.addEdge(3, 4); // DE
Percobaan 5. Vertex
package DFS_BFS_MFS;
class Vertex
{
public char label; // Label (misal. 'A')
public boolean wasVisited;
// ------------------
public Vertex(char lab) // Constructor.
{
label = lab;
wasVisited = false;
}
// ------------------
} // end class Vertex
Percobaan 6. MFS
package MFS_for_WEIGHTGRAPH;
class Graph
{
private final int MAX_VERTS = 20;
private final int INFINITY = 1000000;
private Vertex vertexList[]; // daftar vertx
private int adjMat[][]; // adjacency matrix
private int nVerts; // jumlah vertex saat ini.
private int currentVert;
private PriorityQ thePQ;
private int nTree; // jumlah vertex di tree
//
-----------------------------------------------------------public
Graph() // constructor
{
vertexList = new Vertex[MAX_VERTS];
// adjacency matrix
adjMat = new int[MAX_VERTS][MAX_VERTS];
nVerts = 0;
for(int j=0; j<MAX_VERTS; j++) // Menginisialisasi adjacency
for(int k=0; k<MAX_VERTS; k++) // matrix ke nilai 0
adjMat[j][k] = INFINITY;
thePQ = new PriorityQ();
} // end constructor
//
-----------------------------------------------------------public
void addVertex(char lab)
{
vertexList[nVerts++] = new Vertex(lab);
}
// ------------------------------------------------------------
public void addEdge(int start, int end, int weight)
{
adjMat[start][end] = weight;
adjMat[end][start] = weight;
}
//
-----------------------------------------------------------public
void displayVertex(int v)
108
{
System.out.print(vertexList[v].label);
}
// ------------------------------------------------------------
public void mstw() // Algoritma Minimum Spanning Tree
{
currentVert = 0; // start di 0
while(nTree < nVerts-1) // selama tidak ada verts di tree
{ // Letakkan currentVert di tree
vertexList[currentVert].isInTree = true;
nTree++;
// Sisipkan lintasan (edge) yang berdampingan //
dengan currentVert ke dalam PQ
for(int j=0; j<nVerts; j++) // Untuk setiap vertex,
{
if(j==currentVert) // Lompati jika sudah dilewati.
continue;
if(vertexList[j].isInTree) // Lompati jika ada di tree
continue;
int distance = adjMat[currentVert][j];
if( distance == INFINITY) // Lompati jika tidak ada lintasan (edge)
continue;
putInPQ(j, distance); // Letakkan di PQ (mungkin)
}
if(thePQ.size()==0) // Tidak ada vertex di PQ?
{
System.out.println(" GRAPH TIDAK TERHUBUNG!");
return;
}
// Hapus lintasan (edge) dengan jarak minimum, dari PQ
Edge theEdge = thePQ.removeMin();
int sourceVert = theEdge.srcVert;
currentVert = theEdge.destVert;
// Menampilkan lintasan (edge) dari source ke current
System.out.print( vertexList[sourceVert].label );
System.out.print( vertexList[currentVert].label );
System.out.print(" ");
} // end while(tidak semua verts di tree) //
mst is complete
for(int j=0; j<nVerts; j++) // Hilangkan tanda di vertex-vertex.
vertexList[j].isInTree = false;
} // end mstw
109
// ------------------------------------------------------------
public void putInPQ(int newVert, int newDist)
{
// Apa ada lintasan (edge) lain yang bertujuan sama? int
queueIndex = thePQ.find(newVert);
if(queueIndex != -1) // Mendapatkan index lintasan (edge).
{
Edge tempEdge = thePQ.peekN(queueIndex); // Mendapatkan lintasan (edge).
int oldDist = tempEdge.distance;
if(oldDist > newDist) // Jika lintasan (edge) baru lebih pendek.
{
thePQ.removeN(queueIndex); // Hapus lintasan (edge) lama.
Edge theEdge = new Edge(currentVert, newVert, newDist);
thePQ.insert(theEdge); // Sisipkan lintasan (edge) baru.
}
// else tidak ada aksi apa-apa;
// tinggalkan vertex lama di sini.
} // end if
else // Tidak ada lintasan (edge) dengan vertex tujuan yang sama
{ // sisipkan yang baru.
Edge theEdge = new Edge(currentVert, newVert, newDist);
thePQ.insert(theEdge);
}
} // end putInPQ()
// -----------------------------------------------------------} //
end class Graph
Percobaan 8. MSTWApp
package MFS_for_WEIGHTGRAPH;
class MSTWApp
{
public static void main(String[] args)
{
Graph theGraph = new Graph();
theGraph.addVertex('A'); // 0 (start for mst)
theGraph.addVertex('B'); // 1
theGraph.addVertex('C'); // 2
theGraph.addVertex('D'); // 3
theGraph.addVertex('E'); // 4
110
theGraph.addVertex('F'); // 5
theGraph.addEdge(0, 1, 6); // AB 6
theGraph.addEdge(0, 3, 4); // AD 4
theGraph.addEdge(1, 2, 10); // BC 10
theGraph.addEdge(1, 3, 7); // BD 7
theGraph.addEdge(1, 4, 7); // BE 7
theGraph.addEdge(2, 3, 8); // CD 8
theGraph.addEdge(2, 4, 5); // CE 5
theGraph.addEdge(2, 5, 6); // CF 6
theGraph.addEdge(3, 4, 12); // DE 12
theGraph.addEdge(4, 5, 7); // EF 7
System.out.println("Minimum Spanning Tree : ");
theGraph.mstw(); // minimum spanning tree
} // end main()
} // end class MSTWApp
Percobaan 9. PriorityQ
package MFS_for_WEIGHTGRAPH;
class PriorityQ
{
// array dalam keadaan terurut, dari max = 0 hingga min = size-1
private final int SIZE = 20;
private Edge[] queArray;
private int size;
public PriorityQ() // constructor
{
queArray = new Edge[SIZE];
size = 0;
}
public void insert(Edge item) // Masukkan item dalam keadaan terurut.
{
int j;
for(j=0; j<size; j++) // Temukan tempat penyisipan.
if( item.distance >= queArray[j].distance )
break;
for(int k=size-1; k>=j; k--) // Gerakkan item ke atas.
queArray[k+1] = queArray[k];
queArray[j] = item; // Sisipkan item.
size++;
111
}
public Edge removeMin() // Hapus item minimum.
{ return queArray[--size]; }
public void removeN(int n) // Hapus item di n
{
for(int j=n; j<size-1; j++) // Gerakkan item ke bawah.
queArray[j] = queArray[j+1];
size--;
}
public Edge peekMin() // Lihat item minimum.
{ return queArray[size-1]; }
public int size() // Kembalikan jumlah item.
{ return size; }
public boolean isEmpty() // true jika queue kosong.
{ return (size==0); }
public Edge peekN(int n) // Lihat item n
{ return queArray[n]; }
public int find(int findDex) // Temukan item dengan nilai destVert yang
dispesifikasi.
{
for(int j=0; j<size; j++)
if(queArray[j].destVert == findDex)
return j;
return -1;
}
} // end class PriorityQ
package MFS_for_WEIGHTGRAPH;
class Vertex
{
public char label; // label (misal : 'A')
public boolean isInTree;
//
-----------------------------------------------------------public
Vertex(char lab) // constructor
{
label = lab;
isInTree = false;
}
// ------------------------------------------------------------
112
} // end class Vertex
package SHORTESTPATH_WEIGHTGRAPH;
package SHORTESTPATH_WEIGHTGRAPH;
class Graph
{
private final int MAX_VERTS = 20;
private final int INFINITY = 1000000;
private Vertex vertexList[]; // Daftar vertex-vertex.
private int adjMat[][]; // adjacency matrix
private int nVerts; // jumlah vertex saat ini.
private int nTree; // jumlah verts di tree.
// array untuk data lintasan terpendek
// (shortest-path)
private DistPar sPath[];
private int currentVert; // vertex saat ini.
private int startToCurrent; // jarak ke currentVert.
//
-----------------------------------------------------------public
Graph() // constructor
{
vertexList = new Vertex[MAX_VERTS]; //
adjacency matrix
adjMat = new int[MAX_VERTS][MAX_VERTS];
113
nVerts = 0;
nTree = 0;
// menginisialisasi adjacency matrix
// ke infinity.
for(int j=0; j<MAX_VERTS; j++)
for(int k=0; k<MAX_VERTS; k++)
// Lintasan terpendek (shortest path).
adjMat[j][k] = INFINITY; sPath = new
DistPar[MAX_VERTS]; } // end constructor
//
-----------------------------------------------------------public
void addVertex(char lab)
{
vertexList[nVerts++] = new Vertex(lab);
}
// ------------------------------------------------------------
public void addEdge(int start, int end, int weight)
{
adjMat[start][end] = weight; // (berarah)
}
// -----------------------------------------------------------//
Menemukan semua lintasan terpendek
// (shortest path).
public void path()
{
int startTree = 0; // mulai dari vertex 0
vertexList[startTree].isInTree = true;
nTree = 1; // letakkan di tree
// transfer baris-baris (distances) dari //
adjMat ke sPath.
for(int j=0; j<nVerts; j++)
{
int tempDist = adjMat[startTree][j];
sPath[j] = new DistPar(startTree, tempDist);
}
// hingga semua vertex ada di tree.
while(nTree < nVerts)
114
{
// mendapat nilai minimum dari sPath.
int indexMin = getMin();
int minDist = sPath[indexMin].distance;
if(minDist == INFINITY) // jika semua infinite
{ // atau ada di tree,
System.out.println
("Simpul (vertex) tidak dapat dicapai! ");
break; // sPath selesai.
}
else
{ // melakukan pengaturan-ulang currentVert.
currentVert = indexMin; // ke vert terdekat.
startToCurrent = sPath[indexMin].distance; //
jarak minimum dari startTree adalah
// ke currentVert, dan startToCurrent.
}
// Letakkan vertex saat ini ke tree.
vertexList[currentVert].isInTree = true;
nTree++;
adjust_sPath(); // perbaharui array
sPath[]. } // end while(nTree<nVerts)
displayPaths(); // tampilkan isi sPath[]
nTree = 0; // hapus tree.
for(int j=0; j<nVerts; j++)
vertexList[j].isInTree = false;
} // end path()
//
-----------------------------------------------------------public
int getMin() // mendapatkan entry dari sPath { // yang
memiliki jarak minimum.
int minDist = INFINITY; // asumsikan minimum. int
indexMin = 0;
for(int j=1; j<nVerts; j++) // untuk setiap vertex,
{ // jika ada di tree dan
if( !vertexList[j].isInTree && // lebih kecil dari yang lama.
sPath[j].distance < minDist )
{
minDist = sPath[j].distance;
indexMin = j; // update minimum
}
115
} // end for
return indexMin; // mengembalikan index
minimum } // end getMin()
//
-----------------------------------------------------------public
void adjust_sPath()
{
// mengatur nilai-nilai dalam array sPath
// yang berisi lintasan terpendek.
int column = 1; // lompati vertex awal.
while(column < nVerts) // melintas kolom.
{
// jika kolom vertex ada di tree, lompati.
if( vertexList[column].isInTree )
{
column++;
continue;
}
// hitung jarak dari suatu entry sPath,
// dapatkan lintasan (edge) dari currentVert ke kolom. int
currentToFringe = adjMat[currentVert][column]; //
tambahkan jarak dari start
int startToFringe = startToCurrent + currentToFringe; //
dapatkan jarak (distance) entri sPath saat ini.
int sPathDist = sPath[column].distance;
// bandingkan jarak (distance) dari
// start dengan entri sPath.
if(startToFringe < sPathDist) // jika lebih pendek,
{ // perbaharui sPath
sPath[column].parentVert = currentVert;
sPath[column].distance = startToFringe;
}
column++;
} // end while(column < nVerts)
} // end adjust_sPath()
//
-----------------------------------------------------------public
void displayPaths()
{
// Menampilkan isi array sPath.
116
for(int j=0; j<nVerts; j++)
{
System.out.print(vertexList[j].label + "="); // B=
if(sPath[j].distance == INFINITY)
System.out.print("inf"); // inf
else
System.out.print(sPath[j].distance); // 50
char parent = vertexList[ sPath[j].parentVert ].label;
System.out.print("(" + parent + ") "); // (A)
}
System.out.println("");
}
// -----------------------------------------------------------} //
end class Graph
package SHORTESTPATH_WEIGHTGRAPH;
class PathApp
{
public static void main(String[] args)
{
Graph theGraph = new Graph();
theGraph.addVertex('A'); // 0 (start)
theGraph.addVertex('C'); // 2
theGraph.addVertex('B'); // 1
theGraph.addVertex('D'); // 3
theGraph.addVertex('E'); // 4
theGraph.addEdge(0, 1, 50); // AB 50
theGraph.addEdge(0, 3, 80); // AD 80
theGraph.addEdge(1, 2, 60); // BC 60
theGraph.addEdge(1, 3, 90); // BD 90
theGraph.addEdge(2, 4, 40); // CE 40
theGraph.addEdge(3, 2, 20); // DC 20
theGraph.addEdge(3, 4, 70); // DE 70
theGraph.addEdge(4, 1, 50); // EB 50
System.out.println("Shortest paths");
theGraph.path(); // shortest paths
117
System.out.println();
} // end main()
} // end class PathApp
package SHORTESTPATH_WEIGHTGRAPH;
class Vertex
{
public char label; // label (misalnya : 'A')
public boolean isInTree;
//
-----------------------------------------------------------public
Vertex(char lab) // constructor
{
label = lab;
isInTree = false;
}
// -----------------------------------------------------------} //
end class Vertex
package topologiSorting;
class GraphTopo
{
private final int MAX_VERTS = 20;
private Vertex vertexList[]; // Daftar vertex
private int adjMat[][]; // adjacency matrix
private int nVerts; // Jumlah vertex
private char sortedArray[];
// ------------------------------------------------------------
//
-----------------------------------------------------------public
void addVertex(char lab)
{
vertexList[nVerts++] = new Vertex(lab);
}
//
-----------------------------------------------------------public
void addEdge(int start, int end)
{
adjMat[start][end] = 1;
}
//
-----------------------------------------------------------public
void displayVertex(int v)
{
System.out.print(vertexList[v].label);
}
//
-----------------------------------------------------------public
void topo() // topological sort
{
int orig_nVerts = nVerts; // Mengingat berapa verts
while(nVerts > 0) // sementara vertex ada,
{
// Mendapat vertex tanpa successors, atau -1
int currentVertex = noSuccessors();
if(currentVertex == -1) // harus merupakan siklus
{
System.out.println("ERROR: Graph has cycles");
return;
}
// Menyisipkan label vertex label dalam array terurut (start
hingga end)
sortedArray[nVerts-1] =
vertexList[currentVertex].label;
deleteVertex(currentVertex); // delete
vertex } // end while
// vertices all gone; display sortedArray
System.out.print("Topologically sorted order: \n");
119
for(int j=0; j<orig_nVerts; j++)
System.out.println( sortedArray[j] );
System.out.println("\n");
} // end topo
// ------------------
public int noSuccessors() // Mengembalikan vert tanpa successors
{ // (atau -1 jika verts tidak ada)
boolean isEdge; // Lintasan (edge) dari ke to column dalam adjMat
for(int row=0; row<nVerts; row++) // untuk setiap vertex,
{
isEdge = false; // periksa lintasan (edge)
for(int col=0; col<nVerts; col++)
{
if( adjMat[row][col] > 0 ) // Jika lintasan (edge) ke
{ // yang lain,
isEdge = true;
break; // vertex ini
} // memiliki successor,
} // coba yang lain.
if( !isEdge ) // Jika tidak ada lintasan (edge)
return row; // Tidak ada successor
}
return -1; // Tidak ada vertex
} // end noSuccessors()
// ------------------
public void deleteVertex(int delVert)
{
if(delVert != nVerts-1) // Jika bukan vertex terakhir, { //
hapus dari vertexList
for(int j=delVert; j<nVerts-1; j++)
vertexList[j] = vertexList[j+1];
// hapus row dari adjMat
for(int row=delVert; row<nVerts-1; row++)
moveRowUp(row, nVerts);
// hapus col dari adjMat
for(int col=delVert; col<nVerts-1; col++)
moveColLeft(col, nVerts-1);
}
nVerts--; // Kurangi vertex
} // end deleteVertex
120
// ------------------
private void moveRowUp(int row, int length)
{
for(int col=0; col<length; col++)
adjMat[row][col] = adjMat[row+1][col];
}
// ------------------
private void moveColLeft(int col, int length)
{
for(int row=0; row<length; row++)
adjMat[row][col] = adjMat[row][col+1];
}
// -----------------------------------------------------------} //
end class Graph
package topologiSorting;
package topologiSorting;
class Vertex
{
public char label; // Label (misal. 'A')
public boolean wasVisited;
// ------------------
public Vertex(char lab) // Constructor.
{
label = lab;
wasVisited = false;
}
// ------------------
} // end class Vertex
5. Tugas Praktikum
Buat Kesimpulan dengan deskripsi tentang penggunaan struktur data graph dari
beberapa percobaan diatas
122