Algoritma dan Penjelasan SLLNC - nblognlife

Algoritma dan Penjelasan SLLNC

Berikut adalah algoritma dan penjelasan SLLNC dari postingan Single Linked List pada C++.

     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.


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.

     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