260 likes | 451 Views
Imam Rozali , S.T., M.T. Struktur Data ( Data Structure ) – IS 2313. Chapter 8 : Double L inked L ist C ircular. Double Linked List Circular.
E N D
Imam Rozali, S.T., M.T. Struktur Data(Data Structure) – IS 2313
Double Linked List Circular • DLLC adalah Double Linked List yang memiliki 2 buah pointer yaitu pointer next dan prev. Pointer next menunjuk pada node setelahnya dan pointer prev menunjuk pada node sebelumnya. • Pengertian: • Double : artinya field pointer-nya dua buah dan dua arah, ke node sebelum dan sesudahnya. • Linked List : artinya node-node tersebut saling terhubung satu sama lain. • Circular : artinya pointer prev dan next-nya akan menunjuk dirinya sendiri sehingga berputar.
IlustrasiDLLC • Setiap node pada linked list mempunyai field yang berisi data dan pointer ke node berikutnya & ke node sebelumnya • Untukpembentukan node baru, mulanya pointer next danprevakanmenunjukkenilaidirinya sendiri. • Selanjutnya pointer prevakanmenunjukke node sebelumnya, dan pointer next akanmenunjukke node selanjutnyapada list.
Deklarasi dan node baru DLLC • Deklarasi node • Dibuatdaristructberikutini: • typedefstructTNode{ • int data; • TNode *next; • Tnode *prev; }; • Pembentukan node baru • Digunakan keyword new yang berartimempersiapkansebuah node barubersertaalokasimemorinya. • TNode *baru; • baru = new TNode; • baru->data = databaru; • baru->next = baru; • baru->prev = baru;
DLLC dengan HEAD • Dibutuhkan satu buah variabel pointer: head • Head akan selalu menunjuk pada node pertama
DLLC dengan HEAD Deklarasi Pointer PenunjukKepala Double Linked List • Manipulasi linked list tidakbisadilakukanlangsungke node yang dituju, melainkanharusmelalui node pertamadalam linked list. Deklarasinyasebagaiberikut: • TNode *head; • FungsiInisialisasiDouble LinkedListCircular • void init(){ • head = NULL; • }
DLLC dengan HEAD Function untukmengetahuikosongtidaknyaDLLC • intisEmpty(){ • if(head == NULL) return 1; • else return 0; • } Penambahan data didepan • Penambahan node baruakandikaitandi node paling depan, namunpadasaatpertama kali (data masihkosong), makapenambahan data dilakukanpada head nya. • Padaprinsipnyaadalahmengkaitkan data barudengan head, kemudian head akanmenunjukpada data barutersebutsehingga head akantetapselalumenjadi data terdepan.
DLLC menggunakan Head • voidinsertDepan(intdatabaru){ • TNode *baru; • baru = new TNode; • baru->data = databaru; • baru->next = baru; • baru->prev = baru; • if(isEmpty()==1){ • head=baru; • head->next = head; • head->prev = head; • } • else { • head->prev->next = baru; • baru->prev=head->prev; • baru->next = head; • head->prev = baru; • head = baru; • } • cout<<”Data masuk\n”; • }
DLLC dengan HEAD 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.
DLLC dengan Head • void insertBelakang(intdatabaru){ • TNode *baru; • baru = new TNode; • baru->data = databaru; • baru->next = baru; • baru->prev = baru; • if(isEmpty()==1){ • head=baru; • head->next = head; • head->prev = head; • } • else { • head->prev->next = baru; • baru->prev=head->prev; • baru->next = head; • head->prev = baru; • } • cout<<”Data masuk\n”; • }
DLLC dengan HEAD Function untukmenampilkanisiDLLC • voidtampil(){ • TNode *bantu; • bantu = head; • if(isEmpty()==0){ • do{ • cout<<bantu->data<<" "; • bantu=bantu->next; • } while(bantu!=head); • cout<<endl; • } else cout<<"Masihkosong\n"; • }
DLLC dgn HEAD • Bagaimanacaramembaca data list secaraterbalik? • Function untukmenghapus data didepan: • voidhapusDepan (){ • TNode *hapus; • int d; • if (isEmpty()==0){ • if(head->next != head){ • hapus = head; • d = hapus->data; • head = head->next; • head->prev = hapus->prev; • hapus->prev->next=head; • delete hapus; • } else { • d = head->data; • head = NULL; • } • cout<<d<<" terhapus\n"; • } else cout<<"Masihkosong\n"; • }
DLLC dengan HEAD • Function untukmenghapus node terbelakang • voidhapusBelakang(){ • TNode *hapus; • int d; • if (isEmpty()==0){ • if(head->next != head){ • hapus = head->prev; • d = hapus->data; • hapus->prev->next = head; • head->prev=hapus->prev; • delete hapus; • } else { • d = head->data; • head = NULL; • } • cout<<d<<" terhapus\n"; • } else cout<<"Masihkosong\n"; • }
DLLC dengan HEAD • Tidak diperlukan pointer bantu yang mengikuti pointer hapus yang berguna untuk menunjuk ke NULL • Karena pointer hapus sudah bisa menunjuk ke pointer sebelumnya dengan menggunakan elemen prev ke node sebelumnya, yang akan diset agar menunjuk ke NULL setelah penghapusan dilakukan.
DLLC dengan HEAD • Function untukmenghapussemuaelemen • void clear(){ • TNode *bantu,*hapus; • bantu = head; • while(bantu!=NULL){ • hapus = bantu; • bantu = bantu->next; • delete hapus; • } • head = NULL; • }
DLLC dengan HEAD dan TAIL • Dibutuhkan dua buah variabel pointer: head dan tail • Head akan selalu menunjuk pada node pertama, sedangkan tail akan selalu menunjuk pada node terakhir.
DLLC dengan HEAD dan TAIL InisialisasiDLLC • TNode *head, *tail; FungsiInisialisasiDLLC • void init(){ • head = NULL; • tail = NULL; • } Function untukmengetahuikosongtidaknyaDLLC • intisEmpty(){ • if(tail == NULL) return 1; • else return 0; • }
DLLC dengan HEAD dan TAIL • TambahDepan • voidinsertDepan (intdatabaru){ • TNode *baru; • baru = new TNode; • baru->data = databaru; • baru->next = baru; • baru->prev = baru; • if(isEmpty()==1){ • head=baru; • tail=head; • head->next = head; • head->prev = head; • tail->prev = tail; • tail->next = tail; • } • else { • baru->next = head; • head->prev = baru; • head = baru; • head->prev = tail; • tail->next = head; • } • cout<<"Data masuk\n"; • }
DLLC dengan HEAD & TAIL Penambahan node dibelakang Penambahan node di belakang akan selalu dikaitkan dengan tail dan kemudian node baru tersebut akan menjadi tail • void insertBelakang (intdatabaru){ • TNode *baru; • baru = new TNode; • baru->data = databaru; • baru->next = baru; • baru->prev = baru; • if(isEmpty()==1){ • head=baru; • tail=head; • head->next = head; • head->prev = head; • tail->prev = tail; • tail->next = tail; • } • else { • baru->next = head; • head->prev = baru; • tail->next = baru; • baru->prev = tail; • tail=baru; • } • cout<<"Data masuk\n"; • } • }
DLLC dengan HEAD & TAIL • Function untukmenampilkanisi linked list • voidtampil(){ • TNode *bantu; • bantu = head; • if(isEmpty()==0){ • do { • cout<<bantu->data<<" "; • bantu=bantu->next; • } while(bantu!=tail->next); • cout<<endl; • } else cout<<"Masihkosong\n"; • }
DLLC dengan HEAD & TAIL • Function untukmenghapus data di data terdepan • voidhapusDepan(){ • TNode *hapus; • int d; • if (isEmpty()==0){ • if(head->next != head){ • hapus = head; • d = hapus->data; • head = head->next; • head->prev = tail; • tail->next = head; • delete hapus; • } else { • d = head->data; • head = NULL; • tail = NULL; • } • cout<<d<<" terhapus\n"; • } else cout<<"Masihkosong\n"; • }
DLLC dengan HEAD & TAIL • Function untukmenghapus node terbelakang • voidhapusBelakang(){ • TNode *hapus; • int d; • if (isEmpty()==0){ • if(head->next != head){ • hapus = tail; • d = tail->data; • tail = tail->prev; • tail->next = head; • head->prev = tail; • delete hapus; • } else { • d = head->data; • head = NULL; • tail = NULL; • } • cout<<d<<" terhapus\n"; • } else cout<<"Masihkosong\n"; • }
DLLC dengan HEAD & TAIL • Pointer hapustidakperludi loop untukmencari node terakhir. Pointer hapushanyaperlumenunjukpada pointer tail saja. • Karena pointer hapussudahbisamenunjukke pointer sebelumnyadenganmenggunakanelemenprev, maka pointer prevhanyaperludiset agar menunjukkehead. Lalu pointer hapusdidelete.
DLLC dengan HEAD & TAIL • Function untukmenghapussemuaelemenLinkedList • void clear(){ • TNode *bantu,*hapus; • bantu = head; • while(bantu!=NULL){ • hapus = bantu; • bantu = bantu->next; • delete hapus; • } • head = NULL; • tail = NULL; • }
DLLC dengan HEAD & TAIL • Menggunakan pointer bantu yang digunakan untuk bergerak sepanjang list, dan menggunakan pointer hapus yang digunakan untuk menunjuk node-node yang akan dihapus. • Pada saat pointer hapus menunjuk pada node yang akan dihapus, pointer bantu akan bergerak ke node selanjutnya, dan kemudian pointer hapus akan didelete.