Saturday, 29 November 2014


POINTER
Pengertian pointer (Santoso, 1992) adalah suatu tipe data yang dapat digunakan untuk mengalokasikan dan mendealokasikan (mengambil / mengurangi) pengingat secara dinamis, yaitu sesuai dengan kebutuhan pada saat suatu program dieksekusi.
Data bertipe pointer merupakan suatu fasilitas yang dimiliki pernrograrnan bahasa Pascal untuk mengatasi tipe data yang bersifat statis, misaInya data bertipe larik yang penyimpanannya dalam pengingat terbatas, data yang tersimpan dalam perubah tidak boleh melebihi pesanan yang telah dideklarasikan. Gambar 3. menunjukkan ilustrasi perubah statis dan dinamis.



    
Gambar 1. llustrasi perubah statis dan dinamis

Gambar diatas bisa dijelaskan sebagai berikut. Pada gambar 3.a. perubah A adalah perubah statis. Dalam hal ini 1000 adalah nilai data yang sesungguhnya dan disimpan pada perubah (lokasi) A. Pada gambar 3.b. perubah A adalah perubah dinamis. Nilai perubah ini misalnya adalah 10. Nilai ini bukan nilai data yang sesungguhnya, tetapi lokasi dimana data yang sesunggulmya berada. Jadi dalam hal ini nilai data yang sesungguhnya tersimpan pada lokasi 10.
Dari ilustrasi di atas bisa dilihat bahwa nilai perubah dinamis akan digunakan untuk menunjuk ke lokasi lain yang befisi data sesungguhnya yang akan diproses. Karena alasan inilah perubah dinamis lebih dikenal dengan sebutan pointer yang artinya kira kira menunjuk ke sesuatu.
Dalam perubah dinamis, nilai data yang ditunjuk oleh suatu pointer biasanya disebut sebagai simpul/node.

Struktur Data.
Struktur data yang dimaksud disini adalah struktur data yang digunakan dalam data bertipe pointer. Data bertipe pointer ditandai dengan meletakkan tanda ^ didepan nama simpul pada deklarasinya.
Simpul bisa dideklarasikan sebagai sebuah record yang berisi field field data yang bertipe selain pointer dan field field yang bertipe pointer.
Field bertipe pointer dalam sebuah record bisa satu buah (untuk single link list), bisa dua buah (untuk double link list) dan sebagainya.
Single link list hanya bisa menunjuk ke satu arah, sedang double link list bisa menunjuk ke dua arah.
Dalam pemrograman bahasa Pascal, struktur data bertipe pointer yang bersifat dinamis berbeda dengan tipe data lainnya yang besifat statis.
Bentuk umum deklarasi pointer adalah sebagai berikut:

Type pengenal = ^simpul;
simpul = tipe;

dengan pengenal          : nama pengenal yang menyatakan data bertipe pointer.
            Simpul                : nama simpul.
            Tipe                     : tipe dari simpul.
Tanda ^ didepan nama simpul harus ditulis apa adanya dan menunjukkan bahwa pengenal adalah suatu tipe data pointer. Tipe data simpul yang dinyatakan dalam tipe bisa berupa sembarang tipe data, misainya char, integer, real, rekaman (record) dan sebagainya.
Contoh:

Type patkiang = string [301;
           pegawai=.^simpul;
           simpul = record
                     Nama  : panjang;
                     Alamat : panjang;
                     pekerjaan: patkiang;
                    End;

Var P1,P2: pegawai;
Deklarasi pada contoh diatas sifat kedinamisannya masih tersamar, karena jika dfinginkan sejumlah simpul aktif dalam pengingat, maka kita perlu menyediakan sejumlah pointer yang sesuai. Dengan demikian seolah olah tidak ada perbedaan yang nyata antara perubah statis dengan dinamis. Gambar 4. menunjukkan medan informasi pada simpul pointer P1 dan P2.
Dari gambar 4. terlihat ada kemiripan dengan perubah statis tanpa larik.

Gambar 2. ilustrasi medan informasi pada simpul pointer P I dan P2.

Jika benar benar diinginkan mempunyai perubah yang bersifat dinamis, harus ditarnbalikan satu medan lagi dalarn rekaman yang mampu menunjuk simpul lain, yang disebut dengan medan penyambung dengan tipenya sama dengan tipe pointer awal (P1). Deklarasinya struktur data untuk single link list dapat diubah menjadi:

Type panjang = string[30];
           pegawai= 'I simpul;
           simpul = record
                      Nama      : panjIang;
                      Alamat    : panjang;
                      Pekerjaan : panjang;
                      berikut   : pegawai;
                 End;
Var PI : pegawai;

Gambar 3. menunjukkan ilustrasi simpul dengan medan informasi, medan penyambung dan senarai berantai dari single link list.



  
Gambar 3. Ilustrasi simpul dengan medan informasi, medan penyambung dan
senarai berantai

Gambar 3.a. menunjukkan suatu simpul dengan medan informasi berisi nama, alamat, pekerjaan dan medan penyambung yang bertipe pointer. Garnbar 3.b. menunjukkan senarai berantai yang dapat dibentuk dari deklarasi diatas, ada kemiripan dengan data yang bertipe larik.
Demikian pula untuk deklarasi struktur data doubly link list dapat diubah menjadi:
     Type panjang = string [301;

          pegawai= Simpul;
          simpul = record
                    Nama       : panjang;
                    Alamat     : panjang;
                    pekerjaan  : panjang;
                    kiri,kanan : pegawai;
               End;
 Var P1 : pegawai;

Gambar 4. menunjukkan ilustrasi simpul dengan medan informasi, medan penyambung dan senarai berantai dari doubly link list.
Gambar 4. a. menunjukkan suatu simpul dengan medan penyambung kiri, medan informasi berisi nama, alamat, pekedaan dan medan penyambung kanan yang bertipe pointer. Gambar 4.b. menunjukkan senarai berantai yang dapat dibentuk dari deklarasi struktur data doubly link list.

Kegunaan.
Kegunaan yang utarna dari data bertipe pointer adalah untuk mengatasi kekurangan yang terdapat pada data yang bertipe larik. Misalnya ada deklarasi sebagai berikut (dalam bahasa Pascal): var Tabel : array [ 1.. 100, 1.. 50] of integer;






Gambar 4. Ilustrasi simpul dengan medan penyambung kiri, medan informasi,
medan penyambung kanan dan senarai berantai

              Perubah tabel di atas hanya mampu untuk menyimpan data sebanyak 5000 buah data, tidak boleh lebih, proses akan terhenti jika perubah tabel digunakan lebih dari 5000 buah data. Sebaliknya, pengingat/penyimpan mengalami banyak kekosongan jika perubah tabel hanya sedikit yang digunakan, misalnya yang digunakan hanya 10 buah data, maka sisanya sebanyak 4990 pengingat dibiarkan kosong.
Penggunaan data bertipe pointer adalah untuk mengolah data yang banyaknya tidak bisa dipastikan sebelumnya, bisa lebih dari 5000 buah data atau kurang dari 10 buah data.
Pengingat yang digunakan data yang bertipe pointer bisa sebanyak banyaknya tergantung dari kemampuan pengingat komputer yang digunakan dan tidak ada pengingat yang dibiarkan kosong jika jumlah data yang diolah hanya sedikit.

Teknik.
Teknik pengoperasian pointer secara umum dibagi kedalam kelompok kelompok sebagai berikut:
1. Baru
2. Tambah:
          a. Awal (depan)
          b. Tengah
          c. Akhir
3. Hapus:
          a. Awal (depan)
          b. Tengah
          c. Akhir

Ketiga teknik pengoperasian pointer diatas diberlakukan untuk ilustrasi ilustrasi:
1.    Senarai berantai tunggal tanpa kepala, yaitu kumpulan komponen yang disusun secara berurutan dengan bantuan pointer. Masing masing komponen dinamakan dengan simpul (node).
2.     Senarai berantai tunggal berkepala, yaitu senarai berantai yang diawali sebuah simpul sebagai kepala dengan bantuan pointer menyambung ke sekumpulan simpul yang disusun secara berurutan.
3.     Senarai berantai tunggal berkepala dan memutar, yaitu sama seperti no. 2. Diatas, tetapi simpul terakhir menyambung kembali ke simpul kepala.
4.     Senarai berantai ganda berkepala, yaitu senarai berantai yang diawali sebuah simpul sebagai kepala dengan bantuan pointer menyambung kiri tidak menunjuk ke simpul yang lain (nil) dan pointer penyambung kanan menunjuk ke sekumpulan simpul yang disusun secara berurutan. Pointer penyambung kiri dari simpul yang ditunjuk pointer penyambung kanan simpul kepala kembali menunjuk ke simpul sebelumnya. Pointer penyambung kanan simpul terakhir tidak menunjuk ke simpul yang lain (nil).
5.     Senarai berantai ganda berkepala dan memutar, yaitu sama seperti no. 4. diatas, tetapi pointer penyambung kiri simpul kepala menunjuk ke simpul terakhir dan pointer menyambung kanan simpul terakhir menunjuk ke simpul kepala, jadi tidak ada pointer yang bernilai nil.

Selain ketiga teknik pengoperasian pointer diatas, ditambah lagi teknik menukar posisi simpul yang sering diterapkan pada pengurutan data (sortir) dan teknik penelusuran yang sering diterapkan pada pohon (tree).

Contoh contoh dasar operasi pointer:
Apabila dideklarasikan tipe pointer sebagai berikut:

type simpul = Data;
    Data = record
Nama     : string;
alamat   : string;
berikut  : simpul;
         end;
var
T1J2 : simpul;



1. Senarai berantai (linked list)
Pada penjelasan tentang pointer diatas telah dijelaskan bahwa senarai berantai bersifat dinamis yang dapat mengatasi kekurangan yang terdapat pada data bertipe larik yang bersifat statis.

Penyajian Senarai berantai:
Penyambung pada setiap simpul digunakan untuk menunjuk kesimpul lain, jika pointer (penunjuk) bemilai nill, berarti suatu simpul tidak menunjuk ke simpul lain. Contoh senarai berantai dapat dilihat pada gambar 5. berikul ini:



  


Gambar 5. Contoh senarai berantai tunggal (single link list)

Dari gambar 5. diatas dapat dijelaskan sebagai berikut:
Pointer awal menunjuk simpul pertama yang berisi info A, dari medan penunjuk simpul pertama menunjuk simpul kedua yang berisi info B dan seterusnya hingga akhirnya simpul terakhir tidak menunjuk ke simpul yang lain lagi (nil).

Operasi pada senarai berantai:
1. Operasi pointer pada senarai berantai tunggal
Sebelum membicarakan operasi pointer pada senarai berantai tunggal (single link list) yang diberlakukan untuk semua operasi operasi data bertipe pointer terlebih dahulu disampaikan deklarasi umum sebagai berikut:
type Simpul = ^Data;
Data = record
         info    : char;
         berikut : simpul;
      end;
var
  elemen            : char;
  awal, akhir, haru : Simpul;

a. Simpul baru
Simpul baru dapat ditambahkan pada senarai berantai dengan perintahperintah:

Readln(elemen);             
new(baru);
baru^.info := elemen;
baru^.berikut := nil;
awal := baru;
akhir := baru;      

b. Tambah simpul
Untuk sernua proses penambahan baris pertama dan keduadari program simpul baru diatas selalu digunakan. Penambahan Simpul pada senarai berantai tunggal dibagi kedalam beberapa cara, yaitu:
1. Tambah di belakang:
Untuk menambah di akhir senarai, terlebih dahulu ditinjau apakah senarai sudah ada atau belum, jika belum ada (awal := nil), maka program simpul baru diatas bisa digunakan, jika sudah ada (berarti simpul yang ditunjuk pointer akhir sudah ada), maka program berikut ini dikedakan (gambaran urutan hasilnya dapat dilihat pada garnbar 10:

Akhir^.berikut := baru;
akhir := baru;
akhir^.berikut:=nil;

2. Tambah di depan
Sama seperti tambah simpul di belakang, terlebih dahulu tinjau apakah senarai sudah ada atau belum, jika belum lakukan perintah yang sama dengan tambah dibelakang, jika sudah ada lakukan perintah berikut

baru^.berikut:= awal;
awal:=baru;

3. Penambahan di tengah
Sama dengan operasi penambahan simpul di belakang dan di depan, operasi penambahan simpul ditengah diawali dengan membuat simpul baru, mengkopi nilai elemen ke info pada simpul, meninjau apakah senarai sudah ada atau belum.
Jika pada operasi penambahan di belakang atau di depan dengan cepat ditemukan posisi peletakan simpul (karenaawal dan akhir simpul sudah diketahui), tetapi pada penambahan simpul di tengah harus dicari dahulu posisi peletakan simpul baru tersebut.
Untuk proses pencarian ini dibutuhkan pointer bantuan(pada deklarasi Var ditambahkan. nama pointer, misaInya bantu yang bertipe pointer) yang berfungsi untuk penunjuk simpul pada posisi schelum (didepan) simpul baru disisipkan.
Berikut ini adalah program untuk meletakkan posisibantu:

bantu := awal;
while elemen > bantu^.berikut^.info do
bantu := bantu^.berikut;

Program diatas mengandung pengertian bahwa selama nilai elemen lebih besar dari nilai info pada simpul setelah simpul yang ditunjuk oleh bantu maka pointer bantu menunjuk simpul berikutnya.
Gambar 12. menunjukkan ilustrasi penyisipan simpul baru di tengah, jika penunjuk bantu berhenti pada suatu simpul, programnya adalah sebagai berikut:

Baru^.berikut:=bantu^.berikut;
Bantu^.berikut := baru;

Perintah diatas jangan dibalik.

c. Hapus simpul
Seperti operasi pada penambahan simpul, operasi menghapus simpul juga bisa dibagi menjadi:
1.       hapus simpul pertarna.
2.       hapus simpul akhir
3.       hapus simpul di tengah
pada senarai berantai.
Untuk operasi penghapusan simpul nilai elemen tidak perlu di kopikan ke variabel simpul (untuk deklarasi diatas, variabelnya adalah info), karena hanya berfungsi untuk pembanding. Kemudian untuk operasi penghapusan simpul ini, selain pointer awal dan akhir dibutuhkan beberapa pointer bantuan untuk menunjuk pointeryang akan dihapus dan pointer pencari posisi simpul.
Yang terpenting dalam menghapus simpul adalah usahakan bahwa senarai jangan sampai terputus terutama, pada saat menghapus simpul ditengah.

Bustrasi penghapusan simpul:
1. Menghapus simpul di awal
 Gambar 13. dibawah mengilustrasikan penghapusan simpul yang terdapat di awal senarai, yang pada mulanya pointer awal menunjuk ke simpul terdepan dari senarai berantai.






Gambar 6. llustrasi penghapusan simpul di awal

Program penghapusan simpul di awal senarai dapat ditulis sebagai

berikut:

hapus:= awal;
awal:=hapus^.berikut; {gambarl3}
dispose (hapus);

2. Menghapus simpul di tengah
Gambar 14. dibawah menunjukkan flustrasi penghapusan simpul yang terdapat di tengah senarai berantai. Apabila lokasi simpul yang akan dihapus sudah diketemukan (setelah simpul yang ditunjuk oleh pointer bantu), maka program penghapusan tersebut adalah sebagai berikut:

hapus:=bantu^.berikut;
bantu^.berikut:=hapus^.berikut;
dispose (hapus);

3. Menghapus simpul di akhir
 Menghapus simpul di akhir senarai dapat dilakukan dengan program berikut Oika memenuffi if hapus = akhir):

akhir := bantu;
akhir^.berikut:= nil;
dispose(hapus);


Contob program:
{ contoh program pointer}
program tambah_hapus_pointer;
type Simpul = ^Data;
        Data = record
                      info : char;
                      berikut : Simpul;
                   end;
var        
     Elemen : char;
    Awal,Akhir,Baru : Simpul;
procedure inisialisasi(var awal,akhir: Simpul);
begin
   awal := nil;
   akhir := nil;
end;
procedure tambah_belakang(var awal,akhir  : Simpul;elemen : char);
var
   baru: Simpul;
begin
     new(baru);
     baru^.info=elemen;
     if awal = nil then
       awal := baru
     else
       akhir^.betikut := baru;
       akhir := baru;
       akhir^.berikut := nil;
end;
procedure tambah_depan(var awal,akhir : Simpul;elemen  : char);
var
   baru : Simpul;
begin
   new(baru);
   baru^.info := elemen;
   if awal = nil then
      akhir := baru
    else
      baru^.berikut := awal;
      awal := baru;
end;
procedure tambah_tengah(var awal,akhir : Simpul;elemen : char);
var
    baru,bantu : Simpul;
begin
    new(haru);
     baru^.info := elemen;
    if awal = nil then
      begin
         awal:=baru;
         akhir:=baru;
      end
    else
      begin
       { mencari lokasi yang sesuai }
        bantu:=awal;
        while elemen > bantu^.berikut^.info do
        bantu:=bantu^. berikut;
        {menyisipkan simpul baru}
        baru^.berikut:=bantu^. berikut;
        bantu^. berikut:=baru;
      end;
end;
procedure hapus_simpul (var awal,akhir : simpul;elemen : char);
var
    bantu,hapus : simpul;
begin
    if awal=nil then   { senarai masih kosong}
       writeln(‘Senarai masih kosong’)
    else
       if awal^.info = elemen then {simpul pertama dihapus}
         begin
           hapus:=awal;
           awal:=hapus^.berikut;
           dispose(hapus);
         end
        else {menghapus tengah atau terakhir}
        begin
            bantu:=awal; {mencari simpul yang akan dihapus}
            while (elemen <> bantu^.berikut^.info) and (hantu^. berikut<>nil) do
               bantu:=bantu^.berikut;
              hapus:=bantu^.berikut;
             if hapus<>nil then {simpul yang akan dihapus ketemu}
             begin
                  if hapus <> akhir then {simpul tengah dihapus}
                     bantu^.berikut:=hapus^.berikut
                  else {simpul terakkir dihapus}
                  begin
                      akhir:=bantu;
                      akhir^. berikut:=nil;
                  end;
               dispose(hapus);
               end else
              { simpul yang akan dihapus tidak ketemu }
               writeln(Simpul yang akan dihapus tidak ketemu');
               readln;
       end;
end;

procedure baca_tambah;
var
    menu : integer;
begin
   repeat
   clrscr;
   gotoxy (10,5);write(‘Masukkan karakter : ‘);readln(elemen);
   gotoxy (10,7);write('1. Tambah depan);
   gotoxy (10,8);write('2. Tambah tengah');
   gotoxy (10,9);write('3. Tambah akhir');
       gotoxy (10,10);write('4. Selesai);
       gotoxy (10,12); write('Pilihan : ');readln(menu);
      case menu of
             1 : tambah_depan(awal,akhir,elemen);
             2 : tambah_tengah(awal,akhir,elemen);
             3 : tambah_belakang(awal,akhir,elemen);
      end;
      until menu = 4;
end;

procedure baca_hapus;
begin
  clrscr;
  gotoxy (10,11); write('Masukkan karakter : ');readln(elemen);
   hapus_simpul (awal,akhir,elemen);
end;

procedure cetak(var awal : simpul);
var
    bantu : simpul;
begin
    bantu := awal;
   repeat
       write(bantu^.info:2,');
       bantu:=bantu^. berikut;
   until bantu = nil;
   readln;
end;

{ program utama }
begin
    repeat
    clrscr;
    gotoxy (10,5); write('1. Tambah');
    gotoxy (10,6); write(‘2. Cetak’);
    gotoxy (10,7); write(‘3. Hapus’);
    gotoxy (10,8); wiite('4. Selesai);
    gotoxy (10,10); write('Pilihan : ');readin(pil);
    case pil of
        '1' : baca_tambah;
        '2’ : cetak(awal);
        ‘3’ : baca_hapus;
    end;
    until Pil =’4’;
end.


Soal:
Buatlah program antrian untuk pembehan karcis Bioskop, setiap ada tambahan pembeli diletakkan di akhir antrian, pembeli yang selesai dilayani dihapus dari antrian (hapus di depan) dan bagi pembeli yang batal (keluar dad antrian) segera dihapus.







0 comments:

Post a Comment