Selasa, 27 Februari 2018

Pertemuan 3-Implementasi Linked list-Benedick Asdyo-2101631090

   Sebelum membahas mengenai Linked list kita perlu mengetahui apa itu linked list. Linked list adalah Linked List adalah suatu struktur data linier yang bentuknya dinamis. Adapun perbedaan linked list dengan array antara lain:
Array:
1. Disimpan di memori statis.
2. Penggunaan memori kurang efisien, karena melebihi kapasitas array dideklerasi terlebih dahulu sebelum tau jumlah atau kapasitas yang dibutuhkan.

Linked List:
1. Disimpan di memori dinamis.
2. Lebih efisien, karena jika ingin menambahkan data, kita dapat langsung mengalokasikannya, jadi semua memori pasti digunakan.

Untuk menggunakan linked list, kita harus melakukan memory allocation atau alokasi memori terlebih dahulu. Berikut cara deklarasi suatu linked list:

int  *px = (int *) malloc(sizeof(int));
char *pc = (char *) malloc(sizeof(char));
*px = 205;
*pc = ‘A’;
printf( “%d %c\n”, *px, *pc );
free(px);
free(pc);




Jenis-Jenis Linked list:
  • Single linked list
Merupakan linked list paling sederhana (menggunakan 1 pointer), Hanya memperbolehkan tranversal data dengan satu arah.
Contoh:

struct tnode 
{
  int value;
  struct tnode *next;
};
struct tnode *head = 0;

head nerupakan pointer menuju ke elemen pertama dari linked list kita. Untuk memasukan nilai baru kita pertama-tama harus mengalokasikan node baru dan memberi nilai ke node baru tersebut, baru disambungkan dengan linked list yang ada. contoh jika kita ingin membuat node baru di depan head :
struct tnode *node =
  (struct tnode*) malloc(sizeof(struct tnode));
node->value = x;
node->next  = head;
head = node;

Untuk menghapus data dalam linked list, pertama-tama kita harus mengetahui lokasi node dimana data yang akan dihapus berada, lalu menghapus dan menghilangkan data tersebut, lalu merangkai kembali linked list tersebut.

struct tnode *curr = head;
// if x is in head node
if ( head->value == x ) {
  head = head->next;
  free(curr);
}
// if x is in tail node
else if(tail->value == x){
  while(curr->next!=tail) curr = curr->next;
  free(tail); tail = curr;
  tail->next = NULL;
}
// if x is not in head node, find the location
else {
  while ( curr->next->value != x ) curr = curr->next;
  struct tnode *del = curr->next;
  curr->next = del->next;
  free(del);
}

 Dalam menghapus data dalam linked list ada 2 hal yang perlu diperhatikan, apakah data yang ingin di hapus ada di head node atau tidak.
jika ingin menghapus 31 di head

jika ingin menghapus 35 tidak di head node

 
  •  Circular single linked list
Dalam circular single linked list, pada data terakhir terdapat pointer menuju head node. Circullar linked list tidak memiliki node yang bernilai NULL atau 0. Implementasi dari circular single linked list ini biasanya pada playlist repeat, dimana playlist selalu berulang hingga dihentikan.
  • Doubly linked list
Merupakan Linked list 2 arah. setiap data memiliki 2 link. yang satu berisi reference untuk data sebelum dirinya dan yang satunya untuk data setelah dirinya.
contoh :

struct tnode {
  int value;
  struct tnode *next;
  struct tnode *prev;
};
struct tnode *head = 0;
struct tnode *tail = 0;

Cara menambah data pada doubly linked list ini mirip dengan single linked list untuk jelas nya :

struct tnode *a = ??;
struct tnode *b = ??;
// the new node will be inserted between a and b
struct tnode *node =
  (struct tnode*) malloc(sizeof(struct tnode));
node->value  = x;
node->next  = b;
node->prev  = a;
a->next  = node;
b->prev  = node;

Sedangkan untuk menghapus data, ada 4 cara dengan syarat :
1.jika node yang di hapuskan hanya ada satui:
free(head);
head = NULL;
tail = NULL;
2.jika node yang ingin di hapus adalah head
   head = head->next

   free(head->prev); 

  head->prev = NULL;

3.If the node to be deleted is tail:
  • tail = tail->prev;
    free(tail->next);
   
     tail->next = NULL;
4.jika node yang ingin di hapus bukan head atau tail:
 
  struct tnode *curr = head;
  while ( curr->next->value != x ) curr = curr->next;
  struct tnode *a   = curr;
  struct tnode *del = curr->next;
  struct tnode *b   = curr->next->next;
  a->next = b;
  b->prev = a;
  free(del);
  •  Circular Doubly Linked list
perbedaanya sama dengan single dan doubly linked list, terdapat 2 link tiap data (bukan satu seperti circular single linked list)






Nama : Benedick Asdyo
NIM   : 2101631090  

Selasa, 20 Februari 2018

Pertemuan 1 dan 2-Pengenalan Struktur Data,Array,Pointer dan Linked list-Benedick Asdyo-2101631090

      Dilansir dari wikipedia,  struktur data dalam ilmu komputer adalah cara penyimpanan, penyusunan dan pengaturan data di dalam media penyimpanan komputer sehingga data tersebut dapat digunakan secara efisien. Dengan struktur data dengan baik kita dapat membuat aplikasi atau program yang kita gunakan berjalan lebih efisien serta mempelajari data-data itu dengan mudah. Struktur data ini juga ternyata sangat penting dalam bidang digital marketing, yaitu dengan mempelajari kebiasaan masukan / input pengguna dan menampilkan iklan yang dapat memungkinkan membuat pembaca dari web tersebut tertarik, contoh nya adalah bagaiman iklan-iklan yang di tampilkan di google atau facebook. Selain itu implementasi dari struktur data ini juga erat dengan sistem pencari yang ada di internet karena itu, Ada istilah yang di sebut SEO (Search Engine Optimization) yang erat hubungannya dengan struktur data.
     Tipe-tipe data dalam struktur data ini umumnya di bagi menjadi 3 yaitu tipe data primitif,non primitf dan tipe data abstrak atau ADT(Abstract Data Type).
Contoh tipe data primitif adalah:
  • Boolean (Truth/false)
  • Character/char
  • Floating-point/float
  • Double/ long floaot
  • Integer/ bilangan bulat
  • String / kumpulan dari char
  • Reference (disebut juga pointer)
Contoh tipe data non-primitif adalah:
  • Array
  • Record
  • Union
  • Tagged union 

 Contoh ADT (Abstract Data Type):
  • List
  • Associative array
  • Multimap
  • Set
  • Multiset (Bag)
  • Struct
  • Queue
  • Double-ended queue
  • Priority queue
  • Tree
  • Graf

Array (contoh dan syntax berdasarkan bahasa C/C++)

  • Array adalah sebuah kumpulan elemen data dengan tipe data yang sama(homogen). Elemen-elemen suatu array disimpan dalam memory locations yang berurutan. Setiap elemen array dapat diisi secara terpisah. 
  • Elemen pada array ini memiliki index dimulai dari 0 hingga n-1, dimana n-1 merupakan jumlah data.
  • Syntax: Tipedata arrayName[size];
  • Contoh: int contoh[5] = {1,2,3,4,5); (dimemori disiapakan suatu tempat bernama contoh untuk    5 buah integer dimana pada index ke-0 diisi 1,index ke 1 diisi 2, index ke 2 diisi 3 dst) 
  • Operasi yang bisa dilakukan pada array adalah:
  1. Traversal (passing nilai)
  2. Insertion (memasukkan)
  3. Searching (mencari)
  4. Deletion (menghapus)
  5. Merging (menggabungkan)
  6. Sorting (mengurutkan)
  •  Jenis array : 
  1.  array dimensi satu (untuk contoh dan syntax ada di bagian contoh da syntax diatas)
  2.  array multidimensi
merupakan array berdimensi 2 atau lebih syntax nya mirip denga array dimensi satu hanya di tambah'[ ]' lagi, contoh : int x[3][4]; (artinya akan dibentuk array dengan tipe data int dengan index 2),array berdimensi dua ini jika digambarkan seperti tabel
array ini memiliki dimensi maksimal 256,namun pada umumnya jarang komputer yang dapat dialokasikan memorinya untuk membuat array dengan 256 dimensi, jadi bisa dikatakan batas dimensi array ini di tentukan dari memori yang dimiliki komputer.

Pointer

  • Pointer secara singkat adalah suatu tipe data yang menyimpan alamat dari variabel lain dengan tipe data yang sama. sepertii penunjuk
  • Operator yang digunakan dalam pointer adalah '*'(derefecing operator) dan '&' (untuk mengakses alamat)
  • Syntax :   data-type *ptr_name;
  • batas * pada pointer adalah 12 jika ada 2'*' maka berarti variabel itu adalah penunjuk dari penunjuk.
  • contoh :
int a  = 10;
int *p = &a;
printf( “%d\n”, *p ); /*akan tercetak alamat dari variable a*/
a  = 17;
*p = 20;/*nilai a akan berubah jadi 20 karena pointer p memiliki    alanat a/*
printf( “%d\n”, a );/*tercetak 20*/

Linked List

  •  Lingked list adalah struktur data dinamik yang dimana elemennya dapat di hapus dan ditambahkan sesuka hati atau struktur data yang terdiri dari data records yang berurutan, pada setiap record ada elemen yang mengandung reference menuju record berikutnya
  • Perbedaan Linked List dengan Array:
  1. Letak memory locations acak/tidak berurutan
  2. alokasi memori lebih fleksibel tidak seperti array yang kita deklarasikan (elemen linked list bisa ditambahkan atau dikurangi kapan saja)
  3. Setiap elemen disebut node
  4. Hanya dapat diakses secara berurutan
  • Macam Linked List :
    1. Single linked list adalah linked list yang setiap node-nya hanya memiliki satu link ke node lainnya.
    2. Circular Single linked list adalah single linked list yang node terakhirnya mengandung pointer menuju ke node pertama.
    3. Double linked list adalah linked list yang setiap node-nya memiliki dua link
    4. Circular Doubly linked list mirip dengan circular single linked list, tetapi ada 2 pointer di setiap node, yang satu menuju ke node berikutnya, dan yang satu lagi menuju ke node sebelumnya.
    5. Header Linked List adalah linked list yang mempunyai node header di awal list.
     

Queque (Antrian)

  • Struktur data dimana data yang dimasukan duluan akan keluar duluan dan yang masuk terakhir akan keluar terakhir (First in first out)
  • Elemen terdepan atau yang segera keluar pada queque disebut front dan yang dibelakang atau dimasukan sesudah front disebut rear

Stack (Tumpukan)

  • Stack tipe data yang menganut prinsip LIFO (Last In First Out) / FILO (First In Last Out).
  • Stack juga dapat di representasikan sebagai array satu dimensi.

Binary Tree