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
kedua dari 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 (karena awal 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 posisi bantu:
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
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.






No comments:
Post a Comment