• Tidak ada hasil yang ditemukan

MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA LINKED LIST (BAGIAN 1)

N/A
N/A
Protected

Academic year: 2021

Membagikan "MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA LINKED LIST (BAGIAN 1)"

Copied!
20
0
0

Teks penuh

(1)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA LINKED LIST (BAGIAN 1)

Deskripsi Singkat

Struktur data array memang sederhana namun unsur-unsur pada array terkait rapat sehingga proses menggeser data di dalam array memerlukan waktu yang lebih lama. Selain itu array juga terbatas ukuran, sehingga jika ukuran diset terlalu besar namun yang dipakai sedikit akan mubazir space. Sebaliknya jika data yang dimasukkan terlalu banyak, maka bisa saja melebihi ukuran. Oleh karena itu terdapat struktur data yang fleksibel dari segi ukuran dan kaitan antar item, yaitu linked list. Linked list ini terdiri dari node yang saling terhubung. Node merupakan tipe khusus objek yang mewakili suatu elemen simpanan pada list. Setiap node pasti akan ada data dan reference ke node berikutnya. Pada single linked list, node yang digunakan hanya memiliki satu reference. Sedangkan pada double linked list, node yang digunakan memiliki dua reference ke node lain.

Tujuan

1. Memahami konsep linear single linked list dan linear double linked list 2. Memahami konsep circular single linked list dan circular double linked list

3. Menggunakan konsep linear single linked list dan linear double linked list pada program sederhana 4. Menggunakan konsep circular single linked list dan circular double linked list pada program

sederhana

Materi 1 : Linear Single Linked List

Linear single linked list terdiri dari node yang dihubungkan oleh satu reference link menunjuk ke node yang lain secara satu arah. Linear single linked list memiliki 2 atribut yaitu node first dan node last. Elemen awal diakses oleh node first dan elemen akhir diakses oleh node last. Ilustrasinya seperti gambar di bawah.

Sebelum kita membuat linked list, maka terlebih dahulu kita membuat class Node. Berikut ini class Node tersebut.

public class Node {

(2)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

protected Node link; /* Constructor */ public Node() { link = null; data = 0; } /* Constructor */

public Node(int d,Node n) {

data = d; link = n; }

/* Function to set link to next Node */ public void setLink(Node n)

{

link = n; }

/* Function to set data to current Node */ public void setData(int d)

{

data = d; }

/* Function to get link to next node */ public Node getLink()

{

return link; }

/* Function to get data from current Node */ public int getData()

{

return data; }

}

Setelah kita membuat class Node, barulah kita buat class SinglyLinkedList, berikut ini kode programnya. Class ini juga menambahkan method main untuk menguji class tersebut.

public class SinglyLinkedList {

protected Node first; protected Node last; public int size;

/* Constructor */

public SinglyLinkedList() {

(3)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

last = null; size = 0; }

//method untuk mengecek apakah linked list kosong atau tidak public boolean isEmpty()

{

return first == null; }

//method untuk mengembalikan ukuran linked list sekarang public int getSize()

{

return size; }

//method untuk memasukkan node di awal linked list public void insertAwal(int val)

{

//buat satu node baru

Node nptr = new Node(val, null);

if(first == null) //jika linked list masih kosong { first = nptr; last = first; } else { nptr.setLink(first); first = nptr; }

//tambah ukuran linked list size++;

}

//method untuk memasukkan node di akhir linked list public void insertAkhir(int val)

{

//buat satu node baru

Node nptr = new Node(val, null);

if(first == null) //jika linked list masih kosong { first = nptr; last = first; } else { last.setLink(nptr); last = nptr;

(4)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

}

//tambah ukuran linked list size++;

}

//method untuk memasukkan node di posisi tertentu public void insertAtPos(int val, int pos)

{

//buat satu node baru

Node nptr = new Node(val, null);

if(pos > size)

System.out.println("Posisi melebihi batas linked list"); else if(pos == 1)

insertAwal(val); else if(pos == size) insertAkhir(val); else { Node ptr = first; pos = pos - 1;

for(int i=1; i<size; i++) {

if(i == pos) //ketemu posisi { Node tmp = ptr.getLink(); ptr.setLink(nptr); nptr.setLink(tmp); break; } ptr = ptr.getLink(); }

//tambah ukuran linked list size++;

} }

//method untuk menghapus node di awal linked list public void deleteAwal()

{

first = first.getLink();

size--; //kurangi ukuran linked list }

//method untuk menghapus node di akhir linked list public void deleteAkhir()

{

(5)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

for(int i=1; i<size-1; i++) temp = temp.getLink();

last = temp;

last.setLink(null);

size--; //kurangi ukuran linked list }

//method untuk menghapus node pada posisi tertentu public void deleteAtPos(int pos)

{

if(pos > size)

System.out.println("Posisi node melebihi ukuran"); else if(pos == 1)

this.deleteAwal(); else if(pos == size) this.deleteAkhir(); else { Node ptr = first; pos--;

for(int i=1; i<=pos; i++) {

if(i == pos) {

Node temp = ptr.getLink(); temp = temp.getLink(); ptr.setLink(temp); break; } ptr = ptr.getLink(); } size--; } }

//method untuk menampilkan semua unsur dalam linked list public void display()

{ Node ptr = first; while(true) { if(ptr == null) break; System.out.print(ptr.getData() + "->"); ptr = ptr.getLink(); }

(6)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

System.out.println(); }

public static void main(String[] ar) {

SinglyLinkedList lk = new SinglyLinkedList(); lk.insertAwal(10); lk.insertAwal(20); lk.insertAkhir(30); lk.insertAwal(40); lk.insertAtPos(50, 2); lk.insertAkhir(60); lk.display(); //lk.deleteAwal(); //lk.deleteAkhir(); lk.deleteAtPos(2); lk.display(); } }

Apakah output dari program di atas? Bagaimana tampilan hasilnya sesudah proses insert dan delete?

Materi 2 : Linear Double Linked List

Linear double linked list terdiri dari node yang dihubungkan oleh dua reference link menunjuk ke node sebelumnya dan node sesudahnya. Linear double linked list memiliki 2 atribut yaitu node start dan node end. Elemen awal diakses oleh node start dan elemen akhir diakses oleh node end. Ilustrasinya seperti gambar di bawah.

Sebelum kita membuat linked list, maka terlebih dahulu kita membuat class Node. Class Node pada double linked list tidak sama dengan single linked list karena nodenya memiliki 3 atribuat yaitu data node next dan node prev. Berikut ini class Node tersebut.

public class NodeDoubly {

protected int data;

protected NodeDoubly next, prev;

(7)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

public NodeDoubly() { next = null; prev = null; data = 0; } /* Constructor */

public NodeDoubly(int d, NodeDoubly n, NodeDoubly p) {

data = d; next = n; prev = p; }

/* Function to set link to next node */ public void setLinkNext(NodeDoubly n) {

next = n; }

/* Function to set link to previous node */ public void setLinkPrev(NodeDoubly p)

{

prev = p; }

/* Funtion to get link to next node */ public NodeDoubly getLinkNext()

{

return next; }

/* Function to get link to previous node */ public NodeDoubly getLinkPrev()

{

return prev; }

/* Function to set data to node */ public void setData(int d)

{

data = d; }

/* Function to get data from node */ public int getData()

{

return data; }

}

Setelah kita membuat class Node, barulah kita buat class DoublyLinkedList, berikut ini kode programnya. Class ini juga menambahkan method main untuk menguji class tersebut.

public class DoublyLinkedList {

(8)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

protected NodeDoubly first; protected NodeDoubly last; public int size;

/* Constructor */ public DoublyLinkedList() { first = null; last = null; size = 0; }

//method untuk mengecek apakah linked list kosong public boolean isEmpty()

{

return first == null; }

//method untuk mengembalikan ukuran linked list public int getSize()

{

return size; }

//method untuk menambah elemen di awal linked list public void insertAwal(int val)

{

NodeDoubly nptr = new NodeDoubly(val, null, null); if(first == null) { first = nptr; last = first; } else { first.setLinkPrev(nptr); nptr.setLinkNext(first); first = nptr; } size++; }

//method untuk menambah elemen di akhir linked list public void insertAkhir(int val)

{

NodeDoubly nptr = new NodeDoubly(val, null, null); if(first == null) { first = nptr; last = first; } else

(9)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

{ nptr.setLinkPrev(last); last.setLinkNext(nptr); last = nptr; } size++; }

//method untuk menambah elemen di sekitar tengah public void insertAtPos(int val , int pos)

{

NodeDoubly nptr = new NodeDoubly(val, null, null); if (pos > size)

System.out.println("Posisi melebihi batas linked list"); else if (pos == 1)

insertAwal(val); else if (pos == size) insertAkhir(val); else

{

NodeDoubly ptr = first;

for (int i = 2; i <= size; i++) { if (i == pos) { NodeDoubly tmp = ptr.getLinkNext(); ptr.setLinkNext(nptr); nptr.setLinkPrev(ptr); nptr.setLinkNext(tmp); tmp.setLinkPrev(nptr); } ptr = ptr.getLinkNext(); } size++ ; } }

//method untuk menghapus node di awal linked list public void deleteAwal()

{

if(size == 1) //jika hanya ada 1 node { first = null; last = null; size = 0; } else { first = first.getLinkNext(); first.setLinkPrev(null); size--; }

(10)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

}

//method untuk menghapus node di akhir linked list public void deleteAkhir()

{ last = last.getLinkPrev(); last.setLinkNext(null); size--; }

//method untuk menghapus node di posisi tertentu public void deleteAtPos(int pos)

{

if(pos > size)

System.out.println("Posisi node melebihi ukuran"); else if(pos == 1)

this.deleteAwal(); else if(pos == size) this.deleteAkhir(); else

{

NodeDoubly ptr = first.getLinkNext(); for(int i=2; i<=size; i++)

{ if(i == pos) { NodeDoubly p = ptr.getLinkPrev(); NodeDoubly n = ptr.getLinkNext(); p.setLinkNext(n); n.setLinkPrev(p); size--; } ptr = ptr.getLinkNext(); } } }

//method untuk menampilkan semua unsur dalam linked list public void display()

{ NodeDoubly ptr = first; while(true) { if(ptr == null) break; System.out.print(ptr.getData() + "->"); ptr = ptr.getLinkNext(); } System.out.println();

(11)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

}

public static void main(String[] ar) {

DoublyLinkedList dl = new DoublyLinkedList(); dl.insertAwal(10); dl.insertAwal(20); dl.insertAkhir(30); dl.insertAtPos(40, 3); dl.insertAtPos(50, 3); dl.display(); dl.deleteAwal(); dl.deleteAkhir(); dl.deleteAtPos(2); dl.display(); } }

Apakah output dari program di atas? Bagaimana tampilan hasilnya sesudah proses insert dan delete?

Materi 3 : Circular Single Linked List

Circular single linked list mirip seperti linear single linked list. Bedanya jika node last pada linear menunjuk ke null, namun pada circular node last akan selalu menunjuk ke first. Sehingga linked list seakan-akan menjadi bentuk circular/lingkaran. Kondisi lainnya tidak berbeda jauh dengan linked list yang linear single. Ilustrasinya seperti gambar di bawah.

Node yang digunakan untuk circular single linked list sama seperti node linear single linked list. Jadi kita langsung lanjutkan dengan membuat kode program CircularSinglyLinkedList.

public class CircularSinglyLinkedList {

protected Node first; protected Node last; public int size;

(12)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

public CircularSinglyLinkedList() { first = null; last = null; size = 0; }

//method untuk mengecek apakah linked list kosong atau tidak public boolean isEmpty()

{

return first == null; }

//method untuk mengembalikan ukuran linked list sekarang public int getSize()

{

return size; }

//method untuk memasukkan node di awal linked list public void insertAwal(int val)

{

//buat satu node baru

Node nptr = new Node(val, null); nptr.setLink(first);

if(first == null) //jika linked list masih kosong { first = nptr; nptr.setLink(first); last = first; } else { last.setLink(nptr); first = nptr; }

//tambah ukuran linked list size++;

}

//method untuk memasukkan node di akhir linked list public void insertAkhir(int val)

{

//buat satu node baru

Node nptr = new Node(val, null); nptr.setLink(first);

if(first == null) //jika linked list masih kosong {

(13)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

nptr.setLink(first); last = first; } else { last.setLink(nptr); last = nptr; }

//tambah ukuran linked list size++;

}

//method untuk memasukkan node di posisi tertentu public void insertAtPos(int val, int pos)

{

//buat satu node baru

Node nptr = new Node(val, null);

if(pos > size)

System.out.println("Posisi melebihi batas linked list"); else if(pos == 1)

insertAwal(val); else if(pos == size) insertAkhir(val); else { Node ptr = first; pos = pos - 1;

for(int i=1; i<size; i++) {

if(i == pos) //ketemu posisi { Node tmp = ptr.getLink(); ptr.setLink(nptr); nptr.setLink(tmp); break; } ptr = ptr.getLink(); }

//tambah ukuran linked list size++;

} }

//method untuk menghapus node di awal linked list public void deleteAwal()

{

if(size == 1) {

(14)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

first = null; last = null; size = 0; } else { first = first.getLink(); last.setLink(first);

size--; //kurangi ukuran linked list }

}

//method untuk menghapus node di akhir linked list public void deleteAkhir()

{

Node temp = first;

for(int i=1; i<size-1; i++) temp = temp.getLink();

last = temp;

last.setLink(first);

size--; //kurangi ukuran linked list }

//method untuk menghapus node pada posisi tertentu public void deleteAtPos(int pos)

{

if(pos > size)

System.out.println("Posisi node melebihi ukuran"); else if(pos == 1)

this.deleteAwal(); else if(pos == size) this.deleteAkhir(); else { Node ptr = first; pos--;

for(int i=1; i<=pos; i++) {

if(i == pos) {

Node temp = ptr.getLink(); temp = temp.getLink(); ptr.setLink(temp); break; } ptr = ptr.getLink(); } size--;

(15)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

} }

//method untuk menampilkan semua unsur dalam linked list public void display()

{ Node ptr = first; while(true) { System.out.print(ptr.getData() + "->"); if(ptr == last) break; ptr = ptr.getLink(); } System.out.println(); }

public static void main(String[] ar) {

CircularSinglyLinkedList lk = new CircularSinglyLinkedList(); lk.insertAwal(10); lk.insertAwal(20); lk.insertAkhir(30); lk.insertAwal(40); lk.insertAtPos(50, 2); lk.insertAkhir(60); lk.insertAkhir(70); lk.display(); lk.deleteAwal(); lk.deleteAkhir(); lk.deleteAtPos(2); lk.display(); } }

Apakah output dari program di atas? Bagaimana tampilan hasilnya sesudah proses insert dan delete?

Materi 4 : Circular Double Linked List

Circular double linked list mirip seperti linear double linked list. Bedanya jika node last pada linear menunjuk ke null, namun pada circular node last akan selalu menunjuk ke first. Sehingga linked list seakan-akan menjadi bentuk circular/lingkaran. Kondisi lainnya tidak berbeda jauh dengan linked list yang linear double. Ilustrasinya seperti gambar di bawah.

(16)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

Node yang digunakan untuk circular double linked list sama seperti node linear double linked list yaitu class NodeDoubly. Jadi kita langsung lanjutkan dengan membuat kode program CircularDoublyLinkedList. public class CircularDoublyLinkedList

{

protected NodeDoubly first; protected NodeDoubly last; public int size;

/* Constructor */ public CircularDoublyLinkedList() { first = null; last = null; size = 0; }

//method untuk mengecek apakah linked list kosong public boolean isEmpty()

{

return first == null; }

//method untuk mengembalikan ukuran linked list public int getSize()

{

return size; }

//method untuk menambah elemen di awal linked list public void insertAwal(int val)

{

NodeDoubly nptr = new NodeDoubly(val, null, null); if(first == null) { nptr.setLinkNext(nptr); nptr.setLinkPrev(nptr); first = nptr; last = first; } else { nptr.setLinkPrev(last); last.setLinkNext(nptr);

(17)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

first.setLinkPrev(nptr); nptr.setLinkNext(first); first = nptr; } size++; }

//method untuk menambah elemen di akhir linked list public void insertAkhir(int val)

{

NodeDoubly nptr = new NodeDoubly(val, null, null); if(first == null) { nptr.setLinkNext(nptr); nptr.setLinkPrev(nptr); first = nptr; last = first; } else { nptr.setLinkPrev(last); last.setLinkNext(nptr); first.setLinkPrev(nptr); nptr.setLinkNext(first); last = nptr; } size++; }

//method untuk menambah elemen di sekitar tengah public void insertAtPos(int val , int pos)

{

NodeDoubly nptr = new NodeDoubly(val, null, null); if (pos > size)

System.out.println("Posisi melebihi batas linked list"); else if (pos == 1)

insertAwal(val); else if (pos == size) insertAkhir(val); else

{

NodeDoubly ptr = first;

for (int i = 2; i <= size; i++) { if (i == pos) { NodeDoubly tmp = ptr.getLinkNext(); ptr.setLinkNext(nptr); nptr.setLinkPrev(ptr); nptr.setLinkNext(tmp); tmp.setLinkPrev(nptr); }

(18)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

ptr = ptr.getLinkNext(); } size++ ; } }

//method untuk menghapus node di awal linked list public void deleteAwal()

{

if(size == 1) //jika hanya ada 1 node { first = null; last = null; size = 0; } else { first = first.getLinkNext(); first.setLinkPrev(last); last.setLinkNext(first); size--; } }

//method untuk menghapus node di akhir linked list public void deleteAkhir()

{ last = last.getLinkPrev(); last.setLinkNext(first); first.setLinkPrev(last); size--; }

//method untuk menghapus node di posisi tertentu public void deleteAtPos(int pos)

{

if(pos > size)

System.out.println("Posisi node melebihi ukuran"); else if(pos == 1)

this.deleteAwal(); else if(pos == size) this.deleteAkhir(); else

{

NodeDoubly ptr = first.getLinkNext(); for(int i=2; i<=size; i++)

{ if(i == pos) { NodeDoubly p = ptr.getLinkPrev(); NodeDoubly n = ptr.getLinkNext();

(19)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

p.setLinkNext(n); n.setLinkPrev(p); size--; } ptr = ptr.getLinkNext(); } } }

//method untuk menampilkan semua unsur dalam linked list public void display()

{ NodeDoubly ptr = first; while(true) { System.out.print(ptr.getData() + "->"); if(ptr == last) break; ptr = ptr.getLinkNext(); } System.out.println(); }

public static void main(String[] ar) {

CircularDoublyLinkedList dl = new CircularDoublyLinkedList(); dl.insertAwal(10); dl.insertAwal(20); dl.insertAkhir(30); dl.insertAtPos(40, 3); dl.insertAtPos(50, 3); dl.display(); dl.deleteAwal(); dl.deleteAkhir(); dl.deleteAtPos(2); dl.display(); } }

(20)

Viska Mutiawani, M.IT, Irvanizam, M.Sc, Dr. Taufik Fuadi Abidin Jurusan Informatika Universitas Syiah Kuala

LATIHAN 1

Buat semua class-class yang ada dalam praktikum ini. Apakah yang dapat anda simpulkan?

SOAL-SOAL

Referensi

Dokumen terkait

//IS: L terdefinisi, tidak kosong, P alamat valid dari salah node dalam L //FS: Semua info Node dari List L tercetak mulai dari P sampai ke prev ke. //

gunakan sebagai awal dari linked list, node aktif dalam linked list, dan node sementara yang kita gunakan dalam pembuatan node di linked list. Berikan nilai awal NULL

Seperti yang telah kita pelajari pada praktikum 3, untuk menyimpan data yang umum, kita dapat memanfaatkan class Object yang dibuat dalam format generic.. Berikut

Buatlah method untuk menambahkan Node di Double Linked List, setelah Node tertentu (pembacaan List menggunakan pembacaan mundur). public

 DLLNC adalah sebuah Linked List yang terdiri dari dua arah pointer, dengan node yang saling terhubung, namun kedua pointernya menunjuk ke NULL.  Setiap node pada

 DLLNC adalah sebuah Linked List yang terdiri dari dua arah pointer, dengan node yang saling terhubung, namun kedua pointernya menunjuk ke NULL.  Setiap node pada

P raktikum 3 S enarai B erantai D ua A rah D ouble L inked L ist POKOK BAHASAN: 9 Konsep double linked list 9 Struktur double linked list 9 Implementasi double linked list

Jika tidak kosong, kami melakukan iterasi melalui linked list hingga mencapai node terakhir, dan kemudian menambahkan node baru sebagai node berikutnya.. Pencarian Node: Selanjutnya,