Rabu, 27 Agustus 2014

Double linklist

Double linklist adalah sebuah list yang elemennya menyimpan informasi elemen sebelumnya dan informasi elemen setelahnya (2 penunjuk) sehingga proses penelusuran list dapat dilakukan secara maju dan mundur. Double linked list terdiri dari beberapa jenis list yaitu linked list dengan kepala dan ekor (awal, akhir), linked list dengan kepala dan double linked list berputar.
Double linked list dengan kepala dan ekor memiliki 2 penunjuk yang dapat diakses pada awal penelusuran list, yaitu penunjuk elemen awal dan penunjuk elemen akhir.


Double linked list dengan kepala, hanya memiliki sebuah penunjuk elemen di awal (first).





Double linked list berputar ditandai dengan elemen setelahnya adalah merupakan elemen pertama (awal) list.



Macam-macam operasi dalam double linked list antara lain :
A.        Penciptaan
B.        Penyisipan
C.        Penghapusan
D.        Traversal
E.        Pencarian
F.         Pengurutan
Pengurutan data dalam struktur data sangat penting untuk data yang bertipe data numerik ataupun karakter. Pengurutan dapat dilakukan secara ascending (urut naik) dan descending (urut turun). Disini penulis akan membahas tentang selection sort secara descending. Pengurutan adalah proses menyusun kembali data yang sebelumnya telah disusun dengan suatu pola tertentu, sehingga tersusun secara teratur menurut aturan tertentu.
    

Pada dasarnya selection sort adalah memilih elemen maksimum/minimum dari list, lalu menempatkan elemen maksimum/minimum itu pada awal atau akhir suatu list. Selanjutnya elemen terujung tersebut “diisolasi” dan tidak disertakan pada proses selanjutnya.
G.        Penghancuran


   
       Notasi Algoritmik
Program rekam_data_mhs_penyewa_mobil
{I.S: List diberi harga awal}
{F.S: List dalam keadaan siap digunakan}

Kamus :
   {prototype}
   Procedure penciptaan (I/O awal,akhir: point)
   Procedure sisipdepan (I/O awal,akhir:point)
   Procedure sisiptengah (I/O awal,akhir:point)
   Procedure sisipakhir (I/O awal,akhir:point)
   Procedure hapusdepan (I/O awal,akhir:point)
   Procedure hapustengah (I/O awal,akhir:point)
   Procedure hapusakhir (I/O awal,akhir:point)
   Procedure pencarian_nim (Input awal:point)
   Procedure pencarian_nama (Input awal:point)
   Procedure selection_sort (I/O awal:point)
   Procedure sewa_tersingkat (Input awal:point)
   Procedure daftar_penyewa (Input awal:point)
   Procedure penghancuran (Input awal, akhir:point)
   Procedure tampilmenu(I/O menu:char)
  
  
   {deklarasi}
               Type Point=^Data
               Datapendaftar = record
                           <          nim                  : longint,
                                       nama               : string,
                                       kota                 : string,
                                       lamasewa        : integer
                           >
                           Endrecord
                                      
               Data = record
                           <          info                  :datapendaftar,
                                       next,prev         : point 
                           >
                           Endrecord      
                          
   Awal,akhir       : point
   Menu               : char
  


   Procedure penciptaan (I/O awal,akhir: point)
   {I.S: pointer diberi harga awal}
   {F.S: pointer dalam keadaan siap digunakan}

   Algoritma :
               Awal ← nil
               Akhir ← nil
   Endprocedure

              
   Procedure sisipdepan (I/O awal,akhir:point)
   {I.S: menambahkan satu simpul baru di posisi pertama}
   {F.S: menghasilkan list dengan simpul baru di posisi pertama}

   Kamus :
               Baru : point

   Algoritma :
               alloc (baru)
               baru↑.prev ← nil
               input (baru↑.info.nim)
               input (baru↑.info.nama)
               input (baru↑.info.kota)
               input (baru↑.info.lamasewa)
                                      
               if (awal=nil) then
                           baru↑.next ← nil
                           awal ← baru
                           akhir ← baru
               else
                           baru↑.next ← awal
                           awal↑.prev ← baru
                           awal ← baru
               endif
   EndProcedure
  

   Procedure sisiptengah (I/O awal,akhir:point)
   {I.S: menyisipkan satu simpul baru sebelum simpul tertentu}
   {F.S: menghasilkan list dengan simpul baru di posisi tertentu}

   Kamus :
               baru,bantu       : point
               ketemu            : boolean
               nimdicari         : longint

   Algoritma :
               if (awal=nil) then
                           alloc (baru)
                           input (baru↑.info.nim)
                           input (baru↑.info.nama)
                           input (baru↑.info.kota)
                           input (baru↑.info.lamasewa)
                           baru↑.next←nil
                           baru↑.prev←nil
                           awal←baru
                           akhir←baru
               else     
                           input(nimdicari)
                           bantu←awal
                           ketemu←false
                          
                           {searching}
                           while (bantu≠nil) and (not ketemu) do
                                       if (bantu↑.nim=nimdicari) then
                                                   ketemu←true
                                       else
                                                   bantu←bantu↑.next
                                       endif
                           endwhile         
                          
                           {lakukan penyisipan pada simpul sebelumnya}        
                           if (ketemu) and (bantu≠awal) then
                                       {sisip tengah}
                                       alloc (baru)
                                       input (baru↑.info.nim)
                                       input (baru↑.info.nama)
                                       input (baru↑.info.kota)
                                       input (baru↑.info.lamasewa)
                                      
                                       baru↑.next←bantu
                                       baru↑.prev←bantu↑.prev
                                       bantu↑.prev↑.next←baru
                                       bantu↑.prev←baru     
                           else
                           if (bantu=awal) then
                                       output ("silahkan lakukan penyisipan depan")
                           else
                                       output ("tidak ditemukan data yang dicari")
                           endif
                           endif
               endif               
   EndProcedure
  


   Procedure sisipakhir (I/O awal,akhir:point)
   {I.S: menambahkan satu simpul baru di posisi akhir}
   {F.S: menghasilkan list dengan simpul baru di posisi akhir}
  
   Kamus:
               Baru    : point
  
   Algoritma:
               alloc (baru)
               baru↑.next ← nil
               input (baru↑.info.nim)
               input (baru↑.info.nama)
               input (baru↑.info.kota)
               input (baru↑.info.lamasewa)
                                      
               if (awal=nil) then
                           baru↑.prev ← nil
                           awal ← baru
                           akhir ← baru
               else
                           baru↑.prev ← akhir
                           akhir↑.nex t← baru
                           akhir ← baru
   EndProcedure
                          

   Procedure hapusdepan (I/O awal,akhir:point)
   {I.S: menghapus satu simpul di posisi pertama}
   {F.S: menghasilkan list dengan keadaan simpul pertama terhapus}

   Kamus :
               elemen : datapendaftar
               phapus : point
              
   Algoritma :
               if (awal = nil) then
                           output ("List masih kosong")
               else
               if (awal = akhir) then
                           phapus ← awal
                           awal ← nil
                           akhir ← nil
                           elemen↑.info ← phapus↑.info
                           dealloc (phapus)
               else
                           phapus ← awal
                           awal ← awal↑.next
                           awal↑.prev ← nil
                           elemen↑.info ← phapus↑.info
                           dealloc (phapus)
               endif
               endif
   EndProcedure
  

   Procedure hapustengah (I/O awal,akhir:point)
   {I.S: menghapus satu simpul berdasarkan posisi tertentu}
   {F.S: menghasilkan list dengan keadaan satu simpul terhapus di posisi tertentu}

   Kamus :
               elemen                        : Datapendafatar        
               phapus            : Point
               posisihapus,caposisi   : integer

   Algoritma:
               Input (posisihapus) {untuk mencari posisi hapus}
               Phapus ← awal
               Caposisi ← 1
                          
               {searching}
               while (phapus ≠ nil) and (caposis i≠ posisihapus) do
                           phapus ← phapus↑.next
                           caposisi ← caposisi+1
               endwhile         
                          
               {lakukan hapus tengah}         
               if (phapus=nil) then
                           output ("Data masih kosong atau berada diluar jangkauan")
               else
               if (awal = akhir) then  
                           awal ← nil
                           akhir ← nil
                           elemen↑.info ← phapus↑.info
                           dealloc (phapus)
               else
                           phapus↑.prev↑.next ← phapus↑.next
                           phapus↑.next↑.prev ← phapus↑.prev
                           elemen↑.info ← phapus↑.info
                           dealloc (phapus)
               endif   
               endif
   EndProcedure
  

   Procedure hapusakhir (I/O awal,akhir:point)
   {I.S: menghapus satu simpul di posisi akhir}
   {F.S: menghasilkan list dengan keadaan simpul terakhir terhapus}

   Kamus:
               Elemen            : Datapendaftar
               phapus            : Point

   Algoritma:
               if (awal = nil) then
                           output ("list masih kosong")
               else
               if (awal = akhir) then
                           phapus ← akhir
                           awal ← nil
                           akhir ← nil
                           elemen↑.info ← phapus↑.info
                           dealloc (phapus)
               else
                           phapus←akhir
                           akhir←akhir↑.prev
                           akhir↑.next←nil
                           elemen↑.info←phapus↑.info
                           dealloc (phapus)
               endif
               endif
   EndProcedure
  

   Procedure pencarian_nim (Input awal:point)
   {I.S: Melakukan pencarian data unik nim dengan sequential search with boolean}
   {F.S: Menampilkan hasil pencarian terhadap data unik nim}
  
   Kamus :
               nim_dicari       : longint
               ketemu            : boolean
               bantu               : point
              
   Algoritma :
               Input (nim_dicari)
               Bantu ← awal
               Ketemu ← false

               while (bantu ≠ nil) and (not ketemu) do
                           if (bantu↑.info.nim = nim_dicari) then
                                       ketemu ← true
                           else
                                       bantu ← bantu↑.next
                           endif
               endwhile
                          
               if (ketemu) then
                           output ("NIM ditemukan!")
                           output (bantu↑.info.nim)
                           output (bantu↑.info.nama)
                           output (bantu↑.info.kota)
                           output (bantu↑.info.lamasewa)
               else
                           output ("Tidak ditemukan penyewa dengan NIM tersebut")
               endif
   EndProcedure
  
   Procedure pencarian_nama (input awal : point)
   {I.S: Melakukan pencarian data tidak unik terhadap nama penyewa}
   {F.S: Menampilkan seluruh data hasil pencarian yang berkaitan}
  
   Kamus:
               nama_dicari    : string
               bantu               : point
              
   Algoritma:
               input (nama_dicari)
               bantu ← awal
               if (awal = nil) then
                           output ('List masih kosong')
               else     
                           while (bantu ≠ nil) do
                                       if (bantu↑.nama = nama_dicari) then
                                                   output (bantu↑.info.nim)
                                                   output (bantu↑.info.nama)
                                                   output (bantu↑.info.kota)
                                                   output (bantu↑.info.lamasewa)
                                       endif
                           bantu ← bantu↑.next
                           endwhile
               endif   
   EndProcedure
                          
   Procedure selection_sort (I/O awal: point)
   {I.S: Data sudah terdefinisi}
   {F.S: Menghasilkan data simpul yang terurut descending berdasarkan nim}

   Kamus :
               i, max, j           : Point
               Temp              : Datapendaftar

   Algoritma :
               i ← awal
               while (i↑.next ≠ nil) do
                           max ← i
                           j ← i↑.next
                           while (j≠nil) do
                                       if (j↑.info.nim>max↑.info.nim)  then
                                                   max ← j
                                       endif
                                       j ← j↑.next
                           endwhile
                          
                           {pertukaran}
                           temp ← i↑.info
                           i↑.info ← max↑.info
                           max↑.info ← temp
                          
                           i ← i↑.next
               endwhile
   EndProcedure
  
   Procedure daftar_penyewa (Input awal:point)
   {I.S: Data penyewa sudah terdefinisi}
   {F.S: Mencetak daftar penyewa ke piranti keluaran}
  
   Kamus:
               bantu : point

   Algoritma:
               if (awal = nil) then
                           output ("List masih kosong")
               else     
                           selection_sort (awal)
                           bantuawal
                           while (bantu≠nil) do
                                       output (bantu↑.info.nim)
                                       output (bantu↑.info.nama)
                                       output (bantu↑.info.kota)
                                       output (bantu↑.info.lamasewa)
                                       bantu←bantu↑.next
                           endwhile
               endif
   EndProcedure


   Procedure sewa_tersingkat (Input awal:point)
   {I.S: Data sudah terdefinisi}
   {F.S: Mencetak hasil dari lama sewa tersingkat dari total penyewa}

   Kamus:
               min, bantu       :point
              
   Algoritma:
               if (awal=nil) then
                           output("list masih kosong")
               else
                           min ← awal
                           bantu ← min↑.next
                           while (bantu≠nil) do
                                       if (bantu↑.info.lamasewa<min↑.info.lamasewa) then
                                                   min←bantu
                                       else     
                                                   bantu←bantu↑.next
                           endwhile
               endif

               output (min↑.info.nim)
               output (min↑.info.nama)
               output (min↑.info.kota)
               output (min↑.info.lamasewa)
   EndProcedure

  
   Procedure penghancuran (Input awal, akhir:point)
   {I.S : data sudah terdefinisi sebelumnya }
   {F.S : simpul dalam keadaan terhapus sepenuhnya}

   Kamus :
               phapus : point
              
   Algoritma :
               phapus←awal
               while (phapus≠nil) do
                           awal←awal↑.next
                           dealloc (phapus)
                           phapus←awal
               endwhile
               akhir←nil
   EndProcedure
  
   Procedure tampilmenu(I/O menu:char)
   {I.S: pilih menu dibaca dari piranti masukan}
   {F.S: melakukan prosedur sesuai menu dipilih}

   Algoritma:
               output ("Menu")
               output ("1. Daftar dengan Sisip Data")
               output ("2. Hapus Data")
               output ("3. Cari Data")
               output ("4. Tampil Data")
               output ("0. exit")
               Input (menu)
                        Depend on (menu)


                 (menu=1)      : output ("1. Sisip Depan")
                                         output ("2. Sisip Tengah")
                                         output ("3. Sisip Akhir")
                                         output ("4. Back")     
  Input(menu)
                                         Depend on (menu)
                                                   (menu=1)        : sisipdepan(awal,akhir)
                                                   (menu=2)        : sisiptengah(awal,akhir)
                                                   (menu=3)        : sisipakhir(awal,akhir)
                                                   (menu=4)        : clrscr
                                         EndDepend
                                                                
(menu=2)     : output ("1. Hapus Depan")
                                         output ("2. Hapus Tengah")
                                         output ("3. Hapus Akhir")
                                         output ("4. Back")     
                                         Input(menu)
                                         Depend on (menu)
                                                   (menu=1)        : Hapusdepan(awal,akhir)
                                                   (menu=2)        : Hapustengah(awal,akhir)
                                                   (menu=3)        : Hapusakhir(awal,akhir)
                                                   (menu=4)        : clrscr
                                         EndDepend
                                                                          
(menu=3)     : output ("1. Cari NIM")
                                         output ("2. Cari Nama")
                                         output ("3. Back")     
                                         Input(menu)
                                         Depend on (menu)
                                                   (menu=1)        : pencarian_nim(awal)
                                                   (menu=2)        : pencarian_nama(awal)
                                                   (menu=3)        : clrscr
                                         EndDepend
                                                                
(menu=4)     : output ("1. Daftar Penyewa")
                                         output ("2. Lama Sewa Tersingkat")
                                         output ("3. Back")     
                                         Input(menu)
                                         Depend on (menu)
                                                   (menu=1)        : daftar_penyewa(awal)
                                                   (menu=2)        : sewa_tersingkat(awal)
                                                   (menu=3)        : clrscr
                                         EndDepend
                                                                
                           (menu=0)        : clrscr
EndDepend    
   Endprocedure
  
   Algoritma:       
Penciptaan (awal,akhir)
               repeat
                           tampilmenu (menu)
               until (menu=0)
  
               penghancuran (awal,akhir)


Semoga bermanfaat 

1 komentar: