Selasa, 27 Februari 2018

2 - Linked List Implementation I - 2101711356 - Farhan Adji Nugroho

Session 2 – 27/2/2018
Linked List Implementation I

Sub Topics :
  •     Single Linked List
  •      Polynomial Representation
  •      Circular Single Linked List
  •      Doubly Linked List
  •      Circular Doubly Linked List
  •      Header Linked List

Linked List
Linked list merupakan struktur data (bertipe sama) yang terdiri dari sekumpulan node yang secara bersama-sama merepresentasikan sebuah urutan. Linked list juga disebut sebagai sebuah metode untuk menyimpan data dengan struktur sehingga dapat secara otomatis menciptakan suatu tempat di memory untuk menyimpan data.

Ada beberapa jenis dari linked list, antara lain :

  •       Single Linked List
Single linked list merupakan sekumpulan node, dimana masing-masing node memiliki field data dan kolom yang hanya memiliki 1 penghubung ke node lain.

Untuk membuat list, pertama kita perlu mendefinisikan struktur node untuk list.
Misalkan kita ingin membuat list integer, maka ketentuannya adalah :
struct tnode {
      int value;
      struct tnode *next;
};
struct tnode *head = 0;

  •      Single Linked List : Insert
Untuk menambah value baru, pertama kita harus mengalokasikan node baru secara dinamis dan memberikan nilai pada node tersebut dan kemudian menghubungkannya dengan linked list yang ada.

Misalkan kita ingin menambahkan node baru di depan head, maka ketentuannya adalah :
                      struct tnode *node =
                    (struct tnode*) malloc(sizeof(struct tnode));
node->value = x;
node->next  = head;
head = node;

note :  Head adalah pointer pada elemen pertama di linked list ini.

            
                            
                              Menambahkan node baru di depan head.
                         Dengan asumsi bahwa sudah ada linked list yang berisi 10,35,27.





  •      
    Single Linked List : Delete
Untuk menghapus sebuah nilai, pertama kita harus mencari lokasi node yang menyimpan nilai yang kita ingin hapus, lalu remove dan hubungkan  pada linked list yang tersisa.

Misalkan nilai yang ingin kita remove adalah x dan asumsikan bahwa x ada di dalam linked list.

Ada dua kondisi yang harus diperhatikan :
Jika x berada pada head node atau x tidak berapa pada head node.

struct tnode *curr = head;
// Jika x berada pada head node
if ( head->value == x ) {
       head = head->next;
                    free(curr);
             }
// Jika x berada pada tail node
else if(tail->value == x){
       while(curr->next!=tail) curr = curr->next;
       free(tail); tail = curr;
       tail->next = NULL;
}
// jika x tidak berada pada head node, dan mencari lokasi nilai x.
else {
       while ( curr->next->value != x ) curr = curr->next;
       struct tnode *del = curr->next;
       curr->next = del->next;
       free(del);
}


Contoh :


untuk menghapus nilai 31 dan nilai tersebut berada pada head node.






Untuk menghapus nilai 35 dan nilai tersebut tidak berada di head node.



  
  •       Polynomial Representation
Diketahui sebuah polinomial adalah : 6x3+9x2+1
Dari setiap individu dalam polinomial terdiri dari dua bagian, koefisien dan kekuatan.
6,9,7, dan 1 adalah koefisien yang memiliki 3,2,1, dan 0 sebagai kekuatan mereka masing-masing.
Setiap istilah polinomial dapat diwakili sebagai node dari linked list.
              
  •      Circular Single Linked List
Dalam circular single linked list, node terakhir berisi pointer ke node pertama dari list.
Kita dapat memiliki circular singly linked list serta circular doubly linked list. Saat melintasi circular linked list, kita dapat memulai pada setiap node dan dapat melintasi list berbagai arah, forward atau backward, hingga kita mencapai node  yangg sama di mana kita mulai. Dengan demikian, circular linked list tidak memiliki awal dan akhir.


  •      Doubly Linked List
Doubly linked list adalah jenis linked list yang berisi pointer ke berikutnya serta node sebelumnya dalam urutan yang lebih kompleks, oleh karena itu, terdiri dari tiga bagian yaitu : data, pointer ke node berikutnya, dan pointer ke sebelumnya.

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




  •      Doubly Linked List : Insert
Sama seperti dalam singly linked list, pertama kita harus mengalokasikan node baru dan menetapkan nilai node tersebut, dan kemudian kita menghubungkan node dengan linked list yang sudah ada.

Misalkan kita ingin menambahkan node baru dibelakang tail.

struct tnode *node =
      (struct tnode*) malloc(sizeof(struct tnode));
node->value = x;
node->next  = NULL;
node->prev  = tail;
tail->next  = node;
tail = node;

misalkan kita ingin menambahkan node baru di posisi tertentu (lokasi manasaja antara head dan tail) :

struct tnode *a = ??;
struct tnode *b = ??;
// node baru akan ditambahkan diantara a dan 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;

  •      Doubly Linked List : Delete
Ada 4 kondisi yang harus diperhatikan saat menghapus :
  1.       Node yang dihapus hanya node yang terdapat dalam linked list
  2.       Node yang dihapus adalah head
  3.       Node yang dihapus adalah tail
  4.       Node yang dihapus adalah bukan head atau tail.

  1.       Jika node yang dihapus hanya node
-free(head);
-head = NULL;
-tail = NULL;

 2. Jika node yang dihapus adalah head
                                     -head = head->next;
                 -free(head->prev);
                 -head->prev=NULL;

                 3. Jika node yang dihapus adalah tail
                                      -tail = tail->prev;
                 -free(tail->next);
                 -tail->next = NULL;

                 4. Jika node yang dihapus 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
Sama seperti dengan circular singly linked list, tetapi total pointer pada tiap node disini adalah 2 (dua) pointer.
                             






  •      Header Linked List
Header linked list adalah jenis dari linked list yang berisi sebuah header node pada awal list.
Jadi, dalam header linked list, START (L) tidak akan mengarah ke node pertama dari list tapi START(L) akan berisi alamat dari header node.







Farhan Adji Nugroho - 2101711356

Share:

Selasa, 20 Februari 2018

1 - Pointer, Array and Introduction to Data Structure - 2101711356 - Farhan Adji Nugroho

Session 1 (20/2/2018)

Pointer, Array, and Introduction to Data Structure

sub topics :

  • Array Review
  • Pointer Review
  • Types of Data Structures
  • Abstract Data Type


Array

Array merupakan koleksi data dengan setiap elemen data menggunakan nama yang sama dan tiap elemen data bertipe sama (Homogen). Setiap elemen array dapat diakses melalui indeks array dan indeks array dimulai dari 0 atau nol.

  • ·       Deklarasi Array & Mengakses Array

Kita sudah tahu jika setiap variabel harus di deklarasi terlebih dahulu sebelum digunakan. Konsep ini juga berlaku untuk variabel array. sebuah array harus di deklarasi juga sebelum digunakan. Bentuk umum untuk mendeklarasikan array sebagai berikut :
                       
Tipe_Data Nama_Variabel[Size]

Ø  Tipe data : Jenis-jenis yang dapat menyimpan nilai/data.(contoh : int,float,char,double).
Ø  Nama Variabel : untuk mengidentifikasi suatu tipe data/array
Ø  Size : jumlah maksimum array yang dapat menyimpan nilai.

Array memiliki beberapa dimensi :
1.     Array 1 dimensi
Contoh syntax : tipe_data nama_variabel[size];
deklarasi : int ds[5];
2.     Array 2 Dimensi
Contoh syntax : tipe_data nama_variabel[size1][size2];      
deklarasi : int ds[5][6];
3.     Array Multidimensi
Contoh syntax : tipe_data nama_variabel[size1][size2][size3][..];
Deklarasi : int ds[5][6][7][4];

  • ·       Menyimpan nilai dalam array

1.     Menginisiasi elemen
Contoh : int cb[4] = {40,50,60,70};
2.     Memasukan nilai ke elemen
Contoh : int cb[4];
               for(int i=0;i<4;i++)
                        scanf(“%d”,&cb[i]);
3.     Menetapkan nilai-nilai ke elemen
Contoh : int cb1[4],cb2[4];
            for(int i=0;i<4;i++)
                  cb2[i]=cb1[i];

  • ·       Operasi dalam Array

                 Ada beberapa operasi yang dapat dilakukan di array, diantaranya adalah :
1.     Traversal
2.     Insertion
3.     Searching
4.     Deletion
5.     Merging
6.     Sorting


🔺What is the maximum number of dimensions an array in C may have?
Theoratically no limit. The only practical limits are memory size and compilers.
I presume the only constraint is available memory for your architecture.
and also depends on the operating system and the bit used.





Pointer

Pointer merupakan variabel yang menyimpan atau menunjuk suatu alamat memori dan bukan untuk menyimpan suatu nilai. Variabel pointer hanya berisi alamat variabel lain yang berisi data tertentu.
 Operator penting yang digunakan pada pointer adalah :
1.     Ampersand (&) : operator yang digunakan untuk mendapatkan alamat memori pointer
2.     Arterisk (*) : operator yang digunakan untuk mendapat isi/nilai dari variabel pointer

Contoh mendeklarasikan pointer :
     int data=10;
     int *ptr,hasil;
     //ptr di deklarasikan sebagai pointer
     ptr=&data;
    //ptr mengambil alamat variabel data
     hasil=*ptr;
    //hasil mengambil isi dari alamat yang ditunjuk oleh ptr

🔺In C, what are the maximum numbers of asterisks that can be placed before a pointer variable?
256



Data Structure

Struktur data adalah cara untuk pengaturan data, memori komputer, dan disk penyimpanan agar dipakai secara efisien.

Beberapa contoh dari struktur data adalah :
1.     Arrays
2.     Linked lists
3.     Queues
4.     Stacks
5.     Binary Trees
6.     Hash tables

  • ·       Types of Data Structure

§  Array
koleksi data yang setiap elemen datanya menggunakan nama yang sama dan tiap elemen data bertipe sama


§  Linked Lists
Linked lists adalah kumpulan komponen yang saling berhubungan (berantai) dengan bantuan pointer, dan inti dari linked list ini adalah menggunakan satu pointer untuk menyimpan banyak data.
Linked lists merupakan struktur data yang sangat dinamis dimana tiap elemen dapat ditambah atau dihapus dimana saja.
Masing-masing komponen disebut simpul atau node



§  Queue
Queue merupakan kumpulan data di mana penambahan data (elemen) hanya melalui satu sisi, yaitu depan (head) dan penghapusan data (elemen) hanya melalui sisi belakang (tail). Sifat ini sering disebut sebagai FIFO (First In First Out) yaitu data yang masuk pertama akan keluar pertama juga dan data terakhir yang masuk akan keluar terakhir.
                         



§  Stacks
Stack bisa diartikan sebagai suatu kumpulan data yang seolah-olah ada data yang diletakkan di atas data yang lain. Namun di dalam stack, kita dapat menyisipkan data atau menghapus data melalui ujung yang sama yang disebut sebagai ujung atas stack (top of stack). Stack mempunyai sifat LIFO (Last In First Out) atau FILO (First In Last Out). Yaitu yang terakhir masuk adalah yang pertama keluar.



§  Binary Trees
Binary tree adalah sebuah pohon struktur data yang setiap simpul/nodenya memiliki paling banyak dua anak/sub tree dan setiap simpul/node berisi pointer kiri, pointer kanan, dan elemen data.








Data Type

Data type/tipe data adalah sebuah cara yang digunakan untuk menentukan jenis suatu data tersebut.
Contoh, tipe data int terdiri dari:
   o   Objek : 0, +1, -1, +2, -2, dll
   o   Operasi : +,-,*,/,%,dll

Beberapa contoh tipe data adalah int,char,float.




Abstract Data Type (ADT)

Abstract data type adalah kumpulan dari beberapa tipe data yang sama atau berbeda yang tersimpan pada sebuah variabel dengan tujuan untuk mempersingkat dan merapikan data agar tidak terbalik/tercampur dari data yang satu dengan data lainnya. Pada C/C++ memiliki konsep yang disebut class dan struct yang dapat membantu programmer dalam mengimplementasikan ADT.

Contoh ADT dalam bahasa pemograman C adalah :

            struct data{
                   char nama[30];
                   int umur;
                   float ipk;
            };



Nama : Farhan Adji Nugroho
NIM : 2101711356

Share: