Sunteți pe pagina 1din 8

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER


UNIVERSITAS BRAWIJAYA

BAB : ADT DOUBLE LINKED LIST


NAMA : PHILLIP TOTHALOVE CHRISYUONO
NIM : 185150200111003
TANGGAL : 16/09/2019
ASISTEN : PANDU DEWABRATA

A. DEFINISI MASALAH

Modifikasilah program di atas dengan mengganti tipe item data pada NodeDLL dengan
Object. Kemudian gunakan class Buku yang pernah dibuat pada praktikum bab 4 untuk
diisikan pada DLL. Gunakan pemasukan data secara interaktif.

B. SOURCE CODE

DoubleLinkedList.java
1 package BAB5;
2 class NodeDLL{
3 Buku data;
4 NodeDLL prev, next;
5 }
6 public class DoubleLinkedList {
7 private NodeDLL head, tail;
8 public DoubleLinkedList() {
9 head = null;
10 tail = null;
11 }
12 public void sisipDihead(Object dt) {
13 NodeDLL baru = new NodeDLL();
14 baru.data = (Buku) dt;
15 if (head == null) {
16 baru.prev = null;
17 baru.next = null;
18 head = baru;
19 tail = baru;
20 } else {
21 baru.next = head;
22 head.prev = baru;
23 head = baru;
24 }
25 }
26 public void sisipDitail(Object data) {
27 NodeDLL baru = new NodeDLL();
28 baru.data = (Buku) data;
29 if (tail == null) {
30 baru.prev = null;
31 baru.next = null;
32 head = baru;
33 tail = baru;
34 } else {
35 baru.prev = tail;
36 tail.next = baru;
37 tail = baru;
38 }
39 }
40 public void cetakHead(){
41 System.out.println(head.data.judul);
42 }
43 public void hapusDataDiHead(){
44 head=head.next;
45 head.prev=null;
46 }
47 public void hapusDataTertentu(Object dataHapus) {
48 NodeDLL p = head;
49 while (p != null) {
50 if (p.data == dataHapus) {
51 p.prev.next = p.next;
52 p.next.prev = p.prev;
53 }
54 p = p.next;
55 }
56 }
57 public void hapusDataDiTail(){
58 tail=tail.prev;
59 }
60 public void sisipDataTerurut(Buku data) {
61 NodeDLL i = head;
62 if (i == null) {
63 sisipDihead(data);
64 } else if (i.next == null) {
65 NodeDLL baru = new NodeDLL();
66 baru.data = data;
67 if (i.data.hargaSewa < data.hargaSewa) {
68 baru.next = i.next;
69 i.next = baru;
70 baru.prev = i;
71 } else {
72 baru.next = i;
73 i.prev = baru;
74 head = baru;
75 }
76 } else {
77 int j = 0;
78 NodeDLL baru = new NodeDLL();
79 baru.data = data;
80 while ((i.next != null) && (i.data.hargaSewa <
data.hargaSewa)) {
81 if (i.next.data.hargaSewa >= data.hargaSewa) {
82 baru.next = i.next;
83 i.next = baru;
84 baru.prev = i;
85 baru.next.prev = baru;
86 i = i.next;
87 j++;
88 break;
89 }
90 i = i.next;
91 j++;
92 }
93 if (j == 0) {
94 baru.next = i;
95 head = baru;
96 }
97 if (i.next == null) {
98 sisipDitail(data);
99 }
100 }
101 }
102 public void print() {
103 NodeDLL p = head;
104 System.out.println("");
105 System.out.println("Judul\t\tKategori\t\tHarga Sewa");
106 while (p != null) {
107 System.out.println(((Buku) p.data).judul + "\t\t" +
((Buku) p.data).kategori + "\t\t\t" + ((Buku)
p.data).hargaSewa);
108 p = p.next;
109 }
110 System.out.println("");
111 }
112 }

Buku.java
1 package BAB5;
2 public class Buku {
3 String kategori, judul ;
4 int hargaSewa,hargaDenda;
5 public Buku(String kategori, String judul, int hargaSewa,
int hargaDenda) {
6 this.kategori = kategori;
7 this.judul = judul;
8 this.hargaSewa = hargaSewa;
9 this.hargaDenda = hargaDenda;
10 }
11 public String getKategori() {
12 return kategori;
13 }
14 public String getJudul() {
15 return judul;
16 }
17 public double getHargaSewa() {
18 return hargaSewa;
19 }
20 public double getHargaDenda() {
21 return hargaDenda;
22 }
23 }

mainBuku.java
1 package BAB5;
2 import java.util.Scanner;
3 public class mainBuku {
4 public static void main (String[]args){
5 DoubleLinkedList list = new DoubleLinkedList();
6 int pilihan = 10;
7 int denda = 100;
8 Scanner in = new Scanner(System.in);
9 while (pilihan != 0) {
10 System.out.println("----PERPUSTAKAAN UB----");
11 menu();
12 pilihan = in.nextInt();
13 System.out.println("-------------------------");
14 switch (pilihan) {
15 case 0:
16 pilihan = 0;
17 break;
18 case 1:
19 System.out.print("Judul\t\t : ");
20 in.nextLine();
21 String judul = in.nextLine();
22 System.out.print("Kategori\t : ");
23 String kategori = in.nextLine();
24 System.out.print("Harga Sewa\t : ");
25 int harga = in.nextInt();
26 list.sisipDataTerurut(new Buku(kategori,
judul, harga, denda));
27 break;
28 case 2:
29 list.print();
30 break;
31 case 3:
32 list.hapusDataDiHead();
33 System.out.println("Buku Di Depan Berhasil
Di Hapus");
34 break;
35 case 4:
36 list.hapusDataDiTail();
37 System.out.println("Buku Di Belakang
Berhasil Di Hapus");
38 break;
39 default:
40 System.out.println("Pilihan Anda Tidak Ada
Silahkan Memilih Lagi");
41 break;
42 }
43 }
44 }
45 public static void menu() {
46 System.out.println("0.Exit");
47 System.out.println("1.Tambah Buku");
48 System.out.println("2.Lihat Buku");
49 System.out.println("3.Hapus Buku Di Depan");
50 System.out.println("4.Hapus Buku Di Belakang");
51 System.out.print("Pilihan : ");
52 }
53 }

C. PEMBAHASAN

DoubleLinkedList.java
1 Deklarasi package dengan nama BAB5
2 Deklarasi class dengan nama NodeDLL
3 Deklarasi Variable data dengan tipe data Buku
4 Deklarasi Variable prev dan next dengan tipe data NodeDLL
6 Deklarasi class dengan nama DoubleLinkedList
7 Variable head dan tail dengan tipe data NodeDLL dan modifier private
8-11 Constructor DoubleLinkedList dengan parameter. Berguna untuk
menginisialisasi head dan tail null
12-25 Method sisipDihead dengan parameter Object berfungsi untuk menyisipkan
Node baru di head. Caranya membuat Node baru dulu di awal, kemudian isinya
diisi dari parameter kemudian dicasting, lalu dicek jika posisi Node head= null
maka akan membuat Node setelah node adalah null dan head=tail=baru. Jika
tidak maka setelah baru, pointer merujuk ke head dan sebelumnya merujuk ke
baru kemudian posisi head dipindahkan ke baru.
26-39 Method sisipDitail dengan parameter Object data berfungsi untuk membuat
Node baru setelah tail dengan cara membuat NodeDLL yang baru, kemudian
isi dari parameter dicasting ke tipe data Buku. Jika tail == nul maka pointer
prev baru akan merujuk ke null dan pointer next akan merujuk ke null, lalu
head dan tailnya merujuk ke baru. Jika tidak, maka pointer prev baru merujuk
ke tail dan pointer next tail merujuk ke baru.Kemudian posisi tail akan merujuk
ke baru
40-41 Method cetakHead digunakan untuk mengambil data dari node head
43-46 Method hapusDataDiHead digunakan untuk menghapus data di head dengan
cara memindahkan head ke head.next lalu menginisialisasi head.prev dengan
nilai null.
47-56 Method hapusDataTertentu dengan parameter Object dataHapus berfungsi
untuk menghapus suatu Node dengan cara membuat Node p sebagai iterator di
head.Kemudian dilooping sampai p!=null dan dicek apakah object parameter
yang dicari sudah sama dengan datanya,Jika iya maka pointer p.prev.next
mengarah ke p.next, p.next.prev merujuk ke p.prev lalu p di majukan posisinya
sampai dapat posisi p di Object yang dicari
57-59 Method hapusDataDiTail digunakan untuk menghapus data di tail dengan cara
memindahkan tail ke node sebelumnya
60-101 Method sisipDataTerurut dengan parameter Buku data berguna untuk
menyisipkan suatu Node yang langsung disusun. Caranya membuat Node I
sebagai iterator dan posisinya di head. Lalu dicek apakah posisi i itu memiliki
nilai null atau tidak, jika ya maka akan dipanggil method sisipdiHead dengan
argument data. Jika posisi i.next merujuk ke null maka akan dibuat Node baru
untuk tempat data nya kemudian isi datanya dipindahkan ke Node yang baru.
Lalu dicek apakah hargasewa pada pointer i < data.hargaSewa, jika iya maka
baru next merujuk ke i.next, i.next merujuk ke baru, dan baru.prev merujuk ke
i. Jika tidak maka baru.next merujuk ke i dan i.prev merujuk ke baru lalu posisi
head dipindahkan ke baru. Jika tidak ada yang memenuhi maka dibuat variable
j = 0, lalu dibuat Node baru yang isinya dari parameter Object. Kemudian loop
dan dicek jika i.next tidak null dan i.data.hargaSewa < data.hargaSewa maka
akan masuk ke kondisi looping, lalu dicek lagi jika i.next.data.hargaSewa >=
data.hargaSewa maka baru.next merujuk ke i.next, i.next merujuk ke baru,
baru.next.prev merujuk ke baru, i = i.next lalu increment j++ dan di break. Jika
suatu kondisi tidak masuk ke while maka akan tetap iterator berpindah dan
counter akan tambah. Jika j==0 maka baru.next merujuk ke i dan posisi head
dipindahkan ke baru. Jika i.next merujuk null maka akan dipanggil method
sisipDitail dengan parameter data.
102-111 Method print berfungsi untuk mencetak seluruh database yang sudah
ditambahkan sebelumnya. Dengan cara membuat Node p sebagai iterator
kemudian mencetak “Judul Kategori HargaSewa”. Kemudian masuk ke posisi
while p!=null maka akan mencetak Judul buku, kategori buku dan harga
sewanya.
Buku.java
1 Deklarasi package dengan nama BAB5
2 Deklarasi class dengan nama Buku
3 Deklarasi variabel kategori, judul dengan tipe data String
4 Deklarasi variabel hargaSewa, hargaDenda dengan tipe data integer
5 Deklarasi constructor Buku dengan parameter
11-13 Method getKategori() untuk mengambil nilai kategori tersebut
14-16 Method getJudul() untuk mengambil nilai Judul tersebut
17-19 Method getHargaSewa() untuk mengambil nilai hargaSewa tersebut
20-22 Method getHargaDenda() untuk mengambil nilai hargaDenda tersebut

mainBuku.java
1 Deklarasi package dengan nama BAB5
2 Melakukan import untuk fungsi Scanner
3 Deklarasi class dengan nama mainBuku
4 Deklarasi method main
5 Instansiasi Object List dari class DoubleLinkedList
6 Variabel pilihan dengan nilai awal 10 dan tipe data int
7 Variabel denda dengan nilai awal 100 dengan tipe data int
8 Instansiasi object in dari class Scanner
9 Melakukan perulangan jika pilihan !=0
10 Mencetak “----PERPUSTAKAAN UB----”
11 Memanggil method menu()
12 Inputan user akan disimpan kedalam variable pilihan
13 Mencetak “-------------------------------------------“
14 Melakukan fungsi switch dari variable pilihan
15 Perintah case 0
16 Variabel pilihan = 0
17 Perintah break
18 Perintah case 1
19 Mencetak “Judul : ”
20 Inputan user akan disimpan kedalam variable judul dengan tipe data String
21 Mencetak “Kategori : ”
22 Inputan user akan disimpan kedalam variable kategori dengan tipe data String
23 Mencetak “Harga Sewa : ”
24 Inputan user akan disimpan kedalam variable harga dengan tipe data integer
25 Object list memanggil method sisipDataTerurut dengan argumen membuat object
26 baru dari Buku dengan parameter constructor kategori, judul, harga dan denda
27 Perintah break
28 Perintah case 2
29 Object list memanggil method print()
30 Perintah break
31 Perintah case 3
32 Object list memanggil method hapusDataDiHead
33 Mencetak “Buku Di Depan Berhasil Di Hapus”
34 Perintah break
35 Perintah case 4
36 Object list memanggil method hapusDataDiTail
37 Mencetak “Buku Di Belakang Berhasil Di Hapus”
38 Perintah break
39 Jika case tidak terdapat pada pilihan (default)
40 Mencetak “Pilihan Anda Tidak Ada Silahkan Memilih Lagi”
41 Perintah break
45 Method menu dengan return type void
46 Mencetak”0.Exit”
47 Mencetak “1.Tambah Buku”
48 Mencetak “2.Lihat Buku”
49 Mencetak “3.Hapus Buku Di Depan”
50 Mencetak “4.Hapus Buku Di Belakang”
51 Mencetak “Pilihan : ”
53 Mengakhiri kelas mainBuku

D. SCREENSHOT PROGRAM
E. KESIMPULAN

Double linked list merupakan linked list yang menggunakan 2 buah variabel
sebagai pointer dan list yang dapat mengakses dari depan maupun belakang. Dua
pointer tersebut bisa dikatakan sebagai next dan prev, next menunjuk pada elemen
selanjutnya sedangkan prev menunjuk pada elemen sebelumnya. Pointer next pada tail
sebuah double linked list menunjuk pada null dan pointer prev pada head menunjuk
pada null.
Perbedaan antara single linked list dan double linked list adalah jumlah pointer dan
cara mengaksesnya. Single linked list hanya memiliki 1 pointer yang menunjuk ke node
berikutnya. Oleh karena itu, meskipun memiliki head dan tail, pengaksesan secara
sekuensial hanya dapat dilakukan dari head. Berbeda dengan double linked list, karena
memiliki 2 pointer, pengaksesan dapat dilakukan dari head ke node-node berikutnya
maupun dari tail ke node-node sebelumnya.
Dari sintaks di atas terdapat implementasi double linked list yang dapat dilihat
bahwa kita bisa menambahkan node baru dari depan maupun belakang serta dapat
menyisipkan suatu data dan mengurutkannya dari yang terkecil ke yang terbesar.

S-ar putea să vă placă și