Sabtu, 08 Maret 2014

Linked List Implementation Dan Catatan tambahan*

Linked list


Pada linked list, terdapat istilah push, dan pop dimana push berarti insert data baru pada linked list tersebut, dimana kita bisa push dari depan(dimana data yang kita masukkan berada di paling depan linked list kita dan data yang kita masukkan tersebut menjadi head), belakang (dimana data yang kita masukkan akan berada di paling belakang linked list kita dan data yang kita masukkan tersebut menjadi tail) atau dari tengah( data yang kita masukkan bukan berada di head maupun tail, melainkan berada di tengah-tengah linked list). Sedangkan pop berarti mendelete data, data dari depan, tengah dan juga belakang. Pada linked list, head berarti yang paling depan pada linked list tersebut, sedangkan tail berarti data yang terakhir.
Pada linked list digunakan fungsi malloc, untuk memesan sebuah alamat memory. Pada saat penggunaan malloc itu sendiri, mungkin beberapa bertanya-tanya mengapa digunakan sizeof, tidak langsung saja misal int, langsung saja 4, tidak usah pake sizeof(int), jawabannya adalah agar dinamis, karena kita tidak pernah tau program kita akan dicompile di compiler apa, bisa saja 16 ataupun 32 bit, yang mengakibatkan jumlah byte nya berbeda-beda.

Single Linked List


Pada single linked list, hanya terdapat satu panah(kita bisa akses dari head ke tail, tapi tidak bisa dari tail ke head). Untuk melakukan insert maka yang pertama kali harus kita lakukan adalah memesan tempat terlebih dahulu.Pada C, bisa menggunakan fungsi malloc yang diinclude dari library #include <stdlib.h>.

Selain menggunakan panah seperti potongan program diatas, bisa juga menggunakan .(dot) , contoh :
node->value=x; dapat menjadi *node->value=x;

Untuk mendelete/pop, hal pertama kali yang harus kita selamatkan adalah menyelamatkan head dan juga tail nya, selain itu juga pertama kali kita harus mencari apa yang ingin kita hapus, menghapus data tersebut dan juga menghubungkan data-data yang masih ada.

Contoh coding single linked list :


Contoh deklarasi struct dan juga membuat fungsi push depan/head :

















Contoh membuat fungsi push belakang/tail :













contoh membuat fungsi popdepan\head :

















Contoh membuat fungsi popbelakang/poptail :


















Contoh membuat fungsi popall/delete semua data : 


















Double Linked List


Pada double linked list terdapat 2 link. Salah satu terdapat pointer yang menunjuk kepada data selanjutnya dan yang satu lagi menunjuk kepada data sebelumnya.

Contoh coding double linked list : 

Untuk meelakukan coding pada double linked list sebenarnya logic dasar sama dan pengkodean nya juga hampir sama, perbedaan nya adalah penambahan prev, sehingga saat kita menggunakan next, kemungkinan besar prev juga akan digunakan. Memang pada dasarnya double linked list lebih sulit dibanding single linked list, dan menuntut ketelitian yang lebih dibanding single linked list, tapi double linked list juga memiliki kelebihan yaitu kita bisa mengakses ururtan node bukan hanya dari depan(head) tapi bisa juga dari belakang.

Berikut code untuk melakukan delete head dan juga tail  pada double linked list:


void popBelakang(){
if(head == NULL){
system("color 0A");
printf("\nThere is no data yet\n");
getchar();
}else{
struct Facebook *curr = head;
if(head == tail){
//cuma ada 1 node;
head = tail = NULL;
printf("Data %s",curr->nama);
free(curr);
}else{
tail=tail->prev;
                        free(tail->next);
                        tail->next=NULL;
}
printf(" sudah dihapus\n");
getchar();
}
}

void pushBelakang(char nama[], int usia){
struct Facebook *curr = (struct Facebook*) malloc(sizeof(struct Facebook));
strcpy(curr->nama,nama);
curr->usia = usia;
if(head == NULL){
head = tail = curr;
tail->next = NULL;
                head->prev=NULL;
}else{
tail->next = curr;
                curr->prev=tail;
tail = curr;
tail->next = NULL;
}
}

Tambahan yang didapatkan :

Cara melakukan swap tanpa menggunakan variable pembantu yaitu dengan cara :
a ^=b ^=a ^=b; If you don't believe it, just try it by yourself :)

Nama lain dari push pada queue adalah enqueue, dan nama lain dari pop di queue adalah dequeue
Nama lain dari push pada stack adalah enstack dan nama lain dari pop pada stack adalah destack.

MULTIPLE LINKED LIST

Pada multiple linked list terdapat lebih dari 2 link. Salah satu terdapat pointer yang menunjuk kepada data selanjutnya lalu mungkin ada yang menunjuk kepada data sebelumnya, atupun juga menunjuk sebuah node tertentu.

CIRCULAR LINKED LIST

Pada circular linked list, data/node pertama(head) akan terhubung dengan node/data terakhir(tail), sehingga akan membentuk pola seperti lingkaran. Pada circular linked list ini, maka tidak terdapat pointer yang menunjuk ke NULL, karena tail->next=head dan juga head->prev=tail(pada double linked list) atau hanya ada tail->next=head pada single linked list.

QUEUE


Diibaratkan seperti ururtan dan juga memiliki konsep FIFO(first in first out), Elemen-elemen pada queue ditambahkan di belakang, dan di delete dari depan, sehingga ketika kita menggunakan linked list, saat memasukkan kita bisa menggunakan pushtail() dan dan untuk menghapus pophead() , dan juga bisa digunakan single linked list maupun double linked list.

PRIORITY QUEUE


Bagian dari queue, maksud dari priiority queue adalah mengurutkan node/data sesuai keinginan kita(mis. sorting/mengurutkan sesuai nama, atau sesuai umur,dll. Bisa menggunakan double linked list maupun single linked list.

berikut merupakan contoh code untuk fungsi priority queue, sorting berdasarkan nama(descending):

void priority(char nama[], int usia){
struct Facebook *curr = (struct Facebook*) malloc(sizeof(struct Facebook));
strcpy(curr->nama,nama);
curr->usia = usia;
if(head == NULL){
head = tail = curr;
head->prev = NULL;
tail->next = NULL;
}else{
if(curr->usia > head->usia){
curr->next = head;
head->prev = curr;
head = curr;
head->prev = NULL;
}else if(curr->usia < tail->usia  ){
tail->next = curr;
curr->prev = tail;
tail = curr;
tail->next = NULL;
}else{
//push mid
struct Facebook *temp=head;
while(temp->next->usia > curr->usia){
temp = temp->next;
}
curr->next = temp->next;
temp->next->prev = curr;
temp->next = curr;
curr->prev = temp;
}
}
}

STACK

Diibaratkan seperti tumpukan, mis. tumpukan piring. Stack ini memiliki konsep LIFO(Last In First Out)/FILO(First In Last Out), Stack ini dapat dibuat dengan array maupun linked list. sehingga ketika kita ingin membuat stack dengan linked list(baik single maupun double), untuk memasukkan pushhead dan menghapus pophead atau untuk memasukkan dengan pushtail dan menghapus dengan poptail.



NB : Bahan yang ditulis berdasarkan apa yang pernah saya pelajari dari dosen dan juga slide-slide powerpoint dari Binus University.


Binus University     Skyconnectiva

Tidak ada komentar:

Posting Komentar