Anda di halaman 1dari 16

LAPORAN PRAKTIKUM

ALGORITMA DAN STRUKTUR DATA


LINKED LIST

Kathryn Felicia
21/493256/PA/21171
10 Maret 2023

LABORATORIUM ELEKTRONIKA DASAR


DAN LABORATORIUM INSTRUMENTASI DASAR
DEPARTEMEN ILMU KOMPUTER DAN ELEKTRONIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS GADJAH MADA
YOGYAKARTA

2023
I. TUJUAN PRAKTIKUM
1.1. Mempelajari teknik perancangan linked list.
1.2. Memahami penyisipan data dalam linked list.
1.3. Memahami penghapusan data dalam linked list.
II. METODE
2.1. Buatlah program untuk menyisipkan node dalam sebuah linked list:
a. Dengan penyisipan depan
b. Dengan penyisipan akhir
c. Dengan penyisipan tengah
2.2. Buatlah program untuk melakukan penghapusan suatu node dalam linked list:
a. berdasarkan nilai tertentu
b. berdasarkan lokasi node yang diinginkan
2.3. Kembangkan sebuah fungsi untuk mencari lokasi node dari sebuah nilai.
2.4. Kembangkan sebuah fungsi untuk membalik urutan dari sebuah linked list.
2.5. Kembangkan sebuah fungsi untuk menghapus seluruh node dalam sebuah linked
list yang memiliki nilai pada jangkauan tertentu sesuai yang diinginkan.

Pada praktikum ini, saya menggunakan aplikasi C++ sebagai teks editor dan
compiler. Pertama, saya memasukkan library iostream pada header file. Lalu, saya
mendeklarasikan class untuk variabel node dan class untuk beberapa method linked
list. Class ini harus memiliki method-method yang diminta oleh soal Latihan, yaitu
penyisipan, penghapusan, pencarian, dan reverse. Untuk menyediakan method-
method tersebut, kita harus membuat beberapa variabel, yang kita sebut atribut.
Setelah membuat class, kita dapat mendeklarasikan objek tersebut di program main
dan menggunakan method-method tersebut untuk mendapatkan hasil yang
diinginkan.
Lalu dalam fungsi int main, kita panggil fungsi void dalam class linked list dan
menampilkan angka masukan dari constructor.
III. HASIL
3.1.Buatlah program untuk menyisipkan node dalam sebuah linked list:
a. Dengan penyisipan depan
b. Dengan penyisipan akhir
c. Dengan penyisipan tengah
3.2. Buatlah program untuk melakukan penghapusan suatu node dalam linked list:
a. berdasarkan nilai tertentu
b. berdasarkan lokasi node yang diinginkan
3.3. Kembangkan sebuah fungsi untuk mencari lokasi node dari sebuah nilai.
3.4. Kembangkan sebuah fungsi untuk membalik urutan dari sebuah linked list.
3.5. Kembangkan sebuah fungsi untuk menghapus seluruh node dalam sebuah linked
list yang memiliki nilai pada jangkauan tertentu sesuai yang diinginkan.
Source Code :
#include <iostream>
using namespace std;

class Node{
public :
int value;
Node* next;
};

class linkedList : public Node{


public :
Node* head;
linkedList(){
head = NULL;
}

void display(){
Node* temp = head;
cout<<" ";
while(temp != NULL){
cout<<"["<<temp->value<<"] ";
temp = temp->next;
};
}

Node* sisipTengahAssistant(int position){


Node* temp = head;
for(int i = 2; i < position; i++){
temp = temp->next;
}
return temp;
}

//1a. Dengan penyisipan depan


void sisipDepan(int newVal){
Node* newNode = new Node();
newNode->value = newVal;
newNode->next = head;
head = newNode;
}

//1b. Dengan penyisipan akhir


void sisipAkhir(int newVal){
Node* newNode = new Node();
newNode->value = newVal;
newNode->next = NULL;
if(head == NULL){
head = newNode;
return;
}
Node* last = head;
while(last->next != NULL){
last = last->next;
}
last->next = newNode;
}

//1c. Dengan penyisipan tengah


void sisipTengah(Node* prev, int newVal){
if(prev == NULL){
cout<<"Node sebelumnya kosong!"<<endl;
return;
}
Node* newNode = new Node();
newNode->value = newVal;
newNode->next = prev->next;
prev->next = newNode;
}

//2a. Berdasarkan nilai tertentu


void hapusDariNilai(int val){
Node* count = head;
int count_node = 0;
while(count != NULL){
count = count->next;
count_node++;
}
delete count;
Node* temp = head;
int posisi = 1;
while(temp != NULL){
if(temp->value == val){
hapusDariPosisi(posisi);
break;
}
else if(posisi == count_node && temp->value != val){
cout<<"Nilai "<<val<<" tidak ada"<<endl;
break;
}
else{
temp = temp->next;
posisi++;
}
}
}

//2b. Berdasarkan lokasi node yang diinginkan


void hapusDepan(){
Node* temp = head;
head = head->next;
delete temp;
}

void hapusAkhir(){
Node* temp = head;
while(temp->next->next != NULL){
temp = temp->next;
}
temp->next = NULL;
}

void hapusTengah(int posisi){


Node* temp = head;
for(int i = 2; i < posisi; i++){
if(temp->next != NULL){
temp = temp->next;
}
}
temp->next = temp->next->next;
}

void hapusDariPosisi(int posisi){


switch(posisi){
case 1 :
hapusDepan();
break;
case 2 :
hapusAkhir();
break;
default :
hapusTengah(posisi);
break;
}
}

//3. Mencari lokasi node dari sebuah nilai


void cariDariNilai(int val){
int posisi = 1;
Node* count = head;
int count_node = 0;
while(count != NULL){
count = count->next;
count_node++;
}
delete count;
Node* temp = head;
while(temp != NULL){
if(temp->value == val){
cout<<" Nilai "<<val<<" ditemukan di node ke
"<<posisi<<endl;
cout<<" Address : "<<temp<<endl;
break;
}
else if(posisi == count_node && temp->value != val){
cout<<"Nilai "<<val<<" tidak ada"<<endl;
break;
}
else{
temp = temp->next;
posisi++;
}
}
}

//4. Membalik urutan dari sebuah linked list.


void balik(){
Node* current = head;
Node *previ = NULL, *next = NULL;
while(current != NULL){
next = current->next;
current->next = previ;
previ = current;
current = next;
}
head = previ;
}

//5. Menghapus seluruh node dalam sebuah linked list yang memiliki nilai pada
jangkauan tertentu sesuai yang diinginkan
void hapusDariRangeNilai(int begin, int end){
int size = end - begin + 1;
int val[size];
for(int i = 0; i < size; i++){
val[i] = begin + 1;
}
Node* count = head;
int count_node = 0;
while(count != NULL){
count = count->next;
count_node++;
}
delete count;
for(int i = 0; i < size; i++){
Node* temp = head;
int posisi = 1;
while(temp != NULL){
if(temp->value = val[i]){
hapusDariPosisi(posisi);
break;
}
else if(posisi == count_node && temp->value != val[i]){
cout<<"Nilai "<<val<<" tidak ada"<<endl;
break;
}
else{
temp = temp->next;
posisi++;
}
}
}
}
};

int main() {
linkedList list;

//No. 1
cout<<"No. 1 - Penyisipan"<<endl;
cout<<" a. Penyisipan Depan (7,1,6): "<<endl;
list.sisipDepan(7);
list.sisipDepan(1);
list.display();
cout<<endl;
cout<<" b. Penyisipan Akhir (2,3,9): "<<endl;
list.sisipAkhir(2);
list.sisipAkhir(9);
list.sisipAkhir(3);
list.display();
cout<<endl;
cout<<" c. Penyisipan Tengah (4,5) : "<<endl;
list.sisipTengah(list.head, 5);
list.sisipTengah(list.head, 4);
list.display();
cout<<endl<<endl;

//No. 2
cout<<"No. 2 - Penghapusan"<<endl;
cout<<" a. Berdasarkan nilai tertentu (5) : "<<endl;
list.hapusDariNilai(5);
list.display();
cout<<endl;
cout<<" b. Berdasarkan lokasi node yang diinginkan (1) : "<<endl;
list.hapusDariPosisi(1);
list.display();
cout<<endl<<endl;

//No. 3
cout<<"No. 3 - Pencarian"<<endl;
cout<<" Mencari nilai (9) : "<<endl;
list.cariDariNilai(9);
list.display();
cout<<endl<<endl;

//No. 4
cout<<"No. 4 - Membalik urutan linked list"<<endl;
list.balik();
cout<<" Menampilkan urutan yang dibalik : "<<endl;
list.display();
cout<<endl<<endl;

//No.5
cout<<"No. 5 - Menghapus seluruh node dalam jangkauan nilai
tertentu"<<endl;
cout<<" Menghapus node dengan jangkauan nilai (1,3) :"<<endl;
list.hapusDariRangeNilai(1, 3);
list.display();
return 0;
}

Output :
IV. PEMBAHASAN
Praktikum pertemuan kedua ini dilanjut dengan membahas topik pembelajaran
yaitu Linkedlist. Praktikum kali ini bertujuan untuk mengenalkan mahasiswa Linked
list dalam Bahasa pemrograman C++. Adapun terdapat Latihan dan pengujian terhadap
materi pembelajaran kali ini. Pertama kita
Tugas pertama, kita perlu menulis fungsi dari tiga jenis penyisipan. Penyisipan depan
berarti menambahkan node baru sebelum node pertama yang ditunjuk sebagai head.
Fungsi ini hanya membutuhkan nilai/value sebagai argumennnya karena kita perlu
memasukkannya ke dalam data node yang baru. Dilakukan dengan membuat sebuah
node. Terdapat atribut next pada newNode yang berfungsi menunjuk node newVal
sebelumnya. Ada juga atribut next yang berfungsi untuk menunjuk NULL Penyisipan
tengah berarti menambahkan node baru setelah node yang kita ambil sebagai salah satu
argumen, argumen lainnya adalah nilai/value. Karena membutuhkan tipe data node
sebagai argumen, saya membuat fungsi baru bernama sisipTengahAssistant() yang
akan mengonversi posisi yang diinginkan di integer menjadi sebuah node, itu sebabnya
tipe datanya adalah Node karena saya membutuhkannya untuk mengembalikan sebuah
node. Penyisipan akhir berarti menambahkan node baru ke node terakhir, fungsi hanya
membutuhkan nilai/value sebagai argumen.
Untuk nomor 2, kita perlu menulis fungsi dari dua jenis penghapusan, yaitu
penghapusan berdasarkan nilai dan posisi. Tetapi untuk menghapus berdasarkan posisi,
saya membutuhkan dua fungsi lainnya. Penghapusan di depan berarti memindahkan
head ke node kedua, dan kemudian menghapus temp, yang merupakan head
sebelumnya. Fungsi ini tidak memerlukan argumen apa pun. Penghapusan di tengah
berarti menghapus nilai berdasarkan posisinya, terkecuali bagian depan. Argumen
untuk fungsi ini adalah posisi dalam integer. Untuk menghapus berdasarkan nilai, kita
harus menemukan nilainya terlebih dahulu dan kemudian menghapusnya dengan delete
dengan fungsi posisi.
Untuk nomor 3, cari berdasarkan nilai, saya memindahkan posisi dari node
pertama hingga mencapai node terakhir, terdapat variabel posisi yang akan bertambah
setiap kali node pindah ke node berikutnya, dan kemudian ketika nilainya ditemukan,
fungsi akan mencetak posisi beserta alamatnya. Pencarian lokasi berdasarkan parameter
urutan dilakukan menggunakan perulangan while dengan syarat nomor yang dicari
tidak sama dengan atribut nilai node. Jika tidak ditentukan, pindah ke node sebelumnya
dan jika sampai node akhir tidak ditemukan, lakukan penghentian dan beritahu user
bahwa nomor tidak ada. Jika ditemukan, beritahu lokasi tempat node tersebut.
Algoritma untuk nomor 4, pada dasarnya kita mengubah elemen saat ini
menjadi elemen sebelumnya dan head perlahan berubah dari menunjuk node pertama
sampai akhirnya menunjuk node terakhir. dilakukan dengan membuat 3 node baru,
yaitu current, after, dan before. Current diberi nilai first dan lakukan perulangan while
dengan syarat current tidak sama dengan NULL. Di awal perulang, buat nilai last
menjadi first. Kemudian, di dalam perulangan, ubah nilai last menjadi first. Kemudian,
di dalam perulangan, ubah nilai Node after menjadi node setelah current, nilai atribut
next milik current menunjuk before, dan atribut prev menunjuk after. Setelah itu,
pindahkan nilai before menjadi current dan current menjadi after. Setelah keluar dari
perulangan, ubah nilai first menjadi before.
Untuk nomor 5, hapus nilai berdasarkan rentang, saya anggap ini mirip dengan
menghapus berdasarkan nilai, yang berbeda adalah kita harus membuat array yang
terdiri dari nilai yang akan dicari kemudian dihapus.
V. KESIMPULAN
Adapun kesimpulan yang dapat diambil dari serangkaian kegiatan praktikum algoritma
dan struktur data pada pertemuan ini adalah :
5.1. Linked list dapat kita gunakan dengan memanfaatkan struk node yang berisi
variabel nilai ataupun mengunuk node lain.
5.2. Terdapat fungsi atau method yang dapat digunakan dalam linked list dan
penggunaan pointer dalam mengantar alamat node yang dituju.
5.3.Dalam membuat linked list, diperlukan class untuk menyimpan node dan
sebuah class linkedList yang berisi method-method yang akan menjalankan
tugas-tugas yang diminta pada soal.
5.4. Terdapat tiga cara menyisipkan data pada linked list, yaitu penyisipan di awal,
penyisipan di tengah, dan penyisipan di akhir.
5.5.Terdapat tiga cara menghapus data dalam linked list, yaitu penghapusan node
berdasarkan nilai, penghapusan node berdasarkan lokasi, dan penghapusan
seluruh node.

VI. DAFTAR PUSTAKA

Aruming Tyah, D., 2022. Modul Praktikum Algoritma Struktur Data [Daring]

Daan Czajkowski and Qiang Chew Jew (2016). Object oriented programming in
C++. New York: Arcler Press.

Isrd Group (2007). Introduction to object oriented programming and C++. New
Delhi: Tatamcgraw Hill.

Anda mungkin juga menyukai