Anda di halaman 1dari 11

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER


UNIVERSITAS BRAWIJAYA

BAB : ADT CIRCULAR LINKED LIST


NAMA : REYHAN NIZAR RAMADHAN
NIM : 185150600111013
TANGGAL : 25/09/2019
ASISTEN : M NAUFAL ANDIKA N P

LATIHAN 1
A. Soal
1. Buatlah projek di IDE Java dengan nama CircularSingleLinkedList.
2. Buatlah Class CircularSingleLinkedList di projek yang telah dibuat, dan
tambahkan kelas Node seperti kode di bawah ini sesuai dengan ADT Class
NodeCSLL.
3. Tambahkan beberapa prosedur sesuai dengan ADT Class CircularLinkedList
dan implementasikan sesuai dengan kode di bawah ini.
4. Lakukan kompilasi dan tuliskan hasil percobaan, analisis hasil, dan
kesimpulannya.

B. Screenshot

C. Syntax

CircularSingleLinkedList.java
1 class NodeCSLL {
2 Object data;
3 NodeCSLL setelah;
4 public NodeCSLL() {
5 data = null;
6 setelah = null;
7 }
8 public NodeCSLL(Object data, NodeCSLL setelah) {
9 this.data = data;
this.setelah = setelah;
10 }
11 public Object getData() {
12 return data;
13 }
14 public void setData(Object data) {
15 this.data = data;
16 }
17 public NodeCSLL getSetelah() {
18 return setelah;
19 }
20 public void setSetelah(NodeCSLL setelah) {
21 this.setelah = setelah;
22 }
23 }
24
25 public class CircularSingleLinkedList {
26 private NodeCSLL pAwal, pAkhir;
private int jumlah;
27 public CircularSingleLinkedList() {
28 pAwal = null;
29 pAkhir = null;
30 jumlah = -1;
31 }
32 public void SisipDataDiAwal(Object data) {
33 NodeCSLL pBaru = new NodeCSLL();
34 pBaru.data = data;
35 pBaru.setelah = pBaru;
36 if (pAwal == null) {
37 pAwal = pBaru;
38 pAkhir = pBaru;
39 jumlah = 0;
40 } else {
41 pBaru.setelah = pAwal;
42 pAkhir.setelah = pBaru;
43 pAwal = pBaru;
44 jumlah++;
45 }
}
46 public void SisipDataDiAkhir(Object data) {
47 // lengkapi bagian
48 NodeCSLL nptr = new NodeCSLL(data, null);
49 nptr.setSetelah(pAwal);
50 if (pAwal == null) {
51 pAwal = nptr;
52 nptr.setSetelah(pAwal);
53 pAkhir = pAwal;
54 } else {
55 pAkhir.setSetelah(nptr);
56 pAkhir = nptr;
57 }
58 jumlah++;
59 }
60 public void hapusData(Object dtHapus) {
61 if (pAwal != null) {
62 NodeCSLL pSbl, pKini, pHapus;
63 pSbl = null;
64 pKini = pAwal;
65 boolean ketemu = false;
66 int i = 0;
67 while (!ketemu && (i <= jumlah)) {
68 if (pKini.data.equals(dtHapus)) {
69 ketemu = true;
70 } else {
71 pSbl = pKini;
72 pKini = pKini.setelah;
73 }
74 i++;
75 }
76 if (ketemu) {
77 if (pSbl == null) {
78 pHapus = pAwal;
79 pAwal = pKini.setelah;
80 pAkhir.setelah = pAwal;
81 pHapus = null;
82 } else {
83 if (pAkhir == pKini) {
84 pAkhir = pSbl;
85 }
86 pSbl.setelah = pKini.setelah;
87 pHapus = pKini;
88 pHapus = null;
89 }
90 this.jumlah--;
91 }
92 }
93 }
94
95 public Object hapusSatuDataDiAwal() {
96 // lengkapi bagian ini
97 int i = 0;
98 NodeCSLL pKini = pAwal;
99 while ((i < jumlah) && (i != -1)) {
100 pKini = pKini.setelah;
101 i--;
102 }
103 NodeCSLL pHapus = pAwal;
104 NodeCSLL temp = pHapus.setelah;
105 pAwal = pKini;
106 this.jumlah--;
107 return temp;
108 }
109
110 public Object hapusSatuDataDiAkhir() {
111 int i = 0;
112 NodeCSLL pKini = pAwal;
113 while ((i < jumlah) && (i != -1)) {
114 pKini = pKini.setelah;
115 i++;
116 }
117 NodeCSLL pHapus = pAkhir;
118 NodeCSLL temp = pHapus.setelah;
119 pAkhir = pKini;
120 this.jumlah--;
121 return temp;
122 }
123
124 public void cetak(String Komentar) {
125 System.out.println(Komentar);
126 NodeCSLL pCetak;
127 pCetak = pAwal;
128 int i = -1;
129 while ((i < jumlah)) {
130 System.out.print(pCetak.data + "->");
131 pCetak = pCetak.setelah;
132 i++;
133 }
134 System.out.println();
135 }
136
137 public static void main(String[] args) {
138 CircularSingleLinkedList csll = new
139 CircularSingleLinkedList();
140 csll.SisipDataDiAwal(new Integer(50));
141 csll.SisipDataDiAwal(new Integer(60));
142 csll.SisipDataDiAwal(new Integer(70));
143 csll.SisipDataDiAwal(new Integer(8));
144 csll.SisipDataDiAwal(new Integer(9));
145 csll.SisipDataDiAwal(new Integer(90));
146 csll.SisipDataDiAwal(new Integer(19));
147 csll.SisipDataDiAkhir(new Integer(10));
148 csll.cetak("csll Asal");
149 csll.hapusData(8);
150 csll.cetak("csll stl 8 dihapus");
151 csll.hapusData(90);
152 csll.cetak("csll stl 90 dihapus");
153 csll.hapusSatuDataDiAkhir();
154 csll.cetak("csll stl 10 akhir dihapus");
155 csll.hapusSatuDataDiAwal();
156 csll.cetak("csll stl 19 awal hapus");
157 }
158 }
D. Penjelasan
Syntax di atas merupakan kode program yang mengimplementasikan Circular
Single Linked List. Di dalam sysnrax tersebut mendeklarasikan antara dua kelas,
yakni NodeCSLL dan CircularSingleLinkedList yang di dalamnya terdapat method
untuk menyisipkan data di awal dan menghapus data di akhir, serta method untuk
mencetak hasil.

Kita pada main method, kita menginstansiasi sebuah objek bernama scll dari
class CisrcularSingleLinkedList yang selanjutnya digunakan untuk memanggil
method SisipDataDiAwal sekaligus memberikan nilai pada parameternya berupa
data yang bertipe integer. Ketika method SisipDataDiAwal dipanggil, maka syntax
di dalam method tersebut akan dijalankan. Mulai dari membuat objek node, dimana
data dari objek tersebut diinisialisasi dari data pada parameter method. Lalu Node
baru (pBaru) tersebut akan dijadikan sebagai pAwal atau head. Sehingga ketika
dicetak maka program akan menampilkan data terurut mulai dari data yang terakhir
ditambahkan hingga ke data yang pertama kali ditambahkan, karena method
SisipDataDiAwal akan menambahkan data yang terakhir dimasukkan ke data
paling awal.

Selanjutnya apabila kita memanggil method hapusData dan di dalam parameter


tersebut dimasukkan data yang ingin di hapus, maka ketika dicetak, program akan
menampilkan data yang telah diinputkan, namun data yang telah dimasukkan di
parameter method hapusData tidak akan ditampilkan, sebab data dari pKini yang
berisi data berdasarkan parameter method hapusData akan diinisialisasikan ke
dalam pHapus, dan pHapus akan dijadikan null.

Begitu pula apabila kita memanggil method hapusStuDatadiAwal, maka data


yang telah kita sisipkan di awal menggunakan method SisipDataDiAwal tadi akan
dihapus data yang berada di paling awal atau yang terakhir disisipkan, dan
sebaliknya, apabila dipanggil method hapusSatuDataDiAkhir, maka data yang
berada di paling terakhir atau yang pertama kali ditambahkan dengan method
SisipDatDiAwal akan di hapus.

LATIHAN 2
A. Soal
1. Buatlah projek di IDE Java dengan nama CircularDoubleLinkedList.
2. Buatlah Class CircularDoubleLinkedList di projek yang telah dibuat, dan
tambahkan kelas Node seperti kode di bawah ini sesuai dengan ADT Class
NodeCDLL.
3. Tambahkan beberapa prosedur sesuai dengan ADT Class CircularDLinkedList
dan implementasikan sesuai dengan kode di bawah ini.
4. Lakukan kompilasi dan tuliskan hasil percobaan, analisis hasil, dan
kesimpulannya.
B. Screenshot

C. Syntax

CircularDoubleLinkedList.java
1 package bab6;
2
3 class NodeCDLL {
4
5 Object data;
6 NodeCDLL sebelum;
7 NodeCDLL setelah;
8
9 public NodeCDLL() {
10 setelah = null;
11 sebelum = null;
12 data = 0;
13 }
14
15 public Object getData() {
16 return data;
17 }
18
19 public void setData(Object data) {
20 this.data = data;
21 }
22
23 public NodeCDLL getSebelum() {
24 return sebelum;
25 }
26
27 public void setSebelum(NodeCDLL sebelum) {
28 this.sebelum = sebelum;
29 }
30
31 public NodeCDLL getSetelah() {
32 return setelah;
33 }
34
35 public void setSetelah(NodeCDLL setelah) {
36 this.setelah = setelah;
37 }
38
39 }
40
41 public class CircularDoubleLinkedList {
42
43 private NodeCDLL pAwal, pAkhir;
44 private int jumlah;
45
46 public CircularDoubleLinkedList() {
47 pAwal = null;
48 pAkhir = null;
49 jumlah = -1;
50 }
51
52 public void SisipDataDiAwal(Object data) {
53 NodeCDLL pBaru = new NodeCDLL();
54 pBaru.data = data;
55 pBaru.setelah = null;
56 pBaru.sebelum = null;
57 if (pAwal == null) {
58 pAwal = pBaru;
59 pAkhir = pBaru;
60 pAwal.setelah = pAwal;
61 pAwal.sebelum = pAwal;
62 pAkhir.setelah = pAkhir;
63 pAkhir.sebelum = pAkhir;
64 jumlah = 0;
65 } else {
66 pBaru.setelah = pAwal;
67 pAwal.sebelum = pBaru;
68 pAwal = pBaru;
69 pAwal.sebelum = pAkhir;
70 pAkhir.setelah = pAwal;
71 jumlah++;
72 }
73 }
74
75 public void hapusData(Object dtHapus) {
76 // lengkapi bagian ini
77 if (pAwal != null) {
78 NodeCDLL pSbl, pKini, pHapus;
79 pSbl = null;
80 pKini = pAwal;
81 boolean ketemu = false;
82 int i = 0;
83 while (!ketemu && (i <= jumlah)) {
84 if (pKini.data.equals(dtHapus)) {
85 ketemu = true;
86 } else {
87 pSbl = pKini;
88 pKini = pKini.setelah;
89 }
90 i++;
91 }
92 if (ketemu) {
93 if (pSbl == null) {
94 pHapus = pAwal;
95 pAwal = pKini.setelah;
96 pAkhir.setelah = pAwal;
97 pHapus = null;
98 } else {
99 if (pAkhir == pKini) {
100 pAkhir = pSbl;
101 }
102 pSbl.setelah = pKini.setelah;
103 pHapus = pKini;
104 pHapus = null;
105 }
106 this.jumlah--;
107 }
108 }
109 }
110
111 public void SisipDataDiAkhir(Object data) {
112 // lengkapi bagian ini
113 NodeCDLL pBaru = new NodeCDLL();
114 if (pAwal == null) {
115 pBaru.setSetelah(pBaru);
116 pBaru.setSebelum(pBaru);
117 pAwal = pBaru;
118 pAkhir = pAwal;
119 } else {
120 pBaru.setSebelum(pAkhir);
121 pAkhir.setSetelah(pBaru);
122 pAwal.setSebelum(pBaru);
123 pBaru.setSetelah(pAwal);
124 pAkhir = pBaru;
125 }
126 jumlah++;
127
128 }
129
130 public void cetak(String Komentar) {
131 System.out.println(Komentar);
132 NodeCDLL pCetak;
133 pCetak = pAwal;
134 int i = -1;
135 while ((i < jumlah)) {
136 System.out.print(pCetak.data + "->");
137 pCetak = pCetak.setelah;
138 i++;
139 }
140 System.out.println();
141 }
142
143 public static void main(String[] args) {
144 CircularDoubleLinkedList cdll = new
145 CircularDoubleLinkedList();
146 cdll.SisipDataDiAwal(new Integer(50));
147 cdll.SisipDataDiAwal(new Integer(60));
148 cdll.SisipDataDiAwal(new Integer(70));
149 cdll.SisipDataDiAwal(new Integer(8));
150 cdll.SisipDataDiAwal(new Integer(9));
151 cdll.SisipDataDiAwal(new Integer(90));
152 cdll.SisipDataDiAwal(new Integer(19));
153 cdll.cetak("cdll Asal");
154 cdll.hapusData(19);
155 cdll.cetak("cdll stl 8 DiHapus");
156 cdll.SisipDataDiAkhir(new Integer(0));
157 cdll.cetak("cdll stl Tambah 0 DiAkhir");
158 }
159 }

D. Penjelasan
Program di atas merupakan implementasi dari Circular Double Linked List
yang mana di dalamnya terdapat dua kelas, yaitu class NodeCDLL dan class
CircularDoubleLinkedList. Yang membedakan circular double linked list dengan
circular single linked list adalah pada circular double linked list akan
dideklarasikan variabel setelah dan sebelum bertipe NodeCDLL, karena pada
Circular Double Linked List mempunyai dua pointer, yaitu pointer yang
mengarah ke node setelahnya dan ke node sebelumnya.
Di dalam class CircularDoubleLinkedList terdapat method SisipData- DiAwal,
SisipDataDiAkhir, hapusData, dan cetak. Kemudian pada main method
diinstansiasi objek cdll dari class CircularDoubleLinkedList yang mana ketika
dipanggil method SisipDataDiAwal dan dimasukkan data integer ke dalam
parameternya, maka ketika dicetak, program akan menampilkan data mulai dari
yang terakhir disisipkan hingga yang pertamakali disisipkan. Hal ini karena
method SisipDataDiAwal akan menjalankan syntax di dalamnya yang
menyisipkan data baru menjadi pAwal.
Lalu, apabila dipanggil method hapusData yang di dalam parameternya berisi
data integer dari data yang telah disisipkan sebelumnya, maka ketika dicetak
program akan menampilkan data yang telah ditambahkan tanpa data yang
dihapus. Hal ini karena pada syntax di method hapusData, akan mengubah node
sebelum dari node setelah data yang akan di hapus menjadi node sebelum data
yang akan di hapus, di mana pada awalnya node sebelum dari node setelah data
yang akan di hapus adalah node yang akan dihapus itu sendiri.

Kesimpulan
CSLL atau Circular Single Linked List merupakan Linked List yang
mempunyai dua field setiap node-nya, yaitu field pointer yang menunjuk ke node
setelahnya dan sebuah field yang berisi data untuk node tersebut. Circular Single
Linked List hanya memiliki satu buah pointer dan arahnya hanya ke node
setelahnya. Ketika node baru terbentuk, pointer- nya menunjuk ke dirinya sendiri.
Jika sudah lebih dari satu node, maka pointer-nya menunjuk ke node setelahnya
dan pointer node akhir menuju ke node awal. Perbedaan antara Single Linked List
dengan Circular Single Linked List adalah pada Circular Linked List pointer node
terakhirnya mengarah ke node awal, sementara pada Singly Linked List pointer
node terakhirnya menunjuk ke null.
CDLL atau Circular Double Linked List juga merupakan linked list yang
mempunyai dua field setiap node-nya, yaitu field pointer yang menunjuk ke node
setelahnya dan sebuah field yang berisi data untuk node tersebut. Circular Double
Linked List mempunyai dua pointer, yaitu pointer yang mengarah ke node
setelahnya dan ke node sebelumnya. Pada pembentukan node baru, kedua pointer
mengarah ke dirinya sendiri. Jika sudah lebih dari satu node, maka pointer pada
node baru akan mengarah ke node setelahnya dan node sebelumnya. Pada node
akhir pointer setelahnya mengarah ke node awal, dan pada node awal pointer
sebelumnya mengarah ke node akhir. Perbedaan CDLL deng Double Linked List
adalah pada Doubly Linked List memiliki dua variabel pointer yaitu pointer yang
menunjuk ke node selanjutnya dan pointer yang menunjuk ke node sebelumnya.
Setiap head dan tailnya juga menunjuk ke NULL, sementara CDLL pada tail
setelahnya mengarah ke head, dan pada head sebelumnya mengarah ke tail.
Implementasi dari CLL misalnya untuk membuat program yang mana
datanya akan berputar. Misalnya jika kita menambahkan data 1,2, dan 3, maka
setelah data terakhir ditambahkan, program akan menampilkan kembali data
pertama. Contoh dari implementasi CLL adalah sebagai berikut:

CircularLinkedList.java
1 class Node{
2 int data;
3 Node
4 next;
5 }
6 public class CLL
7 { private int
8 jumlah;
9 private Node pAwal,
10 pAkhir; public CLL(){
11 pAwal = null;
12 pAkhir =
13 null; jumlah
14 = -1;
15 }
16 public void add(int data)
17 { Node pBaru = new
18 Node(); pBaru.data =
19 data; pBaru.next=
20 pBaru;
21 if (pAwal == null)
22 { pAwal =
23 pBaru; pAkhir
24 = pBaru;
25 jumlah = 0;
26 }
27 else{
28 pBaru.next= pAwal;
29 pAkhir.next =
30 pBaru; pAwal =
31 pBaru; jumlah++;
32 }
33 }
34 public void cetak(String Komentar)
35 { System.out.println(Komentar);
36 Node pCetak;
37

Output :

Anda mungkin juga menyukai