Single Linked List Circular
Single Linked List Circular
Kom
# SEVEN
data
pointer
Menempati alamat memori tertentu Pengertian: Single : artinya field pointer-nya hanya satu buah saja dan satu arah. Linked List : artinya node-node tersebut saling terhubung satu sama lain. Circular : artinya pointer next-nya akan menunjuk pada dirinya sendiri sehingga berputar A FFF1 B FFF2 C FFF3 D FFF4 Ilustrasi SLLC
- 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.
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
PEMBUATAN SINGLE LINKED LIST CIRCULAR Deklarasi node Dibuat dari struct berikut ini:
typedef struct TNode{ int data; TNode *next; };
Penjelasan: - 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
A FFF1
head
B FFF2
C FFF3
D FFF4
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
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;
head
NULL
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
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
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"; }
head
head
baru
baru
head
20
baru
head bantu
20
baru
head
bantu
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
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"; }
head
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
head
baru
head
baru
20
head bantu
baru
20
head
baru
bantu
25
head
baru
20
25
head
bantu
baru
20
25
baru bantu
head
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
head
bantu
- 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!
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
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<<d<<" terhapus\n"; } else cout<<"Masih kosong\n"; }
bantu
head
hapus
head
bantu
- 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.
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
- 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!
- 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.
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
Ilustrasi:
null
bantu head
hapus
null
bantu head A B C
hapus
null
bantu head
hapus
C null bantu
head
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
SINGLE LINKED LIST MENGGUNAKAN 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.
A FFF1
head
B FFF2
C FFF3
D FFF4
tail
Inisialisasi LinkedList
TNode *head, *tail;
tail
head
NULL
PENAMBAHAN DATA Pengkaitan node baru ke linked list di depan Penambahan data baru di depan akan selalu menjadi head.
void insertDepan(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru; if(isEmpty()==1){ head=baru;
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
tail=baru; head->next=head; tail->next=tail; } else { baru->next = head; head = baru; tail->next = head; } cout<<"Data masuk\n"; }
head tail
baru
tail
20
baru
head tail
20
head baru
tail
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
Penambahan Data di belakang Pada penambahan data di belakang, data akan selalu dikaitkan dengan tail, karena tail terletak di node paling belakang. Setelah dikaitkan dengan node baru, maka node baru tersebut akan menjadi tail.
void tambahBelakang(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru; if(isEmpty()==1){ head=baru; tail=baru; head->next=head; tail->next=tail; } else { tail->next = baru; tail = baru; tail->next = head; } cout<<"Data masuk\n"; }
head tail
head
tail
baru
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
5
head
20
tail
baru
20
head
baru
tail
Kelebihan dari Single Linked List dengan Head & Tail adalah pada penambahan data di belakang, hanya dibutuhkan tail yang mengikat node baru saja tanpa harus menggunakan perulangan pointer bantu.
head
bantu
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
hapus = head; d = head->data; if(head != tail){ hapus = head; head = head->next; tail->next = head; delete hapus; }else{ head=NULL; tail=NULL; } cout<<d<<" terhapus\n"; } else cout<<"Masih kosong\n"; } A B C D
head
hapus
tail
head
hapus
tail
hapus
head
tail
- Function di atas akan menghapus data terdepan (pertama) yang ditunjuk oleh head pada linked list - Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada head, kemudian dilakukan pergeseran head
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
ke node berikutnya sehingga data setelah head menjadi head baru, kemudian menghapus variabel hapus dengan menggunakan perintah delete. - Jika tail masih NULL maka berarti data masih kosong!
Function untuk menghapus data di belakang: Dengan menggunakan Single Linked List ber-Head dan Tail, pengahapusan data di belakang akan mudah dilakukan, tidak seperti pada Single Linked List hanya ber-Head saja.
void hapusBelakang(){ TNode *hapus,*bantu; if (isEmpty()==0){ int d; if(head == tail){ d = tail->data; head = NULL; tail = NULL; }else{ bantu = head; while(bantu->next != tail){ bantu = bantu->next; } hapus = tail; tail = bantu; d = hapus->data; tail->next = head; delete hapus; } cout<<d<<" terhapus\n"; } else cout<<"Masih kosong\n"; }
Ilustrasi:
A B C D
head
tail
hapus
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
head
head
tail bantu
hapus
- Function di atas akan menghapus data terbelakang (terakhir) yang ditunjuk oleh tail pada linked list - Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada tail, kemudian dibutuhkan pointer bantu untuk membantu pergeseran dari head ke node berikutnya sampai sebelum tail, sehingga tail dapat ditunjukkan ke bantu tersebut, dan bantu tersebut akan menjadi tail yang baru. Setelah itu hapus variabel hapus dengan menggunakan perintah delete. - Jika tail masih NULL maka berarti data masih kosong!
HANDOUT STRUKTUR DATA PRODI TEKNIK INFORMATIKA UKDW by Antonius Rachmat C, S.Kom
} }
- 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.
SOAL LATIHAN - Buatlah program lengkap dari semua algoritma dan function di atas dalam bentuk menu untuk menambah data, melihat data, dan menghapus data! - Buatlah function tambahan yang berguna untuk mencari data yang ada dalam linked list baik secara ber-Head maupun ber-Head dan Tail! - Buatlah function untuk menghapus data tertentu dalam linked list! - Buatlah penyisipan node setelah atau sebelum data tertentu.
NEXT
Double Linked List Non Circular