Algoritma dan Penjelasan SLLNC
By
Rachmat Santoso
—
Kamis, 19 April 2018
—
Struktur Data
Seperti
yang kita tahu, fungsi main() adalah fungsi yang akan dijalankan terlebih
dahulu. Seperti terlihat pada kode program, pada fungsi main() terdapat
perintah untuk memanggil fungsi inisialisasi() terlebih dahulu, yang di
dalamnya terdapat kode sebagai berikut:
head = NULL;
tail = NULL;
, kedua baris tersebut adalah pemberian nilai
awal pada HEAD dan TAIL berupa NULL. Pemberian nilai berupa NULL ini secara
tidak langsung menyatakan bahwa belum ada HEAD dan TAIL. Dengan kata lain linked
list masih kosong atau belum terbentuk.
Selanjutnya,
Fungsi main akan memanggil fungsi menu() yang akan menampilkan menu pilihan ke
layar monitor. Pada fungsi menu() terdapat empat pilihan, diantaranya Input
data, Hapus data, Cetak data, dan Exit yang dapat dipilih sesuai keinginan
user.
Saya
akan membahas setiap fungsi utama yang ada dalam program. Namun sebelum itu, perlu
saya beritahukan bahwa pada program SLLNC
ini penambahan node baru akan diletakkan paling belakang, sedangkan penghapusan
node dilakukan pada node paling depan.
Berikut pembahasan fungsi-fungsi utama yang
ada dalam program :
INPUT
DATA
1. Ketika
user memilih Input data maka case ‘1’ yang berada di dalam switch akan
dijalankan;
2. Pada
blok case ‘1’ user akan diminta memasukan data berupa angka, dimana angka
tersebut akan digunakan sebagai argumen untuk memanggil fungsi input();
*Pada contoh program, saya menggunakan
2,3,4,5,6 sebagai input.
3. Ketika user memilih input data dan
memasukkan angka 2, maka fungsi input() akan dipanggil
dengan argumen fungsi berupa angka 2 >> input(2). Sekarang masuk pada fungsi input()
Berikut penjelasan kode yang ada di
dalam fungsi input():
Pertama,
entry = (node* )malloc(sizeof(node));
Kode di atas digunakan untuk alokasi
memori baru yang ukurannya sebesar struct node. Setelah kode tersebut
dieksekusi maka akan terbentuk node
entry kosong seperti gambar di bawah ini.
Selanjutnya,
entry->data = dt;
entry->next = NULL;
Kode di atas digunakan untuk memberikan
nilai pada variabel data dan variabel next. Variabel data pada node
entry akan diberikan nilai sebesar “dt”, dimana dt adalah argumen yang
digunakan untuk memanggil fungsi input() yaitu 2. Sedangkan variabel
next pada node entry di isi atau menunjuk ke NULL.
Sekarang node yang awalnya kosong tadi
sudah terisi, seperti gambar di bawah ini.
Next,
if(head==NULL)
{
head = entry;
tail = head;
}
else
{
tail->next = entry;
tail = entry;
}
Masuk pada operasi kondisi. Karena di
sini head masih benilai NULL seperti inisialisasi awal maka kode yang
dijalankan adalah kode yang berada di dalam IF, yaitu head= entry, tail=head. Kedua
kode di atas untuk menempatkan posisi head dan tail pada posisi yang sama
dengan posisi node entry yang baru dibuat.
Karena node entry ini adalah node yang pertama yang dibuat maka node
entry ini akan menjadi head sekaligus tail dari linked list. Setelah kedua
kode tersebut dieksekusi maka hasilnya seperti yang terlihat pada gambar di
bawah ini.
4. Selanjutnya, ketika user memilih input
data dan memasukkan angka 3, maka fungsi input akan
dipanggil dengan argumen fungsi berupa angka 3 >> input(3). Sekarang masuk pada fungsi input() LAGI.
Kode berikut akan dijalankan:
entry = (node* )malloc(sizeof(node));
entry->data = dt;
entry->next = NULL;
, maka hasilnya adalah node entry baru
seperti gambar di bawah ini.
*Penjelasan dan alurnya sama dengan sebelumnya, jadi saya skip agar
postingan tidak terlalu panjang :)
Node baru telah selesai dibuat.
INGAT! Jadi sekarang kita sudah
mempunyai 2 node namun belum tersambung. Berikut kedua node yang telah
dibuat.
Selanjutnya, masuk pada operasi kondisi.
if(head==NULL)
{
head = entry;
tail = head;
}
else
{
tail->next = entry;
tail =
entry;
}
Perhatikan! Karena sekarang head tidak lagi bernilai NULL, melainkan
nilainya sama dengan node yang pertama maka kondisi pada IF tidak terpenuhi,
sehingga kode yang dijalankan adalah
kode yang berada di dalam blok ELSE, yaitu
tail->next = entry;
tail
= entry;
*INGAT
baik-baik ya, entry yang dimaksudkan di sini adalah node entry yang BARU
dibuat
Sambil perhatikan gambar sebelumnya!
tail->next = entry; artinya
tail->next akan menunjuk (menyambungkan) ke node entry yg baru dibuat.
INGAT! Posisi tail sekarang masih berada pada node pertama, jadi ini sama saja
dengan menyambungkan node pertama dengan node kedua. Sekarang kedua node
yang telah kita buat telah tersambung seperti terlihat pada gambar di bawah
ini.
tail = entry; kode
ini digunakan untuk memindah posisi tail ke posisi node entry yang baru dibuat.
Ketika kode ini dijalankan hasilnya akan seperti di bawah ini.
5. Input angka 4, 5, 6
Untuk penjelasannya sama dengan langkah ke-4. Dan setiap kali ada node
baru ditambahkan maka posisi TAIL akan dipindahkan ke posisi node yang baru dibuat sehingga sesuai dengan namanya tail
selalu terletak pada node terakhir (paling belakang). Berikut adalah tampilan
single linked list non circular jika semua node telah selesai ditambahkan.
Catatan:
Tulisan
“entry” pada gambar sengaja saya hilangkan agar tidak membingungkan, karena
pada dasarnya setiap node adalah node entry
HAPUS
DATA
Sebelumnya,
saya tampilkan lagi SLLNC yang telah dibuat.
1. Ketika
user memilih Hapus data maka case ‘2’ yang berada di dalam switch akan
dijalankan, fungsi hapus() dipanggil;
2. Sekarang
masuk pada fungsi hapus();
Berikut penjelasan kode yang ada di
dalam fungsi hapus():
Pertama,
int simpan;
varibel ini akan digunakan untuk menyimpan nilai data suatu
node sebelum node tersebut dihapus, untuk nantinya nilai ditampilkan ke layar
monitor user sebagai informasi bahwa node yang mempunyai data nilai X telah
dihapus dari linked list.
Selanjutnya,
masuk pada operasi kondisi.
if(head==NULL)
{
cout<<"\nlinked list kosong, penghapusan tidak bisa dilakukan"<<endl;
}
else
{
simpan = head ->data;
//hapus depan
del = head;
head = head->next;
delete del;
cout<<"\ndata yang
dihapus adalah "<<simpan<<endl;
}
Perhatikan kode di atas! Karena di sini head tidak lagi bernilai NULL
(sudah ada node terbentuk yang menjadi head) maka kode pada blok ELSE yang
dieksekusi. Berikut adalah penjelasan baris kode yang terdapat pada blok ELSE.
simpan =
head ->data; , kode ini digunakan untuk menyimpan nilai
data node head ke variabel ‘simpan’. Karena nilai data node HEAD adalah 2 maka
variabel simpan sekarang bernilai 2. *Lihat
gambar sebelumnya!
del = head; , kode ini digunakan untuk meletakkan
posisi node DEL pada posisi yang sama dengan node HEAD. Hasilnya seperti gambar
di bawah ini.
head =
head->next; kode ini digunakan untuk memindahkan
posisi HEAD yang sekarang ke head->next, dimana head->next adalah node
setelah head saat ini. Jika melihat gambar di atas ini artinya node head
dipindah ke node yang memiliki data bernilai 3. Hasilnya seperti gambar di
bawah ini.
delete del;
Ketika posisi HEAD telah dipindahkan
sekarang saatnya melakukan penghapusan node dengan keyword delele (=keyword
untuk melakukan dealokasi memori). Saat kode tersebut dieksekusi maka node DEL akan
dihapus.
*Baca
kembali postingan Alokasi dan Dealokasi Memori Dinamis pada C++
cout<<"\ndata yang dihapus adalah "<<simpan<<endl; , kode ini digunakan
untuk menampilkan string ke layar sebagai informasi untuk user bahwa node telah
berhasil dihapus.
Setelah serangkaian proses penghapusan node tadi, sekarang single linked
list non circular yang telah kita buat sebelumnya menjadi seperti gambar di
bawah ini.
CETAK
DATA
1. Ketika
user memilih Cetak data maka case ‘3’ yang berada di dalam switch akan
dijalankan, fungsi cetak() dipanggil;
2. Sekarang
masuk pada fungsi cetak();
Berikut penjelasan kode yang ada di
dalam fungsi cetak():
Pertama,
curr = head;
, kode tersebut digunakan untuk meletakkan
posisi node CURR pada posisi yang sama dengan node HEAD. Curr sendiri
adalah node penunjuk yang akan kita gunakan untuk mengunjungi setiap node yang
ada pada linked list yang kita buat. Jika kode di atas dieksekusi, maka
hasilnya seperti gambar di bawah ini.
Selanjutnya, masuk pada operasi kondisi.
if(head == NULL)
cout<<"\ntidak ada data dalam linked list"<<endl;
else
{
cout<<"\nData yang ada dalam linked list adalah"<<endl;
cout<<setw(6);
while(curr!=NULL)
{
cout<<curr->data<<"->";
curr = curr->next;
}
cout<<"NULL";
cout<<endl;
}
Pada operasi kondisi di atas akan
dicek nilai HEAD, karena di sini HEAD tidak bernilai NULL (artinya sudah ada
data dalam linked list atau linked list sudah terbentuk), maka kode pada blok
ELSE yang dijalanan.
Pada blok ELSE saya akan menjelaskan
bagian terpentingnya, yaitu perulangan WHILE. Sebelum masuk ke kode, akan saya
sampaikan algoritma mencetak data terlebih dahulu.
“Pada awalnya CURR akan diletakkan pada
posisi awal linked list (*yaitu pada node HEAD). Selanjutnya CURR akan mencetak
data pada setiap node dimana CURR berada. Setelah itu, posisi CURR akan akan
dipindah ke node selanjutnya untuk melakukan pencetakan data lagi. Begitu seterusnya
sampai curr menemui NULL, ini artinya CURR sudah tidak berada pada node dan
juga berarti bahwa sudah tidak ada lagi node selanjutnya.”
Sekarang masuk pada kode dan pembahasan. Berikut
adalah penjelasan kode perulangan WHILE yang digunakan pada fungsi cetak():
while(curr!=NULL)
{
cout<<curr->data<<"->";
curr = curr->next;
}
Kode pada blok WHILE akan dieksekusi ketika
CURR tidak sama dengan NULL, artinya akan terus diulang sampai akhir dari
linked list (artinya CURR telah berada pada posissi NULL).
Saya
tampilkan kembali SLLNC yang kita miliki SEKARANG setelah proses penghapusan
node
Perulangan pertama,
Perhatikan gambar! Karena posisi CURR
sedang berada pada node pertama maka kondisi “curr != NULL” adalah BENAR,
sehingga kode di dalam blok IF dijalankan/dieksekusi. Selanjutnya data pada
node CURR akan ditampilkan ke layar
melalui perintah cout<<curr->data<<"->";.
Sehingga angka 3 ditampilkan di layar.
BERIKUTNYA,
posisi CURR akan dipindahkan ke node selanjutnya dengan menggunakan perintah
curr = curr->next; ,
dimana “curr->next” adalah node setelah node CURR saat ini. Jadi
setelah kode tersebut dieksekusi maka posisi CURR akan berpindah ke node
selanjutnya, yaitu node yang memiliki data bernilai 4. Perhatikan gambar di bawah ini! Posisi curr sekarang telah berubah.
Perulangan kedua,
Setelah semua kode pada blok perulangan WHILE selesai dieksekusi maka akan dilakukan
pengecekan kembali terhadap kondisi perulangan WHILE, untuk mengetahui apakah
kondisi masih memenuhi atau tidak untuk dilakukan perulangan kembali.
*Baca kembali postingan saya C++ - Perulangan for, while, do-while, continue, dan break
Perhatikan gambar sebelumnya! Karena CURR sekarang
berada diposisi node yang memiliki data 4 maka artinya CURR tidak sama
dengan NULL (kondisi terpenuhi/bernilai
benar). Karena kondisi perulangan terpenuhi maka blok kode dalam perulangan
WHILE dijalankan LAGI.
Pertama,
cout<<curr->data<<"->"; , akan mencetak data dari node yang “sedang
dikunjungi” oleh CURR. Seperti yang terlihat pada gambar di atas, CURR saat ini
berada pada node yang memiliki data bernilai 4. Maka
ketika kode ini dieksekusi akan menampilkan angka 4 di layar.
Selanjutnya,
curr
= curr->next; ,
memindahkan posisi CURR ke posisi node selanjutnya untuk tujuan mencetak data
pada node tersebut.
Berikut adalah hasil pemindahan posisi
CURR, sehingga saat ini CURR telah berada pada node yang memiliki data bernilai
5, seperti terlihat pada gambar di bawah ini.
Begitu seterusnya perulangan akan
dijalankan untuk menampilkan data node 5 dan 6. Perulangan akan dihentikan
ketika posisi CURR yang terus dipindakan telah menempati/ berada pada posisi
NULL.
Demikian algoritma pencetakan data pada
node. Jadi intinya kita memanfaatkan node bantu CURR, untuk mengunjungi setiap
node dan mencetak data yang berada pada node tersebut.
KELUAR
Ketika
user memilih Keluar maka case ‘4’ yang berada di dalam switch akan dijalankan,
fungsi bawaan exit() dipanggil, selanjutnya program diakhiri.
Tambahan:
Setiap
kali fungsi Input, Hapus, dan Cetak selesai dieksekusi maka program akan
menampilkan pertanyaan “Kembali ke menu? (y/n)”. Jika user memilih ‘y’ maka
teks menu pillihan akan ditampilkan kembali di layar, sedangkan jika user
memilih ‘n’ maka keluar dari perulangan dan mengakhhiri program.
Demikian
algoritma dan penjelasan setiap fungsi pada program SLLNC di postingan Single Linked List pada C++. Semoga penjelasan saya
dengan dilengkapi gambar dapat membantu memahami materi ini. Apabila ada kalimat/kata
yang ambigu sampaikan melalui kolom komentar agar bisa segera saya perbaiki. Terima
kasih :)
[RS]
Klik Like & Share jika postingan ini bermanfaat
Apa tanggapan Anda?
Berikan tanggapan Anda melalui kolom komentar yang telah disediakan.
- Gunakan bahasa yang sopan;
- Saat menjadikan postingan pada blog ini sebagai referensi, jangan lupa mencantumkan sumbernya (link dari blog ini).
Jika blog ini bermanfaat jangan lupa memberikan 'like' atau 'share' untuk mendapatkan update terbaru.
Terima kasih