Senin, 14 Agustus 2017

Single Linked List Circular



Single Linked List Circular

Single Linked List Circular adalah Single Linked List yang pointer nextnya menunjuk pada dirinya sendiri. Jika Single Linked List tersebut terdiri dari beberapa node, maka pointer next pada node terakhir akan menunjuk ke node terdepannya.

Pengertian: 
Single   : artinya field pointer-nya hanya satu buah saja dan satu arah. 
Circular : artinya pointer next-nya akan menunjuk pada dirinya sendiri sehingga berputar

Ilustrasi Single Linked List Circular 

  • Setiap node pada linked list mempunyai field yang berisi pointer ke node  berikutnya, dan juga memiliki field yang berisi data. 
  • Pada akhir linked list, node terakhir akan menunjuk ke node terdepan sehingga linked list tersebut berputar. Node terakhir akan menunjuk lagi  ke head.


PEMBUATAN SINGLE LINKED LIST CIRCULAR 

Deklarasi node Dibuat dari struct berikut ini: 

typedef struct TNode{
int data;
TNode *next;
};

Penjelasan Single Linked List Circular: 

  • Pembuatan struct bernama TNode yang berisi 2 field, yaitu field data  bertipe integer dan field next yang bertipe pointer dari TNode 
  • Setelah pembuatan struct, buat variabel haed yang bertipe pointer dari TNode yang berguna sebagai kepala linked list.


Pembentukan node baru : Digunakan keyword new yang berarti mempersiapkan sebuah node baru berserta alokasi memorinya. 

TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru; 

SINGLE LINKED LIST CIRCULAR MENGGUNAKAN HEAD 

  • Dibutuhkan satu buah variabel pointer: head 
  • Head akan selalu menunjuk pada node pertama 


Deklarasi Pointer Penunjuk Kepala Single Linked List  Manipulasi linked list tidak bisa dilakukan langsung ke node yang dituju, melainkan harus melalui node pertama dalam linked list. Deklarasinya sebagai berikut: 

TNode *head;
Fungsi Inisialisasi Single LinkedList
void init(){
head = NULL;


Function untuk mengetahui kosong tidaknya Single LinkedList :


int isEmpty(){
if(head == NULL) return 1;
else return 0;


PENAMBAHAN DATA 

Penambahan data di depan 
Penambahan node baru akan dikaitan di node paling depan, namun pada saat pertama kali (data masih kosong), maka penambahan data dilakukan pada head nya. Pada prinsipnya adalah mengkaitkan data baru dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan. Untuk menghubungkan node terakhir dengan node terdepan dibutuhkan pointer bantu. 


void insertDepan(int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
head->next=head;
}
else {
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
baru->next = head;
head = baru;
bantu->next = head;
}
cout<<"Data masuk\n";


Penambahan data di belakang Penambahan data dilakukan di belakang, namun pada saat pertama kali data langsung ditunjuk pada head-nya. Penambahan di belakang lebih sulit karena kita membutuhkan pointer bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan data baru. Untuk mengetahui data terbelakang perlu digunakan perulangan. 


void insertBelakang (int databaru)
{
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
head->next=head;
}
else {
bantu = head;
while(bantu->next != head){
bantu=bantu->next;
}
bantu->next = baru;
baru->next = head;
}
cout<<"Data masuk\n";

“Bagaimana dengan penambahan di tengah?” 


MENAMPILKAN DATA 

Function untuk menampilkan isi single linked list 


void tampil(){ TNode *b;
b = head;
if(isEmpty()==0)
{
do
{
cout<data<<" ";
b=b->next;
}
while(b!=head);
cout<<<"Masih kosong\n";

  • Function di atas digunakan untuk menampilkan semua isi list, di mana linked list ditelusuri satu-persatu dari awal node sampai akhir node. Penelusuran ini dilakukan dengan menggunakan suatu variabel node bantu, karena pada prinsipnya variabel node head yang menjadi tanda awal list tidak boleh berubah/berganti posisi. 
  • Penelusuran dilakukan terus sampai node terakhir ditemukan menunjuk ke head lagi. Jika belum sama dengan head, maka node bantu akan berpindah ke node selanjutnya dan membaca isi datanya dengan menggunakan field next sehingga dapat saling berkait. 
  • Jika head masih NULL berarti data masih kosong! 


PENGHAPUSAN DATA 

Function untuk menghapus data terdepan 


void hapusDepan ()
{ TNode *hapus,*bantu;
if (isEmpty()==0)
{
int d;
hapus = head; d = head->data;
if(head->next != head){
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
head = head->next;
delete hapus;
bantu->next = head;
}else{
head=NULL;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";

  • Function di atas akan menghapus data teratas (pertama) yang ditunjuk oleh head  pada linked list 
  •  Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus ditampung dahulu pada variabel hapus dan barulah kemudian menghapus variabel hapus dengan menggunakan perintah delete. 
  • Sebelum data terdepan dihapus, head harus ditunjukkan ke data sesudahnya  terlebih dahulu sehingga data setelah head lama akan menjadi head baru (data terdepan yang baru). 
  • Jika head masih NULL maka berarti data masih kosong! 


Penghapusan data di belakang: 


void hapusBelakang()
{ TNode *hapus,*bantu;
if (isEmpty()==0)
{
int d;
hapus = head;
if(head->next == head){
head = NULL;
}
else
{
bantu = head;
while(bantu->next->next != head){
bantu = bantu->next;
}
hapus = bantu->next;
d = bantu->data;
bantu->next = head;
delete hapus;
}
cout<<<" terhapus\n";
}
else
cout<<"Masih kosong\n";

  • Membutuhkan pointer bantu dan hapus. 
  • Pointer hapus digunakan untuk menunjuk node yang akan dihapus, dan pointer bantu digunakan untuk menunjuk node sebelum node yang dihapus. 
  • Pointer bantu akan digunakan untuk menunjuk ke nilai NULL. 
  • Pointer bantu akan selalu bergerak bersama dengan pointer hapus tapi letak pointer bantu harus selalu dibelakang pointer hapus. 


Function untuk menghapus semua elemen Linked List 


void clear(){ TNode *bantu,*hapus;
bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;


EmoticonEmoticon