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

Jumat, 07 Maret 2014

Pointer

Pointer adalah variabel yang menyimpan alamat dari variabel lain.

Cara deklarasi : data_type *pointer_name;
contoh : int *ptr;

Pointer ini memiliki kelebihan yang sekaligus juga menjadi kelemahannya yaitu ketika mis int *ptr tadi berubah, maka nilai dari variabel yang dipoint oleh variabel ptr tadi juga akan berubah. Oleh karena pointer itu berbahaya, maka sekarang ini di beberapa bahasa pemograman penggunaan pointer dikurangi.

Dua operator yang sering digunakan pada pointer:

  1. *  (content of)
  2. & (address of)

contoh coding






Pada potongan program disamping, maka output nya adalah 5 dan juga 10, karena *ptr bernilai 5, dan saat *ptr diubah menjadi 10, maka nilai dari variabel angka juga akan berubah.








Pada Bahasa C, terdapat juga pointer to pointer, dimana pointer tersebut akan menujuk / menyimpan alamat dari variabel lain. Untuk mendeklarasikan ponter to pointer, cukup menambahkan * untuk setiap level dari pointer.

contoh :

int angka=20;
int *ptr,**pptr;
ptr=&angka;
pptr=&ptr;

Maka, saat **pptr dicetak, akan menghasilkan nilai 20, sama dengan nilai *ptr dan juga angka. Pointer juga akan sering digunakan saat kita ingin melakukan passing parameter pada fungsi, terlebih disaat kita ingin melakukan/membuat fungsi swap/tukar nilai antara variabel yg satu degan variabel lainnya.
contoh :

void tukar(int *a, int *b)
{
  int c;
  c = *a;
  *a = *b;
  *b = c;

}

Array

Pengertian dari array adalah sekumpulan data elemen yang memiliki tipe data yang sama. Array disimpan di
lokasi memori yang saling bersebelahan, dan direferensikan dengan indeks. Indeks dari array dimulai dari 0 
sampai n-1, dimana n merupakan banyaknya array yang kita pesan.
Pada array, kita harus memesan tempat terlebih dahulu, dan tempat yang sudah kita pesan itu tidak bisa
ditambahkan dan juga dihapus.

Karakteristik dari array:

  1. Homogenous : Semua elemen memiliki tipe data yang sama.
  2. Random access : Setiap elemen dapat diakses secara individual, tidak harus secara sequential.

Macam-macam array :



  1. Array 1 dimensi : cara deklarasi : data_type variabel_name[index]; dimana index berarti banyaknya array.
  2. Array 2 dimensi : array yang memilki2 dimensi cara deklarasi : data_type variabel_name[index1][index2];
  3.                                    contoh : 

  4. Multi dimensional array : array yang memiliki dimensi lebih dari 2. contoh deklarasi : int A[10][20][5]; dari yang kabar yang saya dengar, maksimal dimensi nya adalah 256, dimana banyaknya tergantung compiler.

  5. Pada saat kita ingin menyimpan kalimat juga digunakan array atau string atau lebih tepatnya array of char. 
    contoh deklarasi : char nama[20];
    Sehingga pada string, untuk memiliki data yang banyak maka (beberapa baris string) maka harus digunakan array 2 dimensi.

    Perhatikan perbedaan array dan string:
    Pada char, cara deklarasi char a, sedangkan pada string minimal 1 dimensi, contoh : char a[10];
    Perbedaan 'A' dan "A" yaitu
    Menyimpan Nilai Array
    1.Inisialisasi Array : memasukkan nilai pada array dengan cara inisialisasi di awal tanpa input user. contoh : int angka[3]={1,3,4};
    2.Input nilai :memasukkan nilai pada array dengan cara inputtan oleh user. contoh : int angka[5]; for(int i=0;i<5;i++) scanf("%d", &angka[i]);
    3.Assign nilai : mengambil nilai array. contoh : int angka1[5],angka2[5]; for(int i=0;i<5;i++) angka2[i]=angka1[i];

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