Tuesday, March 3, 2020



Data Struct

Minggu Pertama 
Linked List merupakan koleksi linear dari data, yang disebut sebagai nodes, dimana setiap node akan menunjuk pada node lain melalui sebuah pointerLinked List dapat didefinisikan pula sebagai kumpulan nodes yang merepresentasikan sebuah sequence.
Representasi sebuah linked list dapat digambarkan melalui gambar di bawah ini:
Sebuah linked list yang hanya memiliki 1 penghubung ke node lain disebut sebagai single linked list.
Di dalam sebuah linked list, ada 1 pointer yang menjadi gambaran besar, yakni pointer HEAD yang menunjuk pada node pertama di dalam linked list itu sendiri.
Sebuah linked list dikatakan kosong apabila isi pointer head adalah NULL.
Beberapa operasi yang biasanya ada di dalam sebuah linked list adalah:
  1. Push
Push merupakan sebuah operasi insert dimana di dalam linked list terdapat 2 kemungkinan insert, yaitu insert melalui depan (pushDepan) ataupun belakang (pushBelakang). Operasi pushDepan berarti data yang paling baru dimasukkan akan berada di depan data lainnya, dan sebaliknya pushBelakang berarti data yang paling baru akan berada di belakang data lainnya.
Representasinya adalah sebagai berikut:
  • pushDepan: 5, 3, 7, 9 maka hasilnya adalah: 9 ->7 ->3 -> 5 -> NULL
  • pushBelakang: 5, 3, 7, 9 maka hasilnya adalah: 5 ->3 ->7 ->9 -> NULL
  1. Pop
Pop, kebalikan dari push, merupakan operasi delete, dimana di dalam linked list memiliki 2 kemungkinan delete, yaitu melalui depan (popDepan) dan melalui belakang (popBelakang). PopDepan berarti data yang akan dihapus adalah data paling depan, dan popBelakang berarti data yang akan dihapus adalah data paling belakang (akhir).
Dalam penerapan code single linked list, umumnya hanya digunakan pointer head sebagai pointer yang menunjuk pada linked list. Namun dalam pembahasan artikel ini akan digunakan 1 pointer tambahan, yakni TAIL untuk menunjuk data terakhir di dalam linked list dalam mempermudah proses pembahasan.
Dalam artikel ini, pembahasan code menggunakan Bahasa Pemrograman C dengan library malloc.h.
Apabila didefinisikan sebuah linked list sebagai berikut:
Operasi pushDepan dapat dilakukan dengan potongan code berikut ini.
Operasi pushBelakang dapat dilakukan dengan potongan code berikut ini.
Operasi popDepan dapat dilakukan dengan potongan code berikut ini.
Operasi popBelakang dapat dilakukan dengan potongan code berikut ini.
Sedangkan untuk melihat data linked list, berikut ini adalah operasi yang biasanya digunakan:

Minggu Kedua


Single Linked List adalah salah satu bentuk implementasi dari struktur data yang paling sederhana. Seperti yang dijelaskan sebelumnya dalam konsep struktur data, single linked list bisa kita analogikan sebuah balok data dalam memory yang saling terhubung satu sama lain. Satu blok data dengan blok data lainnya dihubungkan melalui penanda berupa pointer (pointer bertugas menyimpan address blok data selanjutnya).
single_linked_list
Dalam pembelajaran struktur data, kita akan lebih sering mengenal dengan istilah :
  • Push untuk menambah data.
    • PushHead – Menambah data ke barisan paling awal
    • PushTail – Menambah data ke barisan paling akhir
    • PushMid – Menambah data ke barisan di tengah (sorting)
  • Pop untuk menghapus data.
    • PopHead – Menghapus data paling awal
    • PopTail – Menghapus data paling akhir
    • PopMid – Menghapus data ditengah (sesuai parameter value)
Contoh pembuatan single linked list untuk menyimpan nama seseorang beserta umurnya.

Deklarasi Struct

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct human{
 //menampung integer umur
 int age;
 //menampung nama manusia
 char name[30];
 //menampung alamat dari data selanjutnya
 human *next;
}*head, *tail, *current;
//head adalah pointer yang menyimpan alamat data pertama
//tail adalah pointer yang menyimpan alamat data terakhir
//current adalah pointer yang digunakan sebagai temporary variabel

Push Head

void pushHead(int age, char name[]){
 //alokasi memory untuk data baru
 current = (human*)malloc(sizeof(struct human));
 //assign data ke dalam struct
 current->age = age;
 strcpy(current->name, name);

 //apabila linked list kosong/tidak ada data
 if(head == NULL){
  head = tail = current;
 }
 //kondisi tidak kosong
 else{
  current->next = head;
  head = current;
 } 
}

Push Tail

void pushTail(int age, char name[]){
 //alokasi memory untuk data baru
 current = (human*)malloc(sizeof(struct human));
 //assign data ke dalam struct
 current->age = age;
 strcpy(current->name, name);

 //apabila linked list kosong/tidak ada data
 if(head == NULL){
  head = tail = current;
 }
 //kondisi tidak kosong
 else{
  tail->next = current;
  tail = current;
 }
 tail->next = NULL;
}

Push Mid

void pushMid(int age, char name[]){
 //alokasi memory untuk data baru
 current = (human*)malloc(sizeof(struct human));
 //assign data ke dalam struct
 current->age = age;
 strcpy(current->name, name);

 //apabila linked list kosong/tidak ada data
 if(head == NULL){
  head = tail = current;
 }
 //jika umur data yang barusan dimasukkan lebih kecil dari umur data pertama (head)
 else if(current->age < head->age){
  pushHead(age, name);
 }
 //jika umur data yang barusan dimasukkan lebih besar dari umur data terakhir (tail)
 else if(current->age > tail->age){
  pushTail(age, name);
 }
 //push ditengah-tengah
 else{
  human *temp = head;
  //mencari posisi data yang sesuai untuk diselipkan
  while(temp->next->age < current->age){
   temp = temp->next;
  }
  current->next = temp->next;
  //mengarahkan penunjuk ke alamat data baru
  temp->next = current;
 }
}

Pop Head

void popHead(){
 //inisialisasi current sebagai head
 current=head;
 //jika head kosong (tidak ada data)
 if(head==NULL){
  //cetak tidak ada data
  printf("No data");
 //jika head dan tail itu sama (hanya 1 data)
 }else if(head==tail){
  //head dan tail dikosongkan
  head=tail=NULL;
  //hapus data current (head)
  free(current);
 }else{
  //set head menjadi data selanjutnya dari head
  head=head->next;
  //hapus data current (head)
  free(current);
 }
}

Pop Tail

void popTail(){
 //jika head kosong (tidak ada data)
 if(head==NULL){
  //cetak tidak ada data
  printf("No data");
 //jika head dan tail itu sama (hanya 1 data)
 }else if(head==tail){
  //head dan tail dikosongkan
  head=tail=NULL;
  //hapus data current (head)
  free(current);
 }else{
  //buat variabel penampung baru dan assign nilai mulai dari head
  human *temp=head;
  //looping untuk mencari posisi 1 data sebelum tail
  while(temp->next!=tail){
   //temp diubah menjadi 1 data selanjutnya
   temp=temp->next;
  }
  //set data current menjadi tail
  current=tail;
  //set tail menjadi 1 data sebelum tail (hasil looping)
  tail=temp;
  //hapus data current (tail)
  free(current);
  //data setelah next dikosongkan/pointer next punya tail diberi NULL
  tail->next=NULL;
 }
}

Pop Mid

//kita akan menghapus data sesuai dengan umurnya.
void popMid(int age){
 //jika head kosong (tidak ada data)
 if(head==NULL){
  printf("No data");
 //jika umur si head(data pertama) sama dengan data umur yang mau dihapus
 }else if(head->age==age){
  //pop head
  popHead();
 //jika umur si tail(data terakhir) sama dengan data umur yang mau dihapus
 }else if(tail->age==age){
  //pop tail
  popTail();
 }else{
  //buat variabel penampung baru dan assign nilai mulai dari head
  human *temp=head;
  //looping untuk mencari posisi 1 data sebelum tail
  while(temp->next->age!=age && temp!=tail){
   //temp diubah menjadi 1 data selanjutnya
   temp=temp->next;
  }
  //set data current menjadi data selanjutnya dari temp
  current=temp->next;
  //data selanjutnya dari temp diubah menjadi 2 data setelah temp
  temp->next=temp->next->next;
  //hapus data current
  free(current);
 }
}

Pop Mid

void popAll(){
 while(head!=NULL){
  popHead();
 }
}

Print Data

void print(){
 current = head;
 while(current != NULL){
  printf("%s - %d\n",current->name,current->age);
  current = current->next;
 }
}

Main Function

int main(){
 pushMid(18, "hery");
 pushMid(17, "mahirkoding");
 pushTail(22, "andi");
 pushHead(15, "tono");
 pushMid(11, "vandoro");
 pushMid(23, "budi");
 popHead();
 popTail();
 popMid(15);
        //popAll();
 print();
 getchar();
 return 0;
}

No comments:

Post a Comment