LABORATORIUM PEMBELAJARAN ILMU KOMPUTER
FAKULTAS ILMU KOMPUTER
UNIVERSITAS BRAWIJAYA
BAB
: DOUBLE LINKED LIST
NAMA
: M SATRIA PUTRA UTAMA
NIM
: 155150207111168
TANGGAL : 15/10/2016
ASISTEN
: ILHAM ROMADHONA
A.
DEFINISI MASALAH
Modifikasilah program di atas dengan mengganti tipe item data pada NodeDLL dengan
Object. Kemudian gunakan class Mahasiswa yang pernah dibuat pada praktikum 4
untuk diisikan pada DLL. Gunakan pemasukan data secara interaktif.
B.
SOURCE CODE
Mahasiswa.java 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
package asdpraktikum; public class Mahasiswa { private String nim; private String nama; private double ipk; public Mahasiswa() { }
public Mahasiswa(String nama, String nim, double ipk) { this.nama = nama;
this.nim = nim; this.ipk = ipk; }
public String getNim() { return nim;
}
public String getNama() { return nama;
}
public double getIpk() { return ipk;
} }
NodeDLL.java 1
2 3 4 5
package asdpraktikum; public class NodeDLL { Mahasiswa data; NodeDLL prev, next; }
DLL_Mahasiswa.java 1
2 3 4 5 6 7
package asdpraktikum;
public class DLL_Mahasiswa {
private NodeDLL pKepala, pEkor; int size;
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
pEkor = null; }
public int getSize() { return size;
}
public void sisipDipKepala(Mahasiswa mahasiswa) { NodeDLL Baru = new NodeDLL();
Baru.data = mahasiswa; if (pKepala == null) { Baru.prev = pKepala; Baru.next = pEkor; pKepala = Baru; pEkor = Baru; } else {
Baru.next = pKepala; pKepala.prev = Baru; pKepala = Baru; }
}
public void sisipDipEkor(Mahasiswa data) { NodeDLL baru = new NodeDLL();
baru.data = data; if (pEkor == null) { baru.prev = pKepala; baru.next = pEkor; pKepala = baru; pEkor = baru; } else {
baru.prev = pEkor; pEkor.next = baru; pEkor = baru; }
}
public void cetak(String komentar) { System.out.println(komentar); NodeDLL kom = pKepala;
System.out.println("=========================================== ======"
+ "================");
System.out.println("|\t NAMA \t\t|\t NIM \t\t|\t IPK \t|");
System.out.println("=========================================== ======"
+ "================"); while (kom != null) {
System.out.println("|\t" + kom.data.getNama() + "\t|\t"
+ kom.data.getNim() + "\t|\t" + kom.data.getIpk() + "\t|");
kom = kom.next; } System.out.println("=========================================== ======" + "================"); }
public void hapusDepan() { Mahasiswa dtHapus;
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
pKepala = pKepala.next; dtHapus = pKepala.data; pHapus = null;
}
public void hapusTertentu(String nim) { NodeDLL pHapus = pKepala;
NodeDLL pSblKini, pKini; pSblKini = null;
pKini = pKepala;
if (pKepala != null) {
while (pHapus != null) {
if (pHapus.next.data.getNim().equals(nim)) { pSblKini = pKini;
pHapus.next = pHapus.next.next; if (pHapus.next == null) { pHapus.next = pHapus; }
break;
} else if (pHapus.data.getNim().equals(nim) && pHapus == pKepala) {
this.hapusDepan(); break;
}
pHapus = pHapus.next; }
} else {
System.out.println("data kosong"); size--;
} }
public void bubbleSort() { boolean done = false; while (!done) {
NodeDLL pBaru = pKepala; done = true;
while (pBaru != pEkor) {
if (pBaru.next.data.getIpk() < pBaru.data.getIpk()) {
tukar(pBaru.next, pBaru); done = false;
}
pBaru = pBaru.next; }
} }
private void tukar(NodeDLL node1, NodeDLL node2) { Mahasiswa temp = node1.data;
node1.data = node2.data; node2.data = temp;
}
public void sisipDataTerurut(Mahasiswa data) { NodeDLL baru = new NodeDLL();
baru.data = data; if (pKepala == null) { baru.prev = pKepala; baru.next = pEkor; pKepala = baru; pEkor = baru; } else {
119 120 121 122 123 124
pKepala.prev = baru; pKepala = baru; } bubbleSort(); } } MainDLL.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 package asdpraktikum; import java.util.Scanner; public class MainDLL {
public static void main(String[] args) {
DLL_Mahasiswa data1 = new DLL_Mahasiswa(); DLL_Mahasiswa data2 = new DLL_Mahasiswa(); Scanner in = new Scanner(System.in);
while (true) {
System.out.println("== DOUBLE LINKED LIST MAHASISWA==");
System.out.println("================================="); System.out.println("1. Mengisi Data Diawal "); System.out.println("2. Mengisi Data Diakhir "); System.out.println("3. Menghapus Data Depan "); System.out.println("4. Menghapus Data Tertentu "); System.out.println("5. Tampil Data "); System.out.println("6. Mengisi Data Urut "); System.out.println("7. Tampilkan Data Urut "); System.out.println("8. Exit "); System.out.println("================================"); System.out.print("Masukkan pilihan : ");
int pilih = in.nextInt(); System.out.println(""); if (pilih == 1) {
System.out.println("\t Mengisi Data Mahasiswa \t");
System.out.print("Masukkan NAMA : "); String nama = in.next();
System.out.print("Masukkan NIM : "); String nim = in.next();
System.out.print("Masukkan IPK : "); double ipk = in.nextDouble();
Mahasiswa mahasiswa1 = new Mahasiswa(nama, nim, ipk);
data1.sisipDipKepala(mahasiswa1); }else if (pilih==2){
System.out.println("\t Mengisi Data Mahasiswa \t");
System.out.print("Masukkan NAMA : "); String nama = in.next();
System.out.print("Masukkan NIM : "); String nim = in.next();
System.out.print("Masukkan IPK : "); double ipk = in.nextDouble();
Mahasiswa mahasiswa3 = new Mahasiswa(nama, nim, ipk);
data1.sisipDipEkor(mahasiswa3); }
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
data1.cetak("\t Hapus Data Depan \t \n \tTampilan Setelah Hapus Data Depan\t");
} else if (pilih == 4) {
System.out.println("\t Hapus Data Tertentu Berdasarkan Nim \t");
System.out.print("Masukkan NIM : "); String nim = in.next();
data1.hapusTertentu(nim); }else if (pilih==5){
data1.cetak("\t Tampil Data Mahasiswa \t"); }
else if (pilih == 6) {
System.out.println("\t Mengisi Data Urut Mahasiswa \t");
System.out.print("Masukkan NAMA : "); String nama = in.next();
System.out.print("Masukkan NIM : "); String nim = in.next();
System.out.print("Masukkan IPK : "); double ipk = in.nextDouble();
Mahasiswa mahasiswa2 = new Mahasiswa(nama, nim, ipk);
data2.sisipDataTerurut(mahasiswa2); }else if (pilih ==7){
data2.cetak("\t Tampilkan Data Urut Berdasarkan IPK \t");
}
else if (pilih == 8) {
System.out.println("\t THANKS YOU \t"); System.exit(0);
}
System.out.println("");
System.out.println("Apakah anda ingin keluar ? "); System.out.println("1. Keluar");
System.out.println("2. Tidak"); System.out.print("=> ");
int keluar = in.nextInt(); if (keluar == 1){
System.out.println("\t Terima Kasih \t"); System.exit(0); } } } }
C.
PEMBAHASAN
Mahasiswa.java
1
2
3
4
5
6
7
8
9
10
Package dengan nama asdpraktikum
Deklarasi class dengan nama Mahasiswa
Deklarasi Variable nim dengan type data String dan hak akses private
Deklarasi Variable nama dengan type data String dan hak akses private
Deklarasi Variable ipk dengan type data double dan hak akses private
Konstuktor Mahasiswa
Tutup kurung konstruktor
11
12
13
14
15
16
17
18
19
20
21
22
Inisialisasi ipk - ipk, operasi memasukkan nilai variabel ipk ke ipk
Tutup kurung konstruktor
Deklarasi method getNim dengan type data String untuk mendapatkan value balikan
dari user
Mengembalikan value nim
Tutup kurung kurawal method getNim
Deklarasi Method getNama dengan type data String untuk mendapatkan value balikan
dari user
Mengembalikan value nama
Tutup kurung kurawal method getNim
Deklarasi Method getIpk dengan type data double untuk mendapatkan value balikan
dari user
Mengembalikan value ipk
Tutup kurung kurawal method getNim
Tutup kurung kurawal class Mahasiswa
NodeDLL.java
1
2
3
4
5
Package dengan nama asdpraktikum
Deklarasi class dengan nama NodeDLL
Deklarasi Variable data dengan type data Mahasiswa
Deklarasi Variable prev dan next dengan type data NodeDLL
Kurung kurawal penutup clas NodeDLL
DLL_Mahasiswa.java
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Package dengan nama asdpraktikum
Deklarasi class dengan nama DLL_Mahasiswa
Deklarasi Variable Pkepala dan Pekor dengan type data NodeDLL dan hak akses
private
Deklarasi Variable size dengan type data int
Konstruktor DLL_Mahasiswa
Inisialisasi pKepala sama dengan null
Inisialisasi pEkor sama dengan null
Kurung kurawal penutup konstruktor
Method getsize dengan type data int
Mengembalikan value size
Kurung kurawal penutup method getSize
Method sisipDipKepala dengan type data void dan berparameter Mahasiswa
mahasiswa
Instansiasi objek baru
Inisialisasi Baru dengan data yang lama sama dengan data yang baru
Pengondisian jika pKepala sama dengan null
Maka baru bagian depan menunjuk ke pKepala
Baru selanjutnya menunjuk ke pEkor
Pkepala sama dengan Baru
pEkor sama dengan Baru
Pengondisian jika bukan termasuk kondisi yang atas
Maka Baru selanjutnya sama dengan pKepala
pKepala.prev sama dengan baru
pKepala sama dengan Baru
Kurung kurawal penutup else
Kurung kurawal penutup method sisipDipKepala
Deklarasi method sisipDiEkor dengan type void dan berparameter Mahasiswa data
Instansiasi objek baru
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
46
47
49
50
52
53
54
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
85
86
87
88
Pengondisian jika pKepala sama dengan null
Maka baru bagian depan menunjuk ke pKepala
Baru selanjutnya menunjuk ke pEkor
Pkepala sama dengan Baru
pEkor sama dengan Baru
Pengondisian jika bukan termasuk kondisi yang atas
Maka baru.prev sama dengan pEkor
pEkor.next sama dengan baru
pEkor sama dengan baru
kurung kurawal penutup else
kurung kurawal penutup method sisipDipEkor
Deklarasi Method cetak dengan type void dan berparameter String komentar
Mencetak isi komentar
Inisialisasi kom sama dengan pKepala
Perintah mencetak”===========================”
Perintah mencetak NAMA, NIM, IPK
Perintah mencetak”===========================”
Perulangan kom jika tidak sama dengan null
Perintah Mencetak NAMA, NIM, IPK dan menampilkan isinya
Kom sama dengan kom.next yang menunjuk ke komentar selanjutnya
Kurung kurawal penutup while
Perintah mencetak”===========================”
Kurung kurawal penutup method cetak
Deklarasi method hapusDepan dengan type void
Deklarasi Variable dtHapus dengan type Mahasiswa
Inisialisasi pHapus sama dengan pKepala
Inisialisasi pKepala sama dengan pKepala.next
Inisialisasi dtHapus sama dengan pKepala.data
Inisialisasi pHapus sama dengan null
Kurung kurawal penutup method hapus depan
Deklarasi Method hapusTertentu dengan parameter String nim
Inisialisasi pHapus sama dengan pKepala
Variable pSblKini, pKini dengan type NodeDLL
Inisialisasi pSblKini sama dengan null
Inisialisasi pKini sama dengan pKepala
Pengondisian jika pKepala tidak sama dengan null
Perulangan pHapus tidak sama dengan null
Pengondisian pHapus.next.data.getNim().equeals(nim)
Maka pSblKini sama dengan pKini
Maka pHapus.next sama dengan pHapus.next.next
Pengondisian jika pHapus.next sama dengan null
Maka pHapus.next sama dengan pHapus
Kurung tutup End if
Deklarasi break berarti Perulangan berhenti
Pengondisian lain jika pHapus.data.getNim().equals(nim) && pHapus = = pKepala
Maka hapusDepan
Perulangan selesai
Tutup kurung kurawal End if
pHapus sama dengan pHapus.next
kurung kurawal penutup perintah while
Pengondisian lain jika tidak memenuhi kondisi sebelumnya
Maka akan mencetak “data kosong”
Size berkurang
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
Kurung kurawal penutup method hapusTertentu
Deklarasi Method bubbleSort dengan type void
Inisialisasi done dengan type Boolean sama dengan false
Perulangan tidak done
Inisialisasi pBaru sama dengan pKepala
Inisialisasi done sama dengan true
Perulangan pBaru tidak sama dengan pEkor
Pengondisian jika pBaru.next.data.getIpk() <pBaru.data.getIpk()
Memanggil method tukar dengan mengisi pBaru.next, pBaru
Done sama dengan false
Kurung kurawal penutup if
pBaru sama dengan pBaru.next
kurung kurawal penutup while
kurung kurawal penutup while
kurung kurawal penutup method bublesort
Deklarasi method tukar dengan type void dan hak akses private berparameter
NodeDLL node1, NodeDLL node2
Inisialisasi variable temp sama dengan node1.data
Inisialisasi node1.data sama dengan node2.data
Inisialisais node2.data sama dengan temp
Kurung kurawal penutup method tukar
Method sisipDataTerurut dengan parameter Mahasiswa data
Instansiasi objek baru
Inisialisasi baru.data = data
Pengondisian jika pKepala sama dengan null
Maka Pbaru bagian depan menunjuk ke pKepala
pBaru selanjutnya menunjuk ke pEkor
Pkepala sama dengan Baru
pEkor sama dengan Baru
Pengondisian jika bukan termasuk kondisi yang atas
Maka Baru selanjutnya sama dengan pKepala
pKepala.prev sama dengan baru
pKepala sama dengan Baru
kurng kurawal penutup else
perintah Memanggil method bubbleSort
kurung kurawal penutup method sisipDataTerurut
Kurung kurawal penutup class DLL_Mahasiswa
MainDLL.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Package dengan nama asdpraktikum
Scanner Digunakan untuk bisa memasukkan data dari user
Deklarasi class main dengan nama MainDLL
Method Main yang berguna untuk menjalankan program
Instansiasi data1 dari class DLL_Mahasiswa
Instansiasi data2 dari class DLL_Mahasiswa
Digunakan untuk memasukkan data dari user sebagai data inputan
Perulangan untuk mengulangi data sebanyak yang diinginkan user
Perintah Mencetak DOUBLE LINKED LIST MAHASISWA
Proses mencetak “==============================”
Proses mencetak ("1. Mengisi Data Diawal ");
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
44
45
46
47
48
49
50
51
52
53
55
56
57
58
59
60
61
62
63
64
65
66
68
69
70
72
73
Proses mencetak ("6. Mengisi Data Urut ");
Proses mencetak ("7. Tampilkan Data Urut ");
Proses mencetak ("8. Exit ");
Proses mencetak “==============================”
Proses mencetak pilihan
Perintah untuk menginputkan pilihan dari user yang disimpan pada variable pilih
Cetak kosong memberi efek enter
Pengondisian jika pilih sama dengan 1
Proses mencetak Mengisi Data Mahasiswa
Proses mencetak Masukkan NAMA
User input bertipe String yang akan disimpan pada variabel nama
Proses mencetak Masukkan NIM
User input bertipe String yang akan disimpan pada variabel nim
Proses mencetak masukkan IPK
User input bertipe double yang akan disimpan pada variabel ipk
Instansiasi dengan object mahasiswa1 yang berparameter nama, nim, ipk
Memanggil sisipDipKepala dengan data1 yang berparameter mahasiswa1
Pengondisian jika pilih sama dengan 2
Proses mencetak Mengisi Data Mahasiswa
Proses mencetak Masukkan NAMA
User input bertipe String yang akan disimpan pada variabel nama
Proses mencetak Masukkan NIM
User input bertipe String yang akan disimpan pada variabel nim
Proses mencetak masukkan IPK
User input bertipe double yang akan disimpan pada variabel ipk
Instansiasi dengan object mahasiswa3 yang berparameter nama, nim, ipk
Memanggil sisipDiekor dengan data1 yang berparameter mahasiswa3
Pengondisian jika pilih sama dengan 3
Memanggil method hapus depan dari data1
Proses mencetak “tampilan data setalah di hapus depan”
Pengondisian jika pilih sama dengan 4
Mencetak kalimat “hapus data berdasarkan nim”
Mencetak “masukkan NIM”
Menginputkan nim dari user
Memanggil method hapus tertentu dari data 1 berdasarkan nim yang sesuai
Pengondisian jika pilih sama dengan 5
Memanggil method cetak untuk mencetak data1
Pengondisian jika pilih sama dengan 6
Mencetak kalimat “mengisi data urut mahasiswa”
Proses mencetak Masukkan NAMA
User input bertipe String yang akan disimpan pada variabel nama
Proses mencetak Masukkan NIM
User input bertipe String yang akan disimpan pada variabel nim
Proses mencetak Masukkan IPK
User input bertipe double yang akan disimpan pada variabel ipk
Instansiasi dengan object mahasiswa2 yang berparameter nama, nim, ipk
Memanggil sisipDataTerurut dengan data2 yang berparameter mahasiswa2
Pengondisian jika pilih sama dengan 7
Memanggil method cetak dari data2 yang telah urut datanya
Pengondisian jika pilih sama dengan 8
Maka akan mencetak kalimat THANKS YOU
Program berhenti atau selesai menjalankannya
Memberi efek enter
74
75
76
77
78
79
80
81
82
83
84
Mencetak kalimat “1. Keluar”
Mencetak kalimat “2. Tidak”
Mencetak tanda “=>”
Menginputkan data pilihan sesuai keinginan user yang akan di variable keluar
Pengondisian jika user memilih keluar
Mencetak kalimat terima kasih
Program berhenti atau selesai menjalankannya
Kurung kurawal penutup if(keluar==1)
Kurung kurawal penutup while(true)
Kurung kurawal penutup method main
Kurung kurawal penutup clas MainDLL
E.
KESIMPULAN
-
Pengertian DLL ( Double Linked List)
Adalah elemen-elemen yang dihubungkan dengan dua pointer dalam
elemen dan list dapat melintas baik didepan atau belakang. Double linked list
memliki kemampuan untuk membaca data dengan cara maju atau mundur.
Elemen double link list terdiri dari tiga bagian :
-
Bagian data informasi
-
Perbedaan Single Lingked List dengan Double Linked List
SLL
DLL
-
Dalam satu node hanya terdapat
satu pointer yaitu next yang
menunjukkan ke node selanjutnya
-
Pada saat pembacaan elemen
sebelumnya
diperlukan,
maka
membutuhkan pembacaan ulang
dari elemen paling awal
-
Kurang efisisen
-
Dalam satu node terdapat 2 pointer
yaitu prev yang menunjukkan ke
node
sebelumnya
dan
next
menunjukkan ke node selanjutnya
-
Tidak memerlukan pembacaan
dari awal karena memilik dua
pointer
-
Lebih efisien
-
Implementasi Double Linked List
Contoh :
Class berikut merupakan class untuk mengimplementasikan sebuah elemen dari
DLL.
Public class Node { int data;
Node next; Node prev; }
Class berikut merupakan implementasi dari Double Linked List. Class ini
memenfaatkan class Node yang telah diimplementasikan di atas :
public class DoubleLinkedList { private NodeDLL pKepala, pEkor; int size;
public DoubleLinkedList() { pKepala = null;
pEkor = null; }
public void sisipDipKepala(int dt) { NodeDLL baru = new NodeDLL(); baru.data = dt;
if (pKepala == null) { baru.prev = pKepala; baru.next = pEkor; pKepala = baru; pEkor = baru; } else {
baru.next = pKepala; pKepala.prev = baru; pKepala = baru;
}
}public void sisipDipEkor(int data) { NodeDLL baru = new NodeDLL(); baru.data = data;
} else {
baru.prev = pEkor; pEkor.next = baru; pEkor = baru;
}
}public void cetak(String kom) { System.out.println(kom); NodeDLL pCetak = pKepala; while (pCetak != null) {
System.out.print(pCetak.data + "->"); pCetak = pCetak.next;
}
System.out.println(); }