Linked List #2: Single Linked List
Apr 29, 2022Single Linked List
Single Linked List ini merupakan salah satu jenis Linked List yang dimana elemen nodenya terdapat 2 bagian, ada bagian untuk menyimpan data dan bagian pointer untuk menyimpan alamat dari node selanjutnya yang biasanya diberi nama variabel next
. Pada node terakhir untuk bagian menyimpan alamat akan bernilai NULL
Pada tutorial ini dan kedepannya, kita akan menggunakan C++ untuk penerapan Linked List ini, mungkin untuk penulisan pada bahasa pemrograman lain akan berbeda namun konsepnya pasti sama saja kok 😉
Pembuatan Node
#include <iostream>
using namespace std;
// Membuat node menggunakan struct
struct Node{
int data;
Node *next;
};
int main(){
// Pointer untuk menyimpan alamat node pertama
Node *HEAD = NULL;
return 0;
}
Penjelasan
struct Node : Kita membuat node menggunakan struct, yaitu keyword yang berfungsi untuk mengelompokan kumpulan variabel kedalam 1 nama. Di atas kita mengelompokan variabelnya kedalam struct yang bernama Node.
Node *next : artinya kita membuat variabel pointer yang bisa menyimpan alamat yang bertipe data struct Node.
Node *HEAD : Berfungsi untuk menyimpan alamat dari Node pertama, saat deklarasi kita berikan nilai
NULL
karena anggapannya linked list nya masih kosong.
Membuat menu pilihan
Karena akan ada beberapa fitur yang akan kita terapkan, jadi kita buatkan menunya dulu untuk tiap fitur.
#include <iostream>
using namespace std;
// Membuat node menggunakan struct
struct Node{
int data;
Node *next;
};
int main(){
// Pointer untuk menyimpan alamat node pertama
Node *HEAD = NULL;
int menu;
while (menu != 9){
cout << "======= MENU =======" << endl;
cout << "1. Tambah data" << endl;
cout << "2. Ubah data" << endl;
cout << "3. Hapus data" << endl;
cout << "4. Tampil data" << endl;
cout << "9. Exit program" << endl;
cout << "Masukan pilihan : ";
cin >> menu;
switch (menu){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 9:
continue;
default:
cout << "Pilihan tidak ada" << endl;
}
}
return 0;
}
Menambahkan dan menampilkan pada Linked List
Sekarang kita coba buat fitur tambah data dan menampilkan data.
void displayData(Node *head){
Node *temp = head;
if (temp == NULL){
cout << "LinkedList masih kosong" << endl;
return;
}
// Traversal sampai node terakhir
while (temp != NULL){
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
void tambahData(Node **head){
// Membuat node baru
Node *nodeBaru = new Node();
cout << "Masukan angka : ";
cin >> nodeBaru->data;
nodeBaru->next = NULL;
// Jika linked list kosong, ditambahkan ke node awal
if (*head == NULL){
(*head) = nodeBaru;
return;
}
Node *temp = (*head);
// Traversal ke Node terakhir
while (temp->next != NULL){
temp = temp->next;
}
// Menambahkan Node baru ke bagian alamat Node terakhir
temp->next = nodeBaru;
}
Penjelasan
- Fungsi displayData(Node *head) : pada parameternya kenapa
Node *head
bertujuan untukmenyimpan alamat yang disimpan dari pointer HEAD
yang ada di fungsi utama. Jadi ketika memanggil fungsi displayData argumen yang kita masukan adalahdisplayData(HEAD)
- Fungsi tambahData(Node **head) : pada parameternya kenapa
Node **head
bertujuan untukmenyimpan alamat dari pointer HEAD
yang ada di fungsi utama. Jadi ketika memanggil fungsi displayData argumen yang kita masukan adalahtambahData(&HEAD)
- Node *temp = *head : bertujuan sebagai variabel sementara untuk menyimpan alamat node pertama, karena juga kita menggunakan variabel *head langsung, nanti akan rusak data linked listnya.
- temp = temp->next : bertujuan untuk mengunjungi node selanjutnya
- return; : bertujuan untuk menghentikan fungsinya, jadi source code yang dibawah return tidak akan dijalankan lagi
Mengubah dan menghapus data pada Linked List
void ubahData(Node **head){
if (*head == NULL){
cout << "LinkedList masih kosong" << endl;
return;
}
int ubah;
cout << "Masukan data yang akan diubah : ";
cin >> ubah;
Node *temp = (*head);
while (temp != NULL){
if (temp->data == ubah) {
cout << "Masukan data yang baru : ";
cin >> temp->data;
cout << "Data berhasil diubah" << endl;
return;
}
temp = temp->next;
}
cout << "Data tidak ditemukan" << endl;
}
void hapusData(Node **head){
if (*head == NULL){
cout << "LinkedList masih kosong" << endl;
return;
}
if ((*head)->next == NULL){
*head = NULL;
cout << "Node berhasil dihapus" << endl;
return;
}
Node *temp = (*head);
// Traversal menuju ke node sebelum node terakhir.
while (temp->next->next != NULL){
temp = temp->next;
}
// Memutuskan node terakhir
temp->next = NULL;
cout << "Node berhasil dihapus" << endl;
}
Penjelasan
- temp->next->next : bertujuan untuk mengakses 2 node berikutnya, contoh ketika temp berada di node ke-1 maka artinya kita sedang mengakses node ke-3.
Full source code
Maka full file nya akan seperti ini.
#include<iostream>
using namespace std;
struct Node{
int data;
struct Node *next;
};
void displayData(Node *head){
Node *temp = head;
if (temp == NULL){
cout << "LinkedList masih kosong" << endl;
return;
}
// Traversal sampai node terakhir
while (temp != NULL){
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
void tambahData(Node **head){
// Membuat node baru
Node *nodeBaru = new Node();
cout << "Masukan angka : ";
cin >> nodeBaru->data;
nodeBaru->next = NULL;
// Jika linked list kosong, ditambahkan ke node awal
if (*head == NULL){
(*head) = nodeBaru;
return;
}
Node *temp = (*head);
// Traversal ke Node terakhir
while (temp->next != NULL){
temp = temp->next;
}
// Menambahkan Node baru ke bagian alamat Node terakhir
temp->next = nodeBaru;
}
void ubahData(Node **head){
if (*head == NULL){
cout << "LinkedList masih kosong" << endl;
return;
}
int ubah;
cout << "Masukan data yang akan diubah : ";
cin >> ubah;
Node *temp = (*head);
while (temp != NULL){
if (temp->data == ubah) {
cout << "Masukan data yang baru : ";
cin >> temp->data;
cout << "Data berhasil diubah" << endl;
return;
}
temp = temp->next;
}
cout << "Data tidak ditemukan" << endl;
}
void hapusData(Node **head){
if (*head == NULL){
cout << "LinkedList masih kosong" << endl;
return;
}
if ((*head)->next == NULL){
*head = NULL;
cout << "Node berhasil dihapus" << endl;
return;
}
Node *temp = (*head);
// Traversal menuju ke node sebelum node terakhir.
while (temp->next->next != NULL){
temp = temp->next;
}
// Memutuskan node terakhir
temp->next = NULL;
cout << "Node berhasil dihapus" << endl;
}
int main(){
struct Node *HEAD = NULL;
int menu;
while (menu != 9){
cout << "==== MENU ====" << endl;
cout << "1. Tambah data" << endl;
cout << "2. Ubah data" << endl;
cout << "3. Hapus data" << endl;
cout << "4. Tampil data" << endl;
cout << "9. Exit program" << endl;
cout << "Masukan pilihan : ";
cin >> menu;
switch (menu){
case 1:
tambahData(&HEAD);
break;
case 2:
ubahData(&HEAD);
break;
case 3:
hapusData(&HEAD);
break;
case 4:
displayData(HEAD);
break;
case 9:
continue;
default:
cout << "Pilihan tidak ada" << endl;
}
}
return 0;
}