Anda di halaman 1dari 14

PRAKTIKUM ASD (JAVA) MODUL KE-1

LIST LINIER : ARRAY DAN LINKED LIST

Nur Fajri Azhar 201010370311003

LABORATORIUM PEMROGRAMAN PROGRAM STUDI TEKNIK INFORMATIKA FAKULTAS TEKNIK UNIVERSITAS MUHAMMADIYAH MALANG 2011

I.

TUJUAN
Mahasiswa mampu : 1. Memahami garis besar dari konsep array dan linked list. 2. Mengetahui perbedaan antara array dan linked list. 3. Mengimplementasikan array dan linked list kedalam program.

II. ALAT YANG DIGUNAKAN


Peralatan yang digunakan : 1. Perangkat PC yang terinstall Java 2. Editor Java

III. DASAR TEORI ARRAY


Satu Dimensi Pada dasarnya array satu dimensi merupakan kumpulan dari variabel yang memiliki tipe data yang sama. Java memperlakukan array sama dengan tipe data referensi Ukuran array terbatas pada kapasitas memori yang tersedia di komputer. Contoh:

Multi Dimensi Dapat diartikan sebagai array dalam array (array of array). Contoh: int a[][] = new int[3][4]; // array 2 dimensi int y[][][] = new int[1][3][2]; // array 3 dimensi

LINKED LIST
Merupakan koleksi linear dari elemen data yang disebut simpul atau node. Setiap node terdiri atas dua bagian: Field yang berisi pointer ke node berikutnya Field yang berisi data. Node terakhir akan menunjuk ke NULL yang digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list.

Implementasi Linked List


Sebuah list merupakan rantai dari object bertipe ListNode yang berisikan data dan referensi (pointer) kepada ListNode selanjutnya dalam list. Harus diketahui dimana letak elemen pertama!

Menghapus Elemen
Proses menghapus dilakukan dengan mengabaikan elemen yang hendak dihapus dengan cara melewati pointer (reference) dari elemen tersebut langsung pada elemen selanjutnya. Elemen x dihapus dengan meng-assign field next pada elemen a dengan alamat b. Butuh menyimpan alamat node yang terletak sebelum node yang akan dihapus. (pada gambar node current, berisi elemen a) current.next = current.next.next;

SINGLE CIRCULAR LINKED LIST


Single Linked List yang pointer next-nya menunjuk ke dirinya sendiri Jika terdiri dari beberapa node maka pointer terakhirnya akan menunjuk ke pointer terdepannya.

DOUBLE LINKED LIST


Linked list yang memiliki dua pointer, dimana setiap node memiliki 3 field, yaitu: 1 field pointer yang menunjuk ke pointer berikutnya, 1 field pointer yang menunjuk ke pointer sebelumnya dan field yang berisi data dari node tersebut. Pointer next dan prev-nya menunjuk ke null.

DOUBLE CIRCULAR LINKED LIST


Double Linked List yang pointer next dan prev-nya menunjuk ke dirinya sendiri secara circular.

IV. PROSEDUR PELAKSANAAN


Prosedur pelaksanaan praktikum adalah sebagai berikut : 1. Mahasiswa mencoba percobaan yang ada pada modul praktikum 2. Mahasiswa mengerjakan tugas yang diberikan 3. Mahasiswa membuat laporan dari tugas yang telah dikerjakan (dilengkapi dengan Hasil praktikum dan kesimpulan). Hasil praktikum merupakan printscreen dari hasil ujicoba program. 4. Upload laporan melalui e-labit.umm.ac.id 5. Mahasiswa mendemonstrasikan program yang telah dikerjakan 6. Asisten/dosen menilai pekerjaan mahasiswa

V. PERCOBAAN
1. Implementasi array 3 dimensi.

2. Menyalin (copying arrays) isi array ke array yang lain.

3. Mengubah array 1 dimensi menjadi array 2 dimensi dari deret bilaangan berikut: 12, 3, 14, 6, 17, 7, 5, 9, 11, 10, 4, 2

4. Mengisi nilai dari elemen array dengan tipe data yang berbeda.

5. Mengubah ukuran array.

VI. TUGAS PRAKTIKUM


1. Buatlah algoritma beserta programnya untuk menambah data di awal, ditengah dan diakhir pada Single linked list. Diasumsikan bahwa belum ada node yang dibuat, jadi anda membuat beberapa node baru setelah itu dilakukan ketiga proses tadi. 2. Buatlah algoritma beserta programnya untuk menghapus data di awal, ditengah dan diakhir pada Single linked list. Diasumsikan bahwa belum ada node yang dibuat, jadi anda membuat beberapa node baru setelah itu dilakukan ketiga proses tadi. 3. Buatlah algoritma beserta programnya untuk menambah data di awal, ditengah dan diakhir pada Double linked list. Diasumsikan bahwa belum ada node yang dibuat, jadi anda membuat beberapa node baru setelah itu dilakukan ketiga proses tadi. 4. Buatlah algoritma beserta programnya untuk menghapus data di awal, ditengah dan diakhir pada Double linked list. Diasumsikan bahwa belum ada node yang dibuat, jadi anda membuat beberapa node baru setelah itu dilakukan ketiga proses tadi. 5. Buatlah algoritma beserta programnya untuk mengubah data (update data) suatu node pada Single linked list. Diasumsikan bahwa belum ada node yang dibuat, jadi anda membuat beberapa node baru setelah itu dilakukan proses update data. Data baru yang diisikan serta node yang dipilih untuk di update datanya berdasarkan input dari user.

VII. HASIL PRAKTIKUM

1.
Class Node package modul1_ver2; public class Node { int data; Node nextNode; Node prevNode; Node now; } Class advNode package modul1_ver2; public class advNode { Node emptyList = null; Node newNode = new Node(); Node head = newNode; Node headAwal = head; void isiHead(int x){ newNode.data = x; } void tambahTengah(int x){ Node tmp = new Node(); tmp.data = x; tmp.nextNode = newNode.nextNode; newNode.nextNode = tmp; } void tambahDepan(int x){ newNode.nextNode = new Node(); newNode.nextNode.data = x; } void maju(){ newNode = newNode.nextNode; } void tambahAwal(int x){ Node tmp2 = new Node(); tmp2.data = x; tmp2.nextNode = head; head = tmp2; } void printNode(){ Node currNode = head; System.out.print("[ "); while (currNode != null) { if(currNode.nextNode != null) System.out.print(currNode.data+","); else System.out.print(currNode.data); currNode = currNode.nextNode; } System.out.print(" ]"); } public static void main(String[] args) { advNode simpul = new advNode() ; System.out.println("Modul 1 No.1 : "); simpul.isiHead(3); simpul.printNode(); System.out.println("keadaan sementara list awal node"); simpul.tambahDepan(5); simpul.printNode(); System.out.println("keadaan sementara list tambah di akhir node"); simpul.tambahTengah(10); simpul.maju(); simpul.printNode(); System.out.println("keadaan sementara list tambah di tengah node"); simpul.tambahAwal(2); simpul.printNode(); System.out.println("keadaan akhir list tambah di awal node"); }}

Analisis Algoritma pemograman ini di bertujuan untuk membuat list atau linked list yang dinamis dan dapat di tambah elemenya dari tengah, depan dan belakang. Menggunakan class Node sebagai class awal membuat node atau simpul dari list. Berikutnya membuat Class advNode sebagai program utama yang akan menjalankan algoritma ini. Node berupa objek yang di hubungkan alamatnya dengan next dan di beri isinya dengan data. Dalam program ini ada juga variable Head yang akan berjalan dalam list untuk memberi acuan dalam mengisi data pada list. Method isiHead() mengisikan data yang ada pada parameternya kepada list yang pada saat itu head berada. Method tambahTengah() akan membuat sebuah node/simpul baru yang akan di selipkan setelah newNode berada. Node itu adalah tmp.nextNode yang akan di isi oleh alamat newNode.nextNode lalu newNode.nextNode akan di tujukan kepada Node tmp dan tmp.nextNode akan di isi oleh newNode.nextNode. Lalu isinya di isi sesuai parameter pada methodnya. Method tambahDepan() akan membuat Node baru setelah posisi newNode dan akan di isi dengan data yang di masukkan pada parameter method ini. Method maju() berfungsi untuk memajukan newNode() ke node berikutnya pada list. Method tambahAwal() akan membuat Node baru yang di beri nama tmp2 lalu ada head yang menyimpan alamat awal sehingga tmp2.nextNode = head dan menempatkan tmp2 di awal list. Head di pindahkan ke tmp2 sehingga list seolah bertambah di paling depan dan datanya di isi dari parameter method ini. Dan method terakhir ialah Method printNode() yang akan menampilkan nilai dari list list yang sudah ada, menggunakan kondisi perulangan dimana currNode akan terus berjalan dan mencetak isi list selama isi list tidak null. Lalu pada main program hanya tinggal membuat objek dan mengakses method method yang sudah di buat tadi hingga menghasilkan seperti yang ada di print screen dan permintaan soal.

2.
package modul1_ver2; public class advNode2 { Node emptyList = null; Node newNode = new Node(); Node head = newNode; Node headAwal = head; Node bantu = head; Node bantu2; void isiHead(int x){ newNode.data = x; } void tambahDepan(int x){ newNode.nextNode = new Node(); newNode.nextNode.data = x; } void maju(){ newNode = newNode.nextNode; } void hapusAwal(){ head = headAwal.nextNode; } void hapus(){ newNode.nextNode = null; } void hapusTengah(int i){ bantu = head.nextNode; head.nextNode = bantu.nextNode; } void printNode(){ Node currNode = head; System.out.print("[ "); while (currNode != null) { if(currNode.nextNode != null) System.out.print(currNode.data+","); else System.out.print(currNode.data); currNode = currNode.nextNode; } System.out.print(" ]"); } public static void main(String[] args) { advNode2 simpul = new advNode2() ; System.out.println("Modul 1 No.2 : "); simpul.isiHead(6); for(int i=0;i<4;i++){ simpul.tambahDepan(i); simpul.maju(); } simpul.tambahDepan(5); simpul.printNode(); System.out.println("list awal"); simpul.hapusAwal(); simpul.printNode(); System.out.println("list setelah hapus awal"); simpul.hapus(); simpul.printNode(); System.out.println("list setelah hapus akhir"); simpul.hapusTengah(1); simpul.printNode(); System.out.println("list setelah hapus tengah"); }}

Analisis Dalam program ini algoritmanya di tujukan untuk membuat list atau linked list yang dinamis dan dapat di hapus elemenya dari tengah depan ataupun belakang. Dengan menggunakan class Node sebagai class awal membuat node atau simpul dari list. Selanjutnya membuat Class advNode3 sebagai program utama yang akan menjalankan algoritma ini. Method isiHead() mengisikan data yang ada pada parameternya kepada list yang pada saat itu head berada. Method tambahDepan() akan membuat Node baru setelah posisi newNode dan akan di isi dengan data yang di masukkan pada parameter method ini. Method maju() berfungsi untuk memajukan newNode() ke node berikutnya pada list. Method hapusAwal() akan membuat node paling depan menjadi tidak di akses dengan merubah posisi head menjadi head.nextNode sehingga posisi head berada pada posisi list setelahnya. Method hapus() akan menghapus node di akhir list dengan mengisi null pada list terakhir setelah newNode. Method hapusTengah() akan menghapus node yang ada di tengah tengah list setelah posisi head. Dengan memakai bantuan node bantu yang di isikan head.nextNode lalu, head.nextNode akan di isi bantu.nextNode sehingga menghilangkan akses kepada Node yang tadinya di samakan dengan node bantu. Node tersebut pada akhirnya akan tak berakses dan akan di hapus oleh garbage collector java. Dan method terakhir ialah Method printNode() yang akan menampilkan nilai dari list list yang sudah ada, menggunakan kondisi perulangan dimana currNode akan terus berjalan dan mencetak isi list selama isi list tidak null. Lalu pada main program hanya tinggal membuat objek dan mengakses method method yang sudah di buat tadi hingga menghasilkan seperti yang ada di print screen dan permintaan soal.

3.
package modul1_ver2; public class advNode3 { Node emptyList = null; //buat list kosong Node newNode = new Node(); Node head = newNode; Node headAwal = head; void isiHead(int x) { head.data = x; } void tambahDepan(int x){ newNode.nextNode = new Node(); newNode.nextNode.data =x; newNode.nextNode.prevNode = newNode; } void tambahAwal(int x){ Node tmp = new Node(); tmp.data = x; tmp.nextNode = head; head = tmp; head.prevNode = tmp; tmp.prevNode = newNode.nextNode; } void maju(){ newNode = newNode.nextNode; } void printNode(){ Node currNode = head; System.out.print("[ "); while (currNode != null) { if(currNode.nextNode != null) System.out.print(currNode.data+","); else

System.out.print(currNode.data); currNode = currNode.nextNode; } System.out.print(" ]"); } void tambahTengah(int x){ Node tmp2 = new Node(); tmp2.data = x; tmp2.nextNode = newNode.nextNode; tmp2.nextNode.prevNode = tmp2; newNode.nextNode = tmp2; tmp2.prevNode = newNode; } public static void main(String[] args) { advNode3 simpul = new advNode3(); simpul.isiHead(8); simpul.printNode(); System.out.println("simpul awal"); simpul.tambahDepan(4); simpul.printNode(); System.out.println("simpul tambah depan"); simpul.tambahAwal(5); simpul.printNode(); System.out.println("tambah awal"); simpul.tambahTengah(44); simpul.printNode(); System.out.println("tambah tengah"); simpul.maju(); simpul.tambahTengah(22); simpul.printNode(); System.out.println("tambah tengah"); } }

Analisis Dalam program ini algoritmanya di tujukan untuk membuat list atau linked list dalam bentuk double linked list yang dinamis dan dapat di tambah elemenya dari tengah depan ataupun belakang. Dengan menggunakan class Node sebagai class awal membuat node atau simpul dari list. Selanjutnya membuat Class advNode3 sebagai program utama yang akan menjalankan algoritma ini. Method isiHead() mengisikan data yang ada pada parameternya kepada list yang pada saat itu head berada. Method tambahDepan() akan membuat Node baru setelah posisi newNode dan akan di isi dengan data yang di masukkan pada parameter method ini. Lalu memberikan link baliknya berupa newNode.nextNode.prevNode = newNode agar ada link balik yang kembali menuju ke newNode sesuai konsep double linked list. Method tambahAwal() akan membuat node baru yang akan di inisialkan sebagai tmp lalu membuat tmp.nextNode = head dan head akan di pindahkan ke

tmp sehingga tmp berada pada posisi awal list. Kemudian, tmp.prevNode = newNode.nextNode dimana newNode.nextNode akan berada pada posisi node terakhir sehingga membentuk sirkulasi seperti konsep double linked list dan data di isi dari masukkan parameter pada method ini. Method maju() berfungsi untuk memajukan newNode() ke node berikutnya pada list. Method tambahTengah() akan menyisipkan node di tengah tengah list setelah posisi newNode, dengan mmbentuk node baru dan di isialkan sebagai tmp2. tmp2.nextNode di isikan alamat dari newNode.nextNode lalu tmp2.nextNode.prevNode akan menunjuk ke tmp2 lalu tmp2.prevNode akan di tunjukkan ke newNode, begitu juga newNode.nextNode akan di tunjukkan ke tmp2 sehingga, tmp2 berada di tengah tengah 2 node tersebut dan terbnetuk double linked list diantaranya. Data dari tmp2 di isikan sesuai parameter method tersebut. Method printNode() yang akan menampilkan nilai dari list list yang sudah ada, menggunakan kondisi perulangan dimana currNode akan terus berjalan dan mencetak isi list selama isi list tidak null. Lalu pada main program hanya tinggal membuat objek dan mengakses method method yang sudah di buat tadi hingga menghasilkan seperti yang ada di print screen dan permintaan soal.

4.
package modul1_ver2; public class advNode4 { Node emptyList = null; Node newNode = new Node(); Node head = newNode; Node headAwal = head; Node bantu; void isiHead(int x){ newNode.data = x; } void tambahDepan(int x){ newNode.nextNode = new Node(); newNode.nextNode.data =x; newNode.nextNode.prevNode = newNode; } void maju(){ newNode = newNode.nextNode; } void hapus(){ newNode.nextNode = head; head.prevNode = newNode; } void hapusDepan(){ head = headAwal.nextNode; head.prevNode = newNode.nextNode; } void hapusTengah(){ bantu = newNode.prevNode; newNode.prevNode = bantu.prevNode; bantu.prevNode.nextNode = newNode; } void printNode(){ Node currNode = head; System.out.print("[ "); while (currNode != null) { if(currNode.nextNode != null) System.out.print(currNode.data+","); else System.out.print(currNode.data); currNode = currNode.nextNode; } System.out.print(" ]"); } public static void main(String[] args) { advNode4 simpul = new advNode4(); simpul.isiHead(12); simpul.tambahDepan(45); simpul.maju(); simpul.tambahDepan(33); simpul.maju(); simpul.tambahDepan(67); simpul.maju(); simpul.tambahDepan(88); simpul.printNode(); System.out.println("List awal"); simpul.hapus(); simpul.printNode(); System.out.println("setelah di hapus depan"); simpul.hapusDepan(); simpul.printNode(); System.out.println("setelah di hapus awal"); simpul.hapusTengah(); simpul.printNode(); System.out.println("setelah di hapus tengah"); } }

Analisis
Dalam program ini algoritmanya di tujukan untuk membuat list atau linked list dalam bentuk double linked list yang dinamis dan dapat di hapus elemenya dari tengah depan ataupun belakang. Dengan menggunakan class Node sebagai class awal membuat node atau simpul dari list. Selanjutnya membuat Class advNode4 sebagai program utama yang akan menjalankan algoritma ini. Method isiHead() mengisikan data yang ada pada parameternya kepada list yang pada saat itu head berada. Method tambahDepan() akan membuat Node baru setelah posisi newNode dan akan di isi dengan data yang di masukkan pada parameter method ini. Lalu memberikan link baliknya berupa newNode.nextNode.prevNode = newNode agar ada link balik yang kembali menuju ke newNode sesuai konsep double linked list. Method hapus() akan menghapus link pada newNode.nextNode yang seharusnya menuju ke node terakhir pada list menjadi menuju ke head yaitu node pertama pada list. Dan head.prevNode akan di tunjukkan kembali ke newNode sehingga membentuk sirkulasi list. Method hapusDepan() akan memajukan head 1 list ke depanya dan membentuk head.prevNode = newNode.nextNode yaitu mengembalikanya ke node trakhir pada list sehingga membentuk sirkulasi dan memutuskan link pada node palinbg awal sebelumnya dan akan secara otomatis di hapus oleh garbagr colletor java karena tidak ada yang mengaksesnya. Method hapusTengah() akan menghapus node yang berada di tengah tengah list dan sebelum newNode. Dengan memakai bantuan node bantu yang di inisialkan dari newNode.prevNode. Kemudian, newNode.prevNode di berikan alamat link dari bantu.prevNode sehingga tidak lagi mengakses bantu dan bantu.prevNode.nextNode = newNode maka akan membuat link olak balik sesuai konsep double linked list dan tidak lagi mengakses bantu. Method maju() berfungsi untuk memajukan newNode() ke node berikutnya pada list. Method printNode() yang akan menampilkan nilai dari list list yang sudah ada, menggunakan kondisi perulangan dimana currNode akan terus berjalan dan mencetak isi list selama isi list tidak null. Lalu pada main program hanya tinggal membuat objek dan mengakses method method yang sudah di buat tadi hingga menghasilkan seperti yang ada di print screen dan permintaan soal.

5. package modul1_ver2; import java.util.Scanner; public class advNode5 { Node emptyList = null; Node newNode = new Node(); Node head = newNode; Node headAwal = head; Node cur = headAwal; void isiHead(int x){ newNode.data = x; } void tambahDepan(int x){ newNode.nextNode = new Node(); newNode.nextNode.data =x; newNode.nextNode.prevNode = newNode; } void maju(){ newNode = newNode.nextNode; } void majuCur(){ cur = cur.nextNode; } void update(int index, int isi){ if(index == 0) cur.data = isi; else if (index > 0){ for(int i=0;i<index;i++){ this.majuCur();} cur.data = isi; } } void printNode(){ Node currNode = head; System.out.print("[ ");

while (currNode != null) { if(currNode.nextNode != null) System.out.print(currNode.data+","); else System.out.print(currNode.data); currNode = currNode.nextNode; } System.out.print(" ]"); } public static void main(String[] args) { advNode5 simpul = new advNode5() ; Scanner s = new Scanner(System.in); int in,up; simpul.isiHead(1); simpul.tambahDepan(3); simpul.maju(); simpul.tambahDepan(4); simpul.maju(); simpul.tambahDepan(6); simpul.maju(); simpul.tambahDepan(7); simpul.printNode(); System.out.println(" List awal"); System.out.println("Masukkan index yg akan di update"); in = s.nextInt(); System.out.println("Masukkan nilai yang akan di masukkan"); up = s.nextInt(); simpul.update(in, up); simpul.printNode(); System.out.println(" List telah di update"); } }

Analisis Dalam program ini algoritmanya di tujukan untuk membuat list atau linked list dalam bentuk double linked list yang dinamis dan dapat di hapus elemenya dari tengah depan ataupun belakang. Dengan menggunakan class Node sebagai class awal membuat node atau simpul dari list. Selanjutnya membuat Class advNode4 sebagai program utama yang akan menjalankan algoritma ini. Method isiHead() mengisikan data yang ada pada parameternya kepada list yang pada saat itu head berada. Method tambahDepan() akan membuat Node baru setelah posisi newNode dan akan di isi dengan data yang di masukkan pada parameter method ini. Lalu memberikan link baliknya berupa newNode.nextNode.prevNode = newNode agar ada link balik yang kembali menuju ke newNode sesuai konsep double linked list. Method majuCur() akan membuat node cur maju satu list pada urutan list. Method update() akan mengubah nilai sesuai index list dan data yang di masukkan sesuai keinginan user. Cara kerjanya dengan melakukan perubahan data jika cur == 0 maka head.data akan di isi dengan nilai data yang di masukkan di parameter. Namun, jika cur > 0 maka akan melakukan perulangan sebanyak index-1 dan memanggil method majuCur() sehingga cur berjalan sesuai index yang di inginkan user. Ketika sudah sampai pada index yang di inginkan lalu cur.data di isikan data yang di inputkan user pada parameter. Method maju() berfungsi untuk memajukan newNode() ke node berikutnya pada list. Method printNode() yang akan menampilkan nilai dari list list yang sudah ada, menggunakan kondisi perulangan dimana currNode akan terus berjalan dan mencetak isi list selama isi list tidak null. Lalu pada main program hanya tinggal membuat objek dan mengakses method method yang sudah di buat tadi hingga menghasilkan seperti yang ada di print screen dan permintaan soal.

VIII. KESIMPULAN

Linked list bersifat dinamis,yaitu kita tidak perlu untuk mendefinisikan besar linked list, sedangkan dalam array kita harus mendefinisikan besarnya array terlebih dahulu karena array memiliki sifat statis. Pada setiap node Single linked list memiliki field nilai dan field next yang berupa pointer ke node selanjutnya. Dan pada double linked list yang selain field nilai dan field next, terdapat field prev yang berupa pointer ke node selanjutnya.

Anda mungkin juga menyukai