Circular Doubly Linked List

Struktur Data - Pertemuan 17

"Circular Doubly Linked List"

Double Linked List Circular

Circular Doubly Linked List adalah Linked List dimana link simpul terakhir bukan diisi dengan null, tetapi diisi dengan alamat simpul pertama yaitu simpul yang ditunjuk oleh pointer FIRST, sehingga menciptakan efek melingkar’ sesuai arah jarum jam.
- Pointer RIGHT simpul paling kanan berisi alamat simpul paling kiri 
- Pointer LEFT simpul paling kiri berisi alamat simpul paling kanan

Ilustrasi Double Linked List Circular


Setiap node pada linked list mempunyai field yang berisi data dan pointer ke node berikutnya & ke node sebelumnya.  Untuk pembentukan node baru , mulanya pointer next dan prev akan menunjuk ke nilai NULL. Selanjutnya pointer prev akan menunjuk ke node sebelumnya , dan pointer next akan menunjuk ke node selanjutnya pada list.

Perbedaan antara Linearly Doubly Link List dengan Circular Doubly Link List terletak pada simpul terakhir. Dengan demikian proses pada Linearly dengan Circular sama kecuali penanganan simpul terakhir.

Berikut ini adalah representasi dari circular double linked list node dalam C / C ++:



Berikut ini adalah keuntungan dan kerugian dari circular double linked list:

Keuntungan:
  • List dapat dilalui dari kedua arah yaitu dari kepala ke ekor atau dari ekor ke kepala.
  • Melompat dari kepala ke ekor atau dari ekor ke kepala dilakukan dalam waktu konstan O (1).
  • Circular Doubly Linked Lists digunakan untuk implementasi struktur data tingkat lanjut seperti Fibonacci Heap.

Kekurangan
  • Dibutuhkan sedikit memori ekstra di setiap node untuk mengakomodasi pointer sebelumnya.
  • Banyak petunjuk yang terlibat saat mengimplementasikan atau melakukan operasi pada list. Jadi, pointer harus ditangani dengan hati-hati jika tidak data dari list dapat hilang.

Program :
Buat program animasi Circular Doubly Linked List untuk mengelola data mahasiswa dengan struktur mahasiswa sbb : NAMA, NIM, GENDER, NILAI . Data terurut naik berdasarkan NIM. Program dibuat dalam bentuk menu dengan pilihan : INSERT DATA, HAPUS DATA, CETAK DATA, EXIT.
Ket :
INSER DATA : menambah data
HAPUS DATA : menghapus satu data berdasarkan kriteria NIM
CETAK DATA : mencetak seluruh isi linked list
EXIT : Keluar/selesai
Tampilan menu :
CIRCULAR DOUBLY LINKED LIST
==========================
1. INSERT DATA
2. HAPUS DATA
3. CETAK DATA
4. EXIT
Pilihan (1 – 4) :


Source Code :

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <windows.h>//mendukung format system("CLS") sebagai peganti clrscr()
using namespace std;

int pilih; void pilihan();
void insert_data();
void hapus_data();
void cetak_data();
struct node
{
 int nomorinduk;
 char nama [40];
 char gender [20];
 float nilai;
 node *prev, *next;
};
node *baru, *head=NULL, *tail=NULL,*help,*del;
main()//interface monitor
{
 do
 {
  system("cls");
  cout<<"\tLIN. DOUBLY LINKED LIST"<<endl;
  cout<<"\t=========================="<<endl;
  cout<<"\t1. INSERT DATA"<<endl;
  cout<<"\t2. HAPUS DATA"<<endl;
  cout<<"\t3. CETAK DATA"<<endl;
  cout<<"\t4. EXIT"<<endl;
  cout<<"\tPilihan (1 - 4) : ";
  cin>>pilih;
  cout<<endl<<endl;
  pilihan();
  cout<<"==============================="<<endl;
 }
 while(pilih!=4);
}
void pilihan()//fungsi "pilihan" untuk pemrosesan
{
 if(pilih==1)
 insert_data();
 else if(pilih==2)
 hapus_data();
 else if(pilih==3)
 cetak_data();
 else
 {
  cout<<"EXIT";
  cout<<"\nSampai Jumpa lagi"<<endl;
 }
}
void buat_baru()//fungsi membuat data baru
{
 baru = new(node);
 cout<<"Masukkan Nomor Induk : ";cin>>baru->nomorinduk;
 cout<<"Masukkan Nama : ";cin>>baru->nama;
 cout<<"Masukkan Gender : ";cin>>baru->gender;
 cout<<"Masukkan Nilai : ";cin>>baru->nilai;
 cout<<"\n\t---Data telah dimasukkan---";
 cout<<"\n\nPRESS ENTER TO CONTINUE...";
 getch();
 baru->prev=NULL;
 baru->next=NULL;
}
void insert_data()
{
 buat_baru();
 if(head==NULL)
 {
  head=baru;
  tail=baru;
 }
 else
 {
  baru->next=head;
  head->prev=baru;
  head=baru;
 }
 cout<<endl<<endl;
}
void hapus_data()//fungsi penghapusan data
{
 int hapus,nomorinduk;
 if(head==NULL)
 {
  cout<<"\nLinked List kosong, \nPenghapusan tidak dapat dilakukan"<<endl;//data yang habis maka tampilannya
 }
 else
 {
  hapus=head->nomorinduk;
  cout<<"\nData yang dihapus adalah ";//pemilihan data yang akan dihapus
  cin>>nomorinduk;
  del = head;
  head = head->next;
  delete del;
 }
}
void cetak_data()
{
 if (head==NULL)
 cout<<"\nData tidak dapat ditemukan!"<<endl;//data yang kosong
 else
 {
  help=head;
  while(help!=NULL)
  {
   cout<<" Nomor Induk : "<<help->nomorinduk;//data akan muncul dengan tampilan
   cout<<" Nama : "<<help->nama;
   cout<<" Gender : "<<help->gender;
   cout<<" Nilai : "<<help->nilai<<endl;
   help=help->next;
  }
 }
getch();
}

Komentar

Postingan Populer