Concept and Implementation Code: Linked List
Angelia
2301854492
COMP6048 - CB01
Pada pertemuan F2F ke-2 di kelas besar, sesi ini penuh diberikan oleh Pak Ferdinand. Pembahasan kali ini merupakan topik lanjutan dari sesi Linked List. Berikut ini beberapa ringkasan yang saya buat dari pembahasan yang diberikan:
A. Konsep Linked List
Linked List itu berarti serangkaian data yang terhubung dengan data lain melalui penyimpanan alamat memori data sebelum/selanjutnya dengan pointer prev/next.
Alamat memori bisa dipesan dengan menggunakan malloc, yang di-assign ke current.
Pemesanan memori tersebut sebesar struct data yang digunakan.
Dalam memori tersebut, bisa diibaratkan seperti ada sebuah gerbong dengan 3 sekat, seperti gambar berikut:
Sumber: https://www.mahirkoding.com/
Penjelasan:
Head selalu ada di awal rangkaian data.
Tail berada di paling akhir rangkaian data.
Kotak besar diibaratkan sebagai gerbong yang memiliki 3 sekat, merupakan memori yang dipesan.
Bagian kotak warna putih merupakan value dari alamat memori.
'NEXT' akan diisi dengan alamat memori data selanjutnya. Untuk 'NEXT' pada rangkaian data paling akhir akan diisi NULL. (tail->next = NULL)
'PREV' akan diisi dengan alamat memori data sebelumnya. Untuk 'PREV' pada rangkaian data paling awal akan diisi NULL. (head->prev = NULL)
Perbedaan Single Linked List dengan Double Linked List terletak pada pointer 'PREV' dimana Single Linked List tidak menggunakan pointer 'PREV' sedangkan Double Link List menggunakan pointer 'PREV' dan 'NEXT' untuk mengakses data.
B. Implementasi Source Code
Dalam pengimplementasian kode, sangat sulit untuk menemukan error karena mayoritas error yang terjadi hanya bisa diketahui setelah program dijalankan (Run Error). Beberapa hal yang menjadi penyebab error adalah:
1. Lupa memberi null untuk *prev dari head dan *next dari tail
2. Logic algorithmnya salah sehingga data yang tercetak berbeda dari yang seharusnya/app crash
Berikut ini source code beserta penjelasannya:
2301854492
COMP6048 - CB01
Pada pertemuan F2F ke-2 di kelas besar, sesi ini penuh diberikan oleh Pak Ferdinand. Pembahasan kali ini merupakan topik lanjutan dari sesi Linked List. Berikut ini beberapa ringkasan yang saya buat dari pembahasan yang diberikan:
A. Konsep Linked List
Linked List itu berarti serangkaian data yang terhubung dengan data lain melalui penyimpanan alamat memori data sebelum/selanjutnya dengan pointer prev/next.
Alamat memori bisa dipesan dengan menggunakan malloc, yang di-assign ke current.
Pemesanan memori tersebut sebesar struct data yang digunakan.
Dalam memori tersebut, bisa diibaratkan seperti ada sebuah gerbong dengan 3 sekat, seperti gambar berikut:
Sumber: https://www.mahirkoding.com/
Penjelasan:
Head selalu ada di awal rangkaian data.
Tail berada di paling akhir rangkaian data.
Kotak besar diibaratkan sebagai gerbong yang memiliki 3 sekat, merupakan memori yang dipesan.
Bagian kotak warna putih merupakan value dari alamat memori.
'NEXT' akan diisi dengan alamat memori data selanjutnya. Untuk 'NEXT' pada rangkaian data paling akhir akan diisi NULL. (tail->next = NULL)
'PREV' akan diisi dengan alamat memori data sebelumnya. Untuk 'PREV' pada rangkaian data paling awal akan diisi NULL. (head->prev = NULL)
Perbedaan Single Linked List dengan Double Linked List terletak pada pointer 'PREV' dimana Single Linked List tidak menggunakan pointer 'PREV' sedangkan Double Link List menggunakan pointer 'PREV' dan 'NEXT' untuk mengakses data.
B. Implementasi Source Code
Dalam pengimplementasian kode, sangat sulit untuk menemukan error karena mayoritas error yang terjadi hanya bisa diketahui setelah program dijalankan (Run Error). Beberapa hal yang menjadi penyebab error adalah:
1. Lupa memberi null untuk *prev dari head dan *next dari tail
2. Logic algorithmnya salah sehingga data yang tercetak berbeda dari yang seharusnya/app crash
Berikut ini source code beserta penjelasannya:
#include<stdio.h>
#include<stdlib.h>
//Awalnya dibuat struct untuk data, kemudian pendeklarasian struct untuk head, current, dan tail. Selain itu, struct Data juga bisa dideklarasi untuk tambahan pointer lain yang akan berguna.
struct Data
{
int value; //Akan digunakan untuk mengisi value
struct Data *next,*prev; //Pointer untuk menunjuk alamat memori data sebelumnya (*prev) dan alamat memori data selanjutnya (*next)
}*head,*curr,*tail;
//1. Fungsi Push (Insert Belakang)
//Bedanya untuk Single Linked List dengan Double Linked List
//Single Linked List, penghubungnya hanya 1 yaitu pointer *next
//Double Linked List, penghubunganya dengan *next dan *prev
void push(int a)
{
//Memesan memori sebesar struct data
curr = (struct Data*)malloc(sizeof(struct Data));
//Value dari alamat memori current adalah a
curr->value = a;
//Cek apakah linked list baru saja dibuat, tandanya head pasti null
if(head==NULL){
//Buat head dan tail berada di alamat memori yang sama dengan current
head = tail = curr;
}
else{
//Kalau data sudah pernah ada, maka assign gerbong yang terdapat tail dengan meng-assign pointer next yaitu alamat memori current
tail->next = curr;
//Assign gerbong current dengan pointer prev yaitu alamat memori dari tail sekarang
curr->prev = tail;
//Assign tail untuk pindah ke posisi gerbong sama dengan current
tail = curr;
}
//Pastikan bahwa pointer prev dari head dan pointer next dari tail adalah NULL untuk menghindari crash
head->prev = tail->next = NULL;
}
//2. Fungsi Pop
//Pop Belakang jika tidak ada pointer *prev (utk Single Linked List)
void popBelakang()
{
//Pertama, buat posisi current berada di head
curr = head;
//Kalau data tinggal satu
if(tail == head){
//Hapus alamat memori sekarang. Bisa menggunakan curr/head/tail untuk free karena berada di alamat memori yang sama
free(curr);
//Pastikan bahwa head, tail, dan current adalah null agar app tidak crash
tail = head = curr = NULL;
}
//Apabila data masih tersisa lebih dari satu
else{
while(curr->next != tail){
//Selamat *next dari current bukanlah tailnya maka looping maju terus dari current
curr = curr->next;
}
//Posisi current setelah keluar dari while adalah current sekarang berada di sebelum tail
//Hapus alamat memori data paling akhir (tail)
free(tail);
//Set tail mundur menjadi posisi current yang sekarang
tail = curr;
//Pastikan bahwa *next dari tail adalah NULL untuk menghindari crash
tail->next = NULL;
}
}
//Pop Belakang jika ada pointer *prev (utk Double Linked List)
void popBelakang2()
{
//Kalau data tinggal satu
if(tail == head){
//Hapus alamat memori sekarang. Bisa menggunakan curr/head/tail untuk free karena berada di alamat memori yang sama
free(curr);
//Pastikan bahwa head, tail, dan current adalah null agar app tidak crash
tail = head = curr = NULL;
}
else
{
//Mundurin tail ke belakang 1 langkah
tail = tail->prev;
//Hapus memori yang posisinya ada di setelah tail (posisi tail sebelumnya, bukan yang sekarang)
free(tail->next);
//Pastikan bahwa *next dari tail adalah NULL untuk menghindari crash
tail->next = NULL;
}
}
//3. Print Linked List
void cetak()
{
//Buat posisi current sama dengan posisi head
curr = head;
while(curr!=NULL){
//Selama current bukan null, maka print value dari alamat memori yang posisi current
printf("%d\n",curr->value);
//Setelah print, majukan posisi current
curr = curr->next;
}
}
int main()
{
push(10);
push(20);
push(30);
push(40);
cetak();
//Hasil = 10, 20, 30, 40
popBelakang();
popBelakang2();
cetak();
//Hasil = 10, 20
push(50);
cetak();
//Hasil = 10, 20, 50
getchar();
return 0;
}
Untuk implementasi code yang lebih lengkap ada di post blog saya yang sebelumnya
Pertemuan F2F ke-1 :
Demikian pembahasan rangkuman materi yang saya dapatkan hari ini. Mohon maaf apabila ada kesalahan.
Terima kasih.
Angelia
2301854492
COMP6048 - CB01
2301854492
COMP6048 - CB01
Referensi Materi:
Kelas Besar Data Structure (03/03/20)
https://www.mahirkoding.com/
https://www.mahirkoding.com/
Comments
Post a Comment