Anda di halaman 1dari 8

MODUL 6

DOUBLE LINKEDLIST
(SENARAI BERANTAI GANDA)

Tujuan :
Mahasiswa dapat mengimplementasikan penggunaan Double Linked List

Teori :
Double Linked list atau disebut juga Senarai Berantai Ganda, hampir sama
dengan Single Linked List yang telah dibahas pada bab sebelumnya, yaitu adalah
pengalokasian memori secara dinamis yang digunakan untuk menyimpan data.
Bedanya Double Linked List lebih flexibel dibanding Single Linked List karena pada
Double Linked List semua simpul-simpulnya yang ada didalamnya memiliki 2 buah
penunjuk yang digunakan untuk mengkaitkan diri dengan simpul lain yang ada di
sebelah kanannya dan di sebelah kirinya.

Di dalam konsep Double Linked List ada 3 unsur pendukung yang penting, yaitu :
1. Penunjuk (biasa disebut pointer)
2. Simpul Ganda (biasa disebut node)
3. Senarai Berantai Ganda atau Double Linked List itu sendiri.

Penunjuk (pointer)
Penunjuk atau pointer yang dimaksud disini alat yang digunakan untuk menunjuk
sebuah simpul contoh:

awal

penunjuk

akhir

kanan

Penunjuk dapat menunjuk ke sebuah sebuah simpul, ataupun ke sebuah tempat


kosong (null).
Simpul (Node)

Simpul yang digunakan dalam bab ini adalah simpul ganda yang digambarkan sebagai
berikut :

kiri

(data)

kanan

Simpul yang demikian disebut simpul ganda karena simpul ini mempunyai dua buah
penunjuk, yaitu kiri dan kanan. Artinya simpul ini dapat menunjuk ke dua buah simpul
sekaligus yang serupa dengan dirinya baik yang terletak disebelah kirinya maupun yang
di sebelah kanannya.

Simpul serta penunjuk dideklarasikan dengan cara :

class Simpul
{
public
String
data;
Simpul
kiri;
Simpul
kanan;
public
//----------- konstruktor ---------Simpul(String d)
{
data = d;
}
//------ fungsi untuk mencetak 'simpul' --void cetakSimpul()
{
System.out.print(data);
}
}
Simpul awal;
Simpul akhir;

Senarai Berantai Ganda (Double Linked List)

Seperti senarai berantai tunggal, Senarai berantai Ganda merupakan kumpulan simpulsimpul yang terhubung satu dengan yang lain. Hanya bedanya pada senarai ini setiap
simpulnya mempunyai 2 penghubung, kiri dan kanan, seperti gambar berikut :

awal

akhir

kanan
kiri

Agung

kanan

kanan

Agung
kiri

Agung
kiri

kanan
Agung

kiri

NULL
NULL

Senarai Berantai Ganda di deklarasikan dengan cara sebagai berikut :


class SenaraiGanda
{
private
Simpul awal;
Simpul akhir;
public
//----------- konstruktor ------------SenaraiGanda()
{
awal = null;
akhir = null;
}
//------- fungsi-fungsi, misalnya : --------------void tambahAwal(String dd)
{
............
}
void tambahAkhir(String dd)
{
............
}
Boolean tambahTengah(String kunci, String dd)
{
............
}
Simpul hapusAwal()
{
............

Simpul hapusPilih(String kunci)


{
............
}
void cetakMaju()
{
............
}
void cetakMundur()
{
............
}
}
SenaraiGanda mahasiswa = new SenaraiGanda();

Program selengkapnya dari Senarai Berantai Ganda adalah sebagai berikut :

class Simpul
{
public
String
data;
Simpul
kiri;
Simpul
kanan;
public
//----------- konstruktor ---------Simpul(String d)
{
data = d;
}
//----------- fungsi untuk mencetak 'simpul' -------void cetakSimpul()
{
System.out.print(data);
}
}
class SenaraiGanda
{
private
Simpul awal;
Simpul akhir;
public
//----------- konstruktor ------------SenaraiGanda()
{
awal = null;
akhir = null;
}
//------- fungsi untuk menambah di awal 'senarai' --void tambahAwal(String dd)
{
System.out.println("menambah depan "+dd + "
dilakukan...");
Simpul baru = new Simpul(dd);
if( awal==null )
//jika senarai kosong
akhir = baru;
else
//jika senarai tidak kosong
awal.kiri = baru;
baru.kanan = awal;
baru.kiri = null;
awal = baru;
}
//-----------

fungsi untuk menambah di akhir 'senarai' ---

----void tambahAkhir(String dd)


{
System.out.println("menambah belakang "+dd+"
dilakukan..");

Simpul baru = new Simpul(dd);


if( awal==null )
//jika senarai kosong
awal = baru;
else
//jika senarai tidak kosong
akhir.kanan = baru;
baru.kiri = akhir;
baru.kanan = null;
akhir = baru;
}
//-------- fungsi untuk menambah di tengah ---Boolean tambahTengah(String kunci, String dd)
{
System.out.println("menambah tengah "+dd+ "
dilakukan...");
Simpul bantu = awal;
while(bantu.data != kunci)
{
bantu = bantu.kanan;
if(bantu == null)
{
System.out.println("---> Nambah " + dd + "
Gagal, karena data " + kunci + " tidak ditemukan");
return false;
}
}
Simpul baru = new Simpul(dd);
if(bantu==akhir)
{
baru.kanan = null;
akhir = baru;
}
else
{
baru.kanan = bantu.kanan;
bantu.kanan.kiri = baru;
}
baru.kiri = bantu;
bantu.kanan = baru;
return true;
}
//--fungsi untuk menghapus sebuah simpul di awal -Simpul hapusAwal()
{
System.out.println("menghapus diAWAL dilakukan...");
Simpul temp = awal;
if(awal.kanan == null) //jika senarai tinggal berisi 1
simpul
akhir = null;
//jika ada lebih dari 1 simpul
awal.kanan.kiri = null;
awal = awal.kanan;
else

return temp;
}
//-- fungsi untuk menghapus sebuah simpul di akhir -Simpul hapusAkhir()
{
System.out.println("menghapus diAKHIR dilakukan...");
Simpul temp = akhir;
if(awal.kanan == null)
//jika senarai tinggal berisi
1 simpul
awal = null;
else

//jika ada lebih dari 1 simpul


akhir.kiri.kanan = null;
akhir = akhir.kiri;
return temp;
}
//--fungsi untuk menghapus simpul berdasarkan kata kunci -Simpul hapusPilih(String kunci)
{
System.out.println("menghapus simpul dg PILIHAN
dilakukan..");
Simpul bantu = awal;
while(bantu.data != kunci)
{
bantu = bantu.kanan;
if(bantu == null)
//tdk ditemukan data yg sama
dgn kunci
return null;
}
if(bantu==awal)
//jika data ditemukan di
depan
awal = bantu.kanan;
else
{
if(bantu==akhir)
//jika data ditemukan di
belakang
akhir = bantu.kiri;
else
//jika data ditemukan di tengah
{
bantu.kiri.kanan = bantu.kanan;
bantu.kanan.kiri = bantu.kiri;
}
}
return bantu;
}
//------- fungsi mencetak maju dari -----------void cetakMaju()
{
System.out.print("Mencetak Maju : ");
Simpul bantu = awal;
while(bantu != null)

{
bantu.cetakSimpul();
bantu = bantu.kanan;
System.out.print(", ");
}
System.out.println(" "); //ganti baris
}
}
class ProgramUtamaSenaraiBerantaiGanda
{
public static void main(String[] args)
{
SenaraiGanda mahasiswa = new SenaraiGanda();
mahasiswa.tambahAwal("Cecep");
mahasiswa.tambahAwal("Beni");
mahasiswa.tambahAwal("Agung");
mahasiswa.tambahAkhir("Eko");
mahasiswa.tambahAkhir("Feri");
mahasiswa.tambahAkhir("Gunawan");
mahasiswa.tambahAkhir("Hasan");
mahasiswa.tambahTengah("Cecep","Dedy");
mahasiswa.tambahTengah("Parmin","Deni");
System.out.println("");
mahasiswa.cetakMaju();
System.out.println("");
mahasiswa.hapusAwal();
mahasiswa.hapusAkhir();
mahasiswa.cetakMaju();
System.out.println("");
mahasiswa.hapusPilih("Dedy");
mahasiswa.cetakMaju();
System.out.println("");
}
}
Praktek :
1.

Implementasikan program di atas

2.

Dalam class SenaraiGanda telah ada fungsi untuk membaca isi senarai
secara maju. Buatlah sebuah fungsi di dalam class yang sama untuk
membaca senarai secara mundur.

Anda mungkin juga menyukai