Jumat, 19 Juni 2020

Kunjungan Pohon Biner (Struktur Data)

=> Kunjungan Pohon Biner

Kunjungan pada pohon biner merupakan salah satu operasi yang sering di lakukan pada suatu pohon biner tepat satu kali(binary tree transversal). Binary tree dapat di implementasikan dalam C++. Operasi ini di bagi menjadi 3 bentuk :

1. Kunjungan secara PreOrder (Depth First Order)
2. Kunjungan secara InOrder (symmetric Order)
3. Kunjungan secara PostOrder

=> Kunjungan secara PreOrder (Depth First Order)

Mempunyai urutan :
a. Cetak isi simpul yang di kunjungi (simpul akar)

b. Kunjungi cabang kiri
- jika kiri bukan kosong (tidak Null) mulai lagi dari langkah pertama,
  terapkan untuk kiri tersebut   
- jika kiri kosong (Null), lanjutkan langkah ke tiga.


c. Kunjungi cabang kanan
- jika kanan bukan kosong (tidak Null) mulai lagi dari langkah pertama,
terapkan untuk kanan tersebut.
- jika kanan kosong (Null), proses untuk node ini selesai, tuntaskan proses
yang sama untuknode yang di kunjungi sebelumnya.

Void preorder(Node *root) 
{   
if(root !=NULL)   
{   
Printf(“%d”,root ->data); 
preorder(root->kiri); 
preorder(root->kanan);  
 }   
 }





=> Kunjungan secara InOrder (symmetric Order)

Mempunyai urutan : 
a. Kunjungi cabang kiri   
 - jika kiri bukan kosong (tidak Null) mulai lagi dari langkah pertama,
   terapkan untuk kiri tersebut.
 - jika kiri kosong (Null), lanjut ke langkah kedua.

b. Cetak isi simpul yang di kunjungi (simpul akar)

c. Kunjungi cabang kanan    jika kanan bukan kosong (tidak Null) mulai lagi dari langkah pertama,
 terapkan untuk kanan tersebut

Void inorder ( Node *root ) 

 If ( root != NULL ) 
{   
 Inorder ( root -> kiri );  
 Printf ( “%d” , root ->data );   
 Inorder ( root -> kanan );   
 }   
 }   

- jika kanan kosong (Null), proses untuk node ini selesai, tuntaskan proses
yang sama untuk node yang di kunjungi sebelumnya. 





=> Kunjungan secara PostOrder  

Mempunyai urutan :

a. Kunjungi cabang kiri
- jika kiri bukan kosong (tidak Null) mulai lagi dari langkah pertama,
  terapkan untuk kiri tersebut.
- jika kiri kosong (Null), lanjut ke langkah kedua.

b. Kunjungi cabang kanan
- jika kanan bukan kosong (tidak Null) mulai lagi dari langkah pertama,
  terapkan untuk kanan tersebut.
- jika kanan kosong (Null), proses untuk node ini selesai, tuntaskan proses
  yang sama untuk node yang di kunjungi sebelumnya.

c. Cetak isi simpul yang di kunjungi (simpul akar)

Void postorder ( Node *root ) 
{   
 If ( root != NULL )
{   
 Postorder ( root -> kiri );  
 Postorder ( root -> kanan ); 
 Printf ( “%d” , root ->data );  
}   
}   




     Variabel **root pada setiap fungsi diatas menunjukan node mana yang 
sedang dikunjungi saat ini, untuk itu saat pemanggilan variable **root kita 
beri nilai pointer yangmenunjukan ke node akar. Pada ketiga cara
kunjungan di atas, kunjungan kecabang kiri di lakukan terlebih dahulu,
baru kemudian kunjungan ke cabang kanan.


      Dengan orientasi semacam ini ketiga kunjungan di atasdi sebut dengan
left to right oriented atau LRO. Jika kunjungan ke cabang kanan di lakukan lebih dahulu baru kemudian kunjungan ke cabang kiri, maka orientasi 
semacam ini di sebut right to left oriented atau RLO.


=> Penerapan dan Penyajian Pohon Biner

























Jumat, 05 Juni 2020

Konsep Queue

Konsep QUEUE

Kaidah utama dalam konsep queue adalah FIFO yang merupakan singkatan dari First In First Out, artinya adalah data yang pertama kali dimasukkan atau disimpan, maka data tersebut adalah yang pertama kali akan diakses atau dikeluarkan. Analoginya sama dengan antrian di sebuah loket pembelian tiket kereta, orang yang datang lebih dahulu, maka akan dilayani terlebih dahulu, dan akan selesai lebih dulu dari orang-orang yang datang setelahnya. Gambar di bawah ini mengilustrasikan kerja sebuah queue:



Queue pada Struktur Data atau antrian adalah sekumpulan data yang mana penambahan elemen hanya bisa dilakukan pada suatu ujung disebut dengan sisibelakang(rear), dan penghapusan(pengambilan elemen) dilakukan lewat ujung lain (disebut dengan sisi depan atau front) Queue atau antrian prinsip yang digunakan adalah“Masuk Pertama Keluar Pertama” atau FIFO (First In First Out). Queue atau antrian banyak kita jumpai dalam kehidupan sehari-hari, ex: antrian Mobil diloket Tol, Antrian mahasiswa Mendaftar, dll. Contoh lain dalam bidang komputer adalah pemakaian sistem komputer berbagi waktu(time-sharing computer system) dimana ada sejumlah pemakai yang akan menggunakan sistem tersebut secara serempak.

        Pada Queue atau antrian Terdapat satu buah pintu masuk di suatu ujung dan satubuah pintu keluar di ujung satunya dimana membutuhkan variabel Head dan Tail ( depan/front, belakang/rear).
      Karakteristik Queue atau antrian : 
     1. elemen antrian 
     2. front (elemen terdepan antrian) 
     3. tail (elemen terakhir) 
     4. jumlah elemen pada antrian 

     5. status antrian Operasi pada Queue atau antrian 

Operasi-operasi dasar dalam queue

Pada dasarnya, operasi-operasi dasar pada queue mirip dengan operasi-operasi dasar pada stack. Perbedaannya hanya pada prosedur push dan pop saja. Pada queue, prosedur yang berfungsi untuk memasukkan data atau nilai ke dalam antrian adalah enqueue, sedangkan prosedur untuk mengeluarkan data atau nilai dari antrian adalah dequeue.

a. Prosedur createEmpty

Sama pada stack, prosedur ini berfungsi untuk mengosongkan queue dengan cara meletakkan HEAD dan TAIL pada indeks array ke-0. Berikut deklarasi prosedur createEmpty pada queue dalam Bahasa C++:

void createEmpty()
{
antrian.HEAD = 0;
antrian.TAIL = 0;
}

b. Prosedur enqueue

Prosedur ini digunakan untuk memasukkan sebuah data atau nilai ke dalam queue. Sebelum sebuah data/ nilai dimasukkan ke dalam queue, maka prosedur ini terlebih dahulu melakukan pengecekan terhadap posisi HEAD dan TAIL. Jika posisi HEAD dan TAIL masih berada pada indeks ke-0 (artinya queue masih kosong), maka prosedur ini akan menempatkan HEAD dan TAIL pada indeks ke-1 terlebih dahulu, baru setelah itu memasukkan data/ nilai ke dalam array data queue. Namun, jika posisi HEAD dan TAIL tidak berada pada posisi ke-0, maka posisi TAIL yang akan dinaikkan satu level. Jadi, pada proses enqueue, TAIL-lah yang berjalan seiring masuknya data baru ke dalam antrian, sedangkan HEAD akan tetap pada posisi ke-1. Berikut deklarasi prosedur enqueue dalam Bahasa C:


Pada deklarasi prosedur enqueue di atas, prosedur memiliki sebuah parameter formal yang bernama X yang bertipe integer. Ini berguna untuk menerima kiriman nilai dari program utama ( void main () ) yakni berupa sebuah bilangan integer yang akan dimasukkan ke dalam queue. Gambar di bawah ini mengilustrasikan proses enqueue ke dalam sebuah queue yang masih kosong.

c. Prosedur dequeue

Prosedur ini digunakan untuk mengeluarkan atau membuang sebuah data/ nilai yang paling awal masuk (yang berada pada posisi HEAD, yakni yang paling depan dari antrian) ke dalam queue. Pekerjaan yang dilakukan oleh prosedur ini adalah menaikkan nilai HEAD satu level. Jadi, setiap satu kali data dikeluarkan, maka posisi HEAD naik bertambah satu level. Misalkan HEAD berada pada indeks ke-1, maka ketika akan mengeluarkan atau menghapus data pada posisi paling depan (pada posisi HEAD), prosedur ini akan menaikkan posisi HEAD ke indeks array ke-2. Berikut deklarasi prosedur pop dalam Bahasa C++:
void Dequeue()
 {
        if (q.head > q.tail)
    {
        q.head = 0;
        q.tail = 0;
     }
       q.head = q.head + 1;
 }

Ketika posisi HEAD sudah melewati posisi TAIL (HEAD > TAIL), berarti sudah tidak ada lagi data/ nilai di dalam queue tersebut, maka saat itu terjadi, HEAD dan TAIL dikembalikan ke posisi ke-0. Gambar di bawah ini mengilustrasikan cara kerja prosedur dequeue:

Ketika nilai terakhir (yakni nilai 3) dikeluarkan, maka posisi HEAD dan TAIL akan menjadi seperti ini:



Maka, ketika kondisi HEAD > TAIL terjadi seperti ilustrasi di atas, maka HEAD dan TAIL dikembalikan ke indeks array ke-0.


d. Fungsi IsEmpty

Sama seperti fungsinya pada stack, fungsi ini berfungsi untuk melakukan pengecekan terhadap queue, apakah queue tersebut kosong atau tidak. Jika queue tersebut kosong (artinya, HEAD dan TAIL berada pada posisi 0, atau bisa juga ketika HEAD > TAIL), maka fungsi akan mengembalikan nilai 1 (true), tetapi jika queue tersebut tidak kosong/ berisi (artinya, HEAD dan TAIL tidak berada pada posisi 0), maka fungsi akan mengembalikan nilai 0 (false). Berikut deklarasi fungsi IsEmpty dalam Bahasa C++:


e. Fungsi IsFull

Fungsi ini berfungsi untuk melakukan pengecekan terhadap queue, apakah queue tersebut penuh atau tidak. Jika queue tersebut penuh (artinya, TAIL berada pada posisi MAX), maka fungsi akan mengembalikan nilai 1 (true), tetapi jika queue tersebut tidak penuh (artinya, TAIL tidak berada pada posisi MAX), maka fungsi akan mengembalikan nilai 0 (false). Berikut deklarasi fungsi IsFull dalam Bahasa C ++ :


Contoh Code QUEUE :

#include<iostream.h>
#include<conio.h>
#include<studio.h
#define max 10
      typedefstruct
{
 int data[max];
  
int head;
  
int tail;
}Queue;
Queue antrian;

void create()
{

void create() antrian.head=antrian.tail=-1;
}
intIsEmpty()
{
 if(antrian.tail==-1)
   return 1;
   else
   return 0;
}
 if(antrian.tail==max-1)
   return 1;
   else
   return 0;
}
void Enqueue(int data)
{
 if(
IsEmpty()==1)
   {
   antrian.head=antrian.tail=0;
   
antrian.data[antrian.tail]=data;
   
cout<<"Data "<<antrian.data[antrian.tail]<<"Masuk !!!";
   }
   else if(IsFull()==0)
   {

 antrian.tail++;
      
antrian.data[antrian.tail]=data;     cout<<"Data "<<antrian.data[antrian.tail]<<"Masuk !!!";
   }
   else if(
IsFull==1)
   {
   
cout<<"Ruangan Penuh<<”Masuk;
   
cout<<data<<"GaBisaMasuk!
   }
}
void Dequeue()
{
inti;
{inti;
   
int e = antrian.data[antrian.head];
   if(
antrian.taill==-1)
   {
cout<<"Ga ada antrian... Data Kosong"<<endI;
   }
   else
   {
    for(
i=antrian.head.i <antrian.tail-1;i++)
      {
     
antrian.data[i]=antrian.data [i+1];
      }
     
antrian.tail--;
     
cout<<"Data yang keluarterlebih dulu= "<<e<<endI;
   }
}
void clear()
{
{antrian.head=antrian.tail =-1;
   
cout<<"Duh Lega,Ruangajagasumpek... "<<endI;
   
cout<<"Data Clear";
}
void 
tampil()
{
 if(
IsEmpty ()==0)
   {

          cout<<"Data DalamAntrian"<<endl;
      cout<<"=====================================";
      cout<<endl;
      for(inti=antrian.head;i<=antrian.tail;i++)
      {
       cout<<"| " <<antrian.data[i]<<" |";
      }
   }
   else
   {
    
cout<< Gaadaantrian ...Data kosong
";
   }
}
void main()
{
intpil;
   int data;
   create();
   do
   {
  cout<<"ImplementasiAntriandenganStruct"<<endl;
      cout<<"==========================================";
      cout<<endl;
      cout<<"1. Enqueue"<<endl;
      cout<<"2.Dqueue "<<endl;
      cout<<"3. Print "<<endl;
      cout<<"4. Clear "<<endl;
      cout<<"5. Exit "<<endl;
      cout<<"Masukkanpilihananda : ";
      cin>>pil;
      switch(pil)
      {
       case 1:
         {
          cout<<endl;
            cout<<"Data = ";
            cin>>data;
            Enqueue(data);
            break;
         }
         case 2:

         {
          cout<<endl;
            Dequeue();
            break;
         }
         case 3:
         {
          cout<<endl;
            tampil();
            break;
         }
         case 4:
         {
          cout<<endl;
            clear();
            break;
         }
      }
      getch();
   }
   while(pil!=5);
}
          {
          cout<<endl;
            Dequeue();
            break;
         }
         case 3:
         {
          cout<<endl;
            tampil();
            break;
         }
         case 4:
         {
          cout<<endl;
            clear();
            break;
         }
      }
      getch();
   }
   while(pil!=5);




CONTOH QUEUE DALAM KEHIDUPAN SEHARI – HARI    

      Dalam kehidupan sehari-hari kita bisa dapati melalui penerapan pembelian tiket kereta api, tiket pesawat, tiket kapal laut, pembayaran tiket tol, pembayaran listrik, pembayaran air, dan lain sebagainya. Walaupun berbeda implementasi, Konsep struktur data queue adalah First In First Out(FIFO). Queue setidaknya harus memiliki operasi-operasi sebagai berikut:
  1. EnQueue : Masukkan data ke dalam antrian
  2.  DeQueue : Mengeluarkan data terdepan dari antrian
  3.  Clear : Menghapus seluruh antrian.
  4. IsEmpty : Memeriksa apakah antrian kosong
  5. IsFull : Memeriksa apakah antrian penuh
      
Dalam pembelian tiket kereta api:

Enqueue : Seseorang membeli tiket melalui tempat pembayaran tiket yang disediakan.
Dequeue : Setelah membeli tiket, langsung menuju tempat penungguan kereta, dengan sebelumnya petugas memeriksa cek tiket tersebut.
Clear : Pembeli tiket tersebut telah terhapus dari antrian karena sudah melewati pembayaran administrasi tersebut.
IsEmpty : Petugas tiket Kereta melihat tidak ada lagi yang ingin membeli tiket kereta.
IsFull : Petugas Tiket Kereta melihat masih ada pembeli tiket kereta.
       
   Contohnya yaitu antrian pada kasir pada sebuah bank. Ketika seorang pelanggan datang, akan akan maju. Jika kita ada di antrian kedua, maka kita akan menunggu antrian pertama melakukan prosesnya. Nah, ketika selesai proses dari antrian pertama dia akan pergi, dan menuju ke belakang dari antrian. Setiap pelanggan dilayani, antrian yang berada di depan giliran kita untuk maju untuk melakukan proses. Begitu juga arti dari antrian dalam bahasan kali ini, jika pengantri pertama datang maka dia juga yang akan keluar pertama kali atau bahasa kerennya tu FIFO ( First In First Out ).
     Kondisi antrian yang menjadi perhatian :
 `1,  PENUH
         Bila elemen pada antrian mencapai kapasitas maksimum antrian, maka tidak mungkin dilakukan penambahan ke antrian. Penambahan elemen menyebabkan kondisi kesalahan overfl
   2.  KOSONG
        Bila tidak ada elemen pada antrian, maka tidak mungkin dilakukan pengambilan elemen dari antrian. Pengambilan elemen menyebabkan kondisi kesalahan overflow.
       KARAKTER QUEUE ATAU ANTRIAN
       1.  Adanya elemen antrian yaitu item – item data yang terdapat pada              element antrian.
      2. Adanya front ( elemen antrian )
      3. Adanya tail ( elemen terhkir )
      4. Status antrian
      5. Adanya jumlah elemen pada antrian 




Deklarasi Queue dalam program

Sebuah queue di dalam program komputer dideklarasikan sebagai sebuah tipe bentukan baru, di dalam Bahasa C, biasa disebut struct. Sebuah struktur data dari sebuah queue setidaknya harus mengandung dua tiga variabel, yakni variabel HEAD yang akan berguna sebagai penanda bagian depan antrian, variabel TAIL yang akan berguna sebagai penanda bagian belakang antrian dan ARRAY DATA dari yang akan menyimpan data-data yang dimasukkan ke dalam queue tersebut. Berikut adalah syntax untuk mendeklarasikan struktur data dari sebuah queue menggunakan Bahasa C++:
   typedef struct
{
       int HEAD, TAIL;
       int data[max+1];
} Queue;


Dimana, nilai MAX didefinisikan sebagai jumlah tumpukan maksimum yang dapat disimpan dalam queue. Setelah strukutur data dari queue didefinisikan dengan syntax di atas, maka setelah itu dapat dibuat variabel-variabel baru yang mengacu pada tipe data Queue di atas, misalkan membuat sebuah variabel bernama antrian yang bertipe Queue 

Queue antrian;

Dalam paper ini, sebuah queue didefinisikan dengan array berukuran MAX + 1, maksudnya adalah agar elemen array ke-0 tidak digunakan untuk menyimpan data, melainkan hanya sebagai tempat „singgah‟ sementara untuk variabel HEAD dan TAIL. Sehingga, jika HEAD dan TAIL berada pada elemen array ke-0, berarti queue tersebut dalam kondisi kosong (tidak ada data yang disimpan). Berikut adalah ilustrasi dari sebuah queue kosong dengan ukuran nilai MAX = 6:




Sabtu, 02 Mei 2020

KONSEP POINTER DAN LINKED LIST

# Pengertian dan Konsep Pointer


A. Pengertian Pointer 
     Pointer adalah sebuah variabel yang berisi alamat lain. Suatu pointer dimaksudkan untuk menunjukan ke suatu alamat memori sehingga alamat dari suatu variabel dapat diketahui dengan mudah.
Intinya :

-  Pointer adalah suatu variabel yang menunjuk ke alamat memory variabel yang lainnya.

-  Variabel pointer berisi suatu alamat (alokasi memory).

B. Fungsi Pointer 

Kegunaan pointer yang utama adalah untuk menyimpan alamat memori dari sebuah variabel dan alamat
dari sebuah fungsi. Pointer dapat meningkatkan kinerja untuk operasi yang dilakukan secara berulang.

C. Operator Pointer

Ada 2 operator pointer yang dikenal secara luas, yaitu operator “&” dan operator “*”.
a.  Operator & 
Operator  &  merupakan  operator  alamat.  Pada  saat  pendeklarasian  variabel,    user  tidak
diharuskan  menentukan  lokasi  sesungguhnya  pada  memory,  hal  ini  akan  dilakukan  secara
otomatis oleh kompiler dan operating sysem pada saat run-time. 
Jika ingin mengetahui dimana suatu variabel akan disimpan, dapat dilakukan dengan  memberikan
tanda ampersand (&) didepan variable , yang berarti "address of".
Contoh :
Misalkan variabel DATA_1 diletakkan pada alamat memory 1770, kemudian dituliskan instruksi
sbb :
         DATA_1 = 27;      Variabel DATA_1 berisi data 27
         DATA_2 = DATA_1;    Variabel DATA_2 diberi isi seperti DATA_1, yaitu 27
         DATA_3 = &DATA_1;    Variabel DATA_3 berisi alamat memory DATA_1, yaitu 1770

b.  Operator *

Operator * merupakan operator reference. Dengan menggunakan pointer,kita dapat mengakses
nilai  yang  tersimpan  secara  langsung  dengan  memberikan  awalan  operator  asterisk  (*)  pada
identifier pointer, yang berarti "value pointed by".

Contoh :

Melanjutkan deklarasi sebelumnya, jika ada penulisan variabel berikut
DATA_4 = *DATA_3
Dapat dikatakan bahwa DATA_4 sama dengan nilai yang ditunjuk oleh DATA_3.
DATA_3 berisi alamat memory 1770, sementara memory 1770 menampung data bernilai 27.
Jadi DATA_4 berisi nilai yang berada pada alamat 1770, yaitu 27.

D. Contoh Penerapan Program 


#include <stdio.h>

main(){
    int *pointer;
    int DATA1;
DATA1=27;
    printf(" Isi variabel DATA1 = %d",DATA1);
    printf("\n Alamat variabel DATA1 = %d",&DATA1);
    printf("\n Alamat variabel *pointer = %d",&pointer);
    printf("\n Isi variabel *pointer = %d",pointer);
pointer=&DATA1;
    printf("\n Alamat variabel *pointer = %d",&pointer);
    printf("\n Isi variabel *pointer = %d",pointer);
    printf("\n Isi dari alamat %d = %d",pointer,*pointer);
    printf("\n");
return 0;
}

SS Program :





# Pengertian dan Konsep Linked List

Pengertian Single LinkList dalam Struktur Data

Linked List saling terhubung dengan bantuan variabel pointer Masing-masing data dalam Linked List disebut dengan node (simpul) yang menempati alokasi memori secara dinamis dan biasanya berupa struct yang terdiri dari beberapa field.


Single : artinya field pointer-nya hanya satu buah saja dan satu arah serta pada akhir node, pointernya menunjuk NULL.

Linked List : artinya node-node tersebut saling terhubung satu sama lain. Setiap node pada linked list mempunyai field yang berisi pointer ke node berikutnya, dan juga memiliki field yang berisi data. Node terakhir akan menunjuk ke NULL yang akan digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list.
Jenis Single LinkList
  • Single linked list dengan HEAD
  • Single linked list dengan HEAD dan TAIL

Deklarasi Single LinkList

Model struktur dari linked list tersebut dalam Java adalah sebagai berikut:

public class Node { 

private int data; /* integer data diisikan dalam node */ 
Node nextNode; /* node selanjutnya dalam list */ 
Node(){ 
this.data = 0; this.nextNode = null; 
}

Pembuatan Single Linked List

 Keyword new gunanya untuk mempersiapkan sebuah node baru berserta alokasi memorinya, kemudian node tersebut diisi data dan pointer nextnya ditunjuk ke NULL.

 public void buatNode (int dt) {
        Node nodebaru = new Node();
        nodebaru.data = dt;
        nodebaru.next = pointer;
        pointer = nodebaru;
    }


Penambahan data dari depan

Pada prinsipnya adalah mengkaitkan node baru dengan head, kemudian head akan menunju pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan.

public boolean sisip (int dt1, int dt2) {
        Node n = pointer;
        while ((n!=null) && (n.data!= dt2))
            n = n.next;
        if (n==null) return  false;
        Node nn = new Node ();
        nn.data=dt1;
        nn.next=n.next;
        n.next=nn;
        return true;
    }


Menghapus data dari depan

Function di atas akan menghapus data terdepan (pertama) yang ditunjuk oleh head pada linked list, Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer. Sebelum data terdepan dihapus, head harus ditunjukkan ke node sesudahnya terlebih dahulu agar list tidak putus, sehingga node setelah head lama akan menjadi head baru (data terdepan yang baru). Jika head masih NULL maka berarti data masih kosong!

public int hapusDiDepan () {
        Node hapus = pointer;
        pointer = pointer.next;
        return hapus.data;
    }





# Single Linked List non Circular 


Single : field pointer-nya hanya satu dan satu arah,pada akhir node pointernya menunjuk NULL


Linked List : node-node tersebut saling terhubung satu sama lain.

Setiap node pada linked list mempunyai field yang berisi pointer ke node berikutnya, dan juga memiliki field yang berisi data.

Node terakhir akan menunjuk ke NULL yang akan digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list.

Pembuatan Single Linked List non Circular



Deklarasi Node :


  typedef struct TNode{


    int data;


    TNode *next;


};

Keterangan : Pembuatan struct bernama TNode yang berisi 2 field, yaitu field data bertipe integer dan field next yang bertipe pointer dari TNode.

Fungsi Inisialisasi Single Linked List



void init()                                                          
{


    head = NULL;


}

Function untuk mengetahui kondisi Single Linked List



Jika pointer head tidak menunjuk pada suatu node maka kosong


                int isEmpty()


                {


                if (head == NULL) return 1;


                else return 0;


                }

Menambah Node di Depan

  • Penambahan node baru akan dikaitan di node paling depan, namun pada saat pertama kali (data masih kosong), maka penambahan data dilakukan dengan cara: node head ditunjukkan ke node baru tersebut.
  • Prinsipnya adalah mengkaitkan node baru dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan.

Menambah Node di Depan dengan C++
void insertDepan(int databaru)
{
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1)
{
     head=baru;
     head->next = NULL;
}
else
{
     baru->next = head;
     head = baru;
}
printf(”Data masuk\n”);
}

Menambah Node di Belakang

  • Penambahan data dilakukan di belakang, namun pada saat pertama kali, node langsung ditunjuk oleh head.
  • Penambahan di belakang membutuhkan pointer bantu untuk mengetahui node terbelakang. Kemudian, dikaitkan dengan node baru.
  • Untuk mengetahui data terbelakang perlu digunakan perulangan.

Menambahan node dibelakang dengan C++
void insertBelakang (int databaru)
{
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1) {
  head=baru;
  head->next = NULL;
}
else {
  bantu=head;
  while(bantu->next!=NULL){
   bantu=bantu->next;
 }
 bantu->next = baru;
}
printf("Data masuk\n“);
}

Menghapus Node di Depan

  • Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penggunakan suatu pointer lain (hapus) yang digunakan untuk menunjuk node yang akan dihapus, barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete.
  • Sebelum data terdepan dihapus, terlebih dahulu head harus menunjuk ke node berikutnya agar list tidak putus, sehingga node setelah head lama akan menjadi head baru  
  • Jika head masih NULL maka berarti data masih kosong! 
Menghapus Node didepan dengan C++
void hapusDepan ()
{
TNode *hapus;
int d;
if (isEmpty()==0){
  if(head->next != NULL){
     hapus = head;
     d = hapus->data;
     head = head->next;
     delete hapus;
} else {
     d = head->data;
     head = NULL;
 }
 printf(“%d terhapus\n“,d);
 } else cout<<"Masih kosong\n";

}

Menghapus Node di Belakang


  • Membutuhkan pointer bantu dan hapus. Pointer hapus digunakan untuk menunjuk node yang akan dihapus, pointer bantu untuk menunjuk node sebelum node yang dihapus yang akan menjadi node terakhir.
  • Pointer bantu digunakan untuk menunjuk ke nilai NULL. Pointer bantu selalu bergerak sampai sebelum node yang akan dihapus, kemudian pointer hapus diletakkan setelah pointer bantu. Selanjutnya pointer hapus akan dihapus, pointer bantu akan menunjuk ke NULL.

Menghapus node dibelakang dengan C++
void hapusBelakang(){
   TNode *hapus,*bantu;
   int d;
   if (isEmpty()==0){
    if(head->next != NULL){
            bantu = head;
            while(bantu->next->next!=NULL){
            bantu = bantu->next;
            }
            hapus = bantu->next;
            d = hapus->data;
                  bantu->next = NULL;
            delete hapus;
   } else {
            d = head->data;
            head = NULL;
   }
   printf(“%d terhapus\n“,d);
  } else printf(“Masih kosong\n“);

}


# Single Linked List non Circular Menggunakan Head


- Dibutuhkan satu buah variabel pointer : head 

- Head akan selalu menunjuk pada node pertama

Deklarasi Pointer Penunjuk Kepala Single Linked List
Manipulasi linked list tidak bisa dilakukan langsung ke node yang dituju,
melainkan harus melalui node pertama dalam linked list. Deklarasinya sebagai berikut:

TNode *head;

Fungsi Inisialisasi Single LinkedList
void init(){
head = NULL;
}

Function untuk mengetahui kosong tidaknya Single LinkedList
int isEmpty(){
if(head == NULL) return 1;
else return 0;
}

PENAMBAHAN DATA
Penambahan data di depan
Penambahan node baru akan dikaitan di node paling depan, namun pada saat
pertama kali (data masih kosong), maka penambahan data dilakukan pada
head nya.
Pada prinsipnya adalah mengkaitkan data baru dengan head, kemudian head
akan menunjuk pada data baru tersebut sehingga head akan tetap selalu
menjadi data terdepan. Untuk menghubungkan node terakhir dengan node
terdepan dibutuhkan pointer bantu.

void insertDepan(int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;

if(isEmpty()==1){
head=baru;
head->next=head;
}
else {
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
baru->next = head;
head = baru;
bantu->next = head;
}
cout<<"Data masuk\n";
}

Penambahan data di belakang Penambahan data dilakukan di belakang, namun pada saat pertama kali data langsung ditunjuk pada head-nya. Penambahan di belakang lebih sulit karena kita membutuhkan pointer bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan data baru. Untuk mengetahui data terbelakang perlu digunakan perulangan.

void insertBelakang (int databaru)
{
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
head->next=head;
}
else {
bantu = head;
while(bantu->next != head){
bantu=bantu->next;
}
bantu->next = baru;
baru->next = head;
}
cout<<"Data masuk\n";
}

“Bagaimana dengan penambahan di tengah?”

MENAMPILKAN DATA
Function untuk menampilkan isi single linked list
void tampil(){ TNode *b;
b = head;
if(isEmpty()==0)
{
do
{
cout<data<<" ";
b=b->next;
}
while(b!=head);
cout<<<"Masih kosong\n";
}

- Function di atas digunakan untuk menampilkan semua isi list, di mana linked list ditelusuri satu-persatu dari awal node sampai akhir node. Penelusuran ini dilakukan dengan menggunakan suatu variabel node bantu, karena pada prinsipnya variabel node head yang menjadi tanda awal list tidak boleh berubah/berganti posisi.
- Penelusuran dilakukan terus sampai node terakhir ditemukan menunjuk ke head lagi. Jika belum sama dengan head, maka node bantu akan berpindah ke node selanjutnya dan membaca isi datanya dengan menggunakan field next sehingga dapat saling berkait.
- Jika head masih NULL berarti data masih kosong!

PENGHAPUSAN DATA
Function untuk menghapus data terdepan

void hapusDepan ()
{ TNode *hapus,*bantu;
if (isEmpty()==0)
{
int d;
hapus = head; d = head->data;
if(head->next != head){
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
head = head->next;
delete hapus;
bantu->next = head;
}else{
head=NULL;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}

- Function di atas akan menghapus data teratas (pertama) yang ditunjuk oleh head  pada linked list
- Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus ditampung dahulu pada variabel hapus dan barulah kemudian menghapus variabel hapus dengan menggunakan perintah delete.
- Sebelum data terdepan dihapus, head harus ditunjukkan ke data sesudahnya  terlebih dahulu sehingga data setelah head lama akan menjadi head baru (data terdepan yang baru).
- Jika head masih NULL maka berarti data masih kosong!

Penghapusan data di belakang:

void hapusBelakang()
{ TNode *hapus,*bantu;
if (isEmpty()==0)
{
int d;
hapus = head;
if(head->next == head){
head = NULL;
}
else
{
bantu = head;
while(bantu->next->next != head){
bantu = bantu->next;
}
hapus = bantu->next;
d = bantu->data;
bantu->next = head;
delete hapus;
}
cout<<<" terhapus\n";
}
else
cout<<"Masih kosong\n";
}

- Membutuhkan pointer bantu dan hapus.
- Pointer hapus digunakan untuk menunjuk node yang akan dihapus, dan pointer bantu digunakan untuk menunjuk node sebelum node yang dihapus.
- Pointer bantu akan digunakan untuk menunjuk ke nilai NULL.
- Pointer bantu akan selalu bergerak bersama dengan pointer hapus tapi letak pointer bantu harus selalu dibelakang pointer hapus.

Function untuk menghapus semua elemen Linked List

void clear(){ TNode *bantu,*hapus;
bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
}

# Single Linked List non Circular Menggunakan Head dan Tail

  • Dibutuhkan dua variabel pointer : head dan tail
  • Head selalu menunjuk pada node pertama, sedangkan tail selalu menunjuk pada node terakhir.
  • Kelebihan dari Single Linked List dengan Head & Tail adalah pada penambahan data di belakang, hanya dibutuhkan tail yang mengikat node baru saja tanpa harus menggunakan perulangan pointer bantu.

Menggunakan Head dan Tail

Inisialisasi Linked List
               TNode *head, *tail;

Fungsi Inisialisasi Linked List
          void init(){
            head = NULL;
            tail = NULL;
          }
Function untuk mengetahui kondisi LinkedList kosong / tidak
          int isEmpty(){
             if(tail == NULL) return 1;
             else return 0;
           }

Menambah Node di Depan Dengan Head dan Tail
void insertDepan(int databaru){
  TNode *baru;
  baru = new TNode;
  baru->data = databaru;
  baru->next = NULL;
  if(isEmpty()==1){
      head=tail=baru;
      tail->next=NULL;
     }
else {
   baru->next = head;
   head = baru;
 }
 printf(”Data masuk\n”);

}

Menambah Node di Belakang Dengan Head dan Tail
void tambahBelakang(int databaru){
     TNode *baru,*bantu;
     baru = new TNode;
     baru->data = databaru;
     baru->next = NULL;
     if(isEmpty()==1){
      head=baru;
      tail=baru;
      tail->next = NULL;
     }
     else {
            tail->next = baru;
            tail=baru;
   }
   printf("Data masuk\n“);
}

Menghapus Node di Depan (Dengan Head dan Tail)
void hapusDepan(){
     TNode *hapus;
     int d;
     if (isEmpty()==0){
            if(head!=tail){
              hapus = head;
              d = hapus->data;
              head = head->next;
              delete hapus;
            } else {
              d = tail->data;
              head=tail=NULL;
            }
             printf(“%d terhapus\n“,d);
       } else printf("Masih kosong\n“);

}

Menghapus Node di Belakang (Dengan Head dan Tail)
void hapusBelakang(){
   TNode *bantu,*hapus;
   int d;
   if (isEmpty()==0){
           bantu = head;
           if(head!=tail){
                while(bantu->next!=tail){
                bantu = bantu->next;
                }
                hapus = tail;
                tail=bantu;
                d = hapus->data;
                delete hapus;
                tail->next = NULL;
}else {
                d = tail->data;
                head=tail=NULL;
      }
      cout<<d<<" terhapus\n";
   } else cout<<"Masih kosong\n";

}

Penggambaran untuk menambah dan menghapus node di posisi tengah pada :

  • Single Linked List dengan Head
  • Single Linked List dengan Head & Trail
ILUSTRASI/PENGGAMBARAN UNTUK MENAMBAH DAN MENGHAPUS NODE DI POSISI TENGAH PADA.

SINGLE LINKED DENGAN HEAD

# include <iostream.h>

# include <conio.h>
struct TNode{
char data[15];
TNode *next;
};
TNode *head;
int opsi = 0;
void init(){
head = NULL;
}
bool isEmpty(){
if (head ==NULL) return true;
else return false;
}
void tambahdepan(){
TNode *baru;
baru = new TNode;
cout << "Masukkan DATA : ";
cin >> baru-> data;
baru->next = NULL;
clrscr();
if(isEmpty()==true){
head=baru;
head->next = NULL;
}else {
baru->next = head;
head = baru;
}
}
void tambahbelakang(){
TNode *baru,*bantu;
baru = new TNode;
cout << "Masukkan DATA  : ";
cin >> baru-> data;
baru->next = NULL;
clrscr();
if(isEmpty()== true){
head=baru;
head->next = NULL;
} else {
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next;
}
bantu->next = baru;
}
}
void tambahtengah(){
TNode *baru, *bantu;
int posisiSisip;
if(isEmpty()== false){
cout<<"Akan disisip setelah Data Ke ? : "; cin>>posisiSisip;
bantu=head;
baru=new TNode;
for(int i=1;i<posisiSisip;i++){
if(bantu->next!=NULL)
bantu=bantu->next;
else break;
}
cout << "Masukkan DATA  : ";
cin >> baru-> data;
baru->next=bantu->next;
bantu->next=baru;
clrscr();
}
else cout<<"Mau sisip tengah Belum ada data !! …silahkan masukkan Data dula aja…..";
}
void hapusdepan() {
TNode *hapus;
if (isEmpty() == false){
if(head->next !=NULL){
hapus = head;
head = head->next;
delete hapus;
clrscr();
} else {
head = NULL;
}
}else {
cout<<"Data anda masih kosong !!!!\n";
}
}
void hapusbelakang(){
TNode *hapus, *bantu;
if (isEmpty()==false){
if(head->next !=NULL){
bantu = head;
while(bantu->next->next!=NULL){
bantu = bantu->next;
}
hapus = bantu->next;
bantu->next = NULL;
delete hapus;
clrscr();
} else {
head = NULL;
}
} else {
cout<<"Data anda masih kosong !!!!\n";
}
}
void hapustengah(){
int banyakdata,posisiSisip,poshapus;
TNode *hapus, *bantu;
if(isEmpty()== false){
cout<<" Akan dihapus pada data ke : "; cin>>posisiSisip;
banyakdata=1;
bantu=head;
while(bantu->next!=NULL)
{
bantu=bantu->next;
banyakdata++;
}
if((posisiSisip<1)||(posisiSisip>banyakdata)){
cout<<"Belum ada data !! …silahkan masukkan Data dula aja…..\n";
}else {
bantu=head;
poshapus=1;
while(poshapus<(posisiSisip-1))
{
bantu=bantu->next;
poshapus++;
}
hapus=bantu->next;
bantu->next=hapus->next;
delete hapus;
clrscr();
}
}
else cout<<"Data Masih kosong, tidak bisa hapus data dari tengah! ";
}
void display(){
clrscr();
TNode *bantu;
bantu = head;
if(isEmpty()==true){
cout<<"Data masih kosong\n";
} else {
cout<<endl<<"DATA LINKED LIST\n";
while(bantu!=NULL){
cout<<"--------------- "<<endl;
cout<<"DATA    : " << bantu->data << " ";
cout<<endl;
bantu=bantu->next;
cout<<"--------------- "<<endl;
}
cout<<endl;
}
}
void main(){
int();
do{
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"-:: MENU PILIHAN::-"   <<endl;
cout<<endl;

cout<<"1. Tambah Simpul dari Depan."   <<endl;
cout<<"2. Tambah Simpul dari Belakang."   <<endl;
cout<<"3. Tambah Simpul dari Tengah."   <<endl;
cout<<"4. Hapus Simpul dari Depan."   <<endl;
cout<<"5. Hapus Simpul dari Belakang."   <<endl;
cout<<"6. Hapus Simpul dari Tengah."   <<endl;
cout<<"7. Tampil Data."   <<endl;
cout<<"8. Keluar."   <<endl;
cout<<endl;
cout<< "Pilihan Menu : ";
cin >> opsi;
switch(opsi){
case 1 : tambahdepan();break;
case 2 : tambahbelakang();break;
case 3 : tambahtengah();break;
case 4 : hapusdepan();break;
case 5 : hapusbelakang();break;
case 6 : hapustengah();break;
case 7 : display();break;
}
}while (opsi != 8);
}

# Perbedaan Array dan Linked Lis

A. ARRAY
Variable bertipe array adalah suatu tipe data yang bersifat statis (urutan dan ukuran sudah pasti).
Kelemahan dari array statis adalah penggunaan ruang memori yang sudah digunakan tidak dapat dihapus apabila nama variable array tersebut sudah tidak digunakan kembali dalam suatu program (penyebab kemubaziran).
Untuk pemecahannya maka digunakan struktur data dinamis dengan menggunakan variable dinamis.
Variabel dinamis tidak dapat dideklarasikan  secara eksplisit seperti halnya variable statis dan tidak dapat ditunjuk oleh identifier secara langsung, tetapi dapat ditunjuk secara khusus oleh variable dinamis yaitu POINTER.


ARRAY
  1. Elemen data bisa menggunakan RECORD.
  2. Bersifat Statis
    • volumenya selalu tetap tidak tergantung pada jumlah data.
    • alokasi memori dilakukan pada saat array didefinisikan.
    • pembebasan memori dilakukan pada saat program berhenti.
  3. Cara akses bersifat random dengan menggunakan nomor index.
B. LINKED LIST
-Struktur ini terdiri dari rangkaian elemen yang saling berhubungan / berkaitan, dimana setiap elemen dihubungkan dengan elemen lainnya oleh sebuah pointer.
-Pointer, sel yang nilainya merupakan alamat sel yang lain dimana sel yang lain itu dapat berupa data atau berupa pointer juga
-Setiap elemen dalam linked list selalu berisi pointer
Istilah – istilah
*Simpul, terdiri dari dua bagian :
  a.  Bagian/medan data (info)
  b.  Bagian/medan sambungan (pointer yang menunjuk kesimpul berikutnya)
*Awal (First), variable yang berisi alamat yang menunjuk lokasi simpul pertama linked list
*Nil / Null, Tidak bernilai yaitu menyatakan tidak mengacu kealamat manapun.
*Akhir, sebuah simpul yang menunjuk pada simpul terakhir

LINKED LIST
  1. Elemen data selalu menggunakan RECORD.
  2. Bersifat Dinamis
    • ukurannya berubah-ubah disesuaikan dengan kebutuhan.
    • alokasi memori ditentukan pada saat data baru dibuat.
    • pembebasan memori dilakukan setiap ada penghapusan data.
  3. Cara akses ke masing-masing class data dilakukan secara linier (selalu dimulai dari elemen pertama).
Array VS Linked List