Linked List #2: Single Linked List

Apr 29, 2022
thumbnail

Single 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

node

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

main.cpp
Copy ke clipboard
#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.

main.cpp
Copy ke clipboard
#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.

main.cpp
Copy ke clipboard
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 untuk menyimpan alamat yang disimpan dari pointer HEAD yang ada di fungsi utama. Jadi ketika memanggil fungsi displayData argumen yang kita masukan adalah displayData(HEAD)
  • Fungsi tambahData(Node **head) : pada parameternya kenapa Node **head bertujuan untuk menyimpan alamat dari pointer HEAD yang ada di fungsi utama. Jadi ketika memanggil fungsi displayData argumen yang kita masukan adalah tambahData(&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

main.cpp
Copy ke clipboard
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.

main.cpp
Copy ke clipboard
#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;
}

comments powered by Disqus