05.01.2015 Views

2. POINTER dan SINGLE LINK LIST - iLab

2. POINTER dan SINGLE LINK LIST - iLab

2. POINTER dan SINGLE LINK LIST - iLab

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>2.</strong> <strong>POINTER</strong> <strong>dan</strong> <strong>SINGLE</strong> <strong>LINK</strong> <strong>LIST</strong><br />

TUJUAN PRAKTIKUM<br />

1. Praktikan mengetahui tipe struktur data baru yaitu tipe data Pointer.<br />

<strong>2.</strong> Praktikan menggunakan pointer didalam pembuatan program <strong>dan</strong> dapat<br />

menerapkannya dalam sebuah variabel dinamik (Link List).<br />

3. Praktikan mengetahui perbedaan antara variabel Pointer, Variabel Statis <strong>dan</strong><br />

Variabel Dinamis.<br />

TEORI PENUNJANG<br />

Pada pertemuan sebelumnya telah dijelaskan mengenai variabel yang<br />

bertipe Array, suatu tipe data yang bersifat statis (ukuran <strong>dan</strong> urutannya sudah<br />

pasti). Selain itu ruang memori yang dipakai oleh variabel tersebut tidak dapat<br />

dihapus jika variabel tersebut tidak digunakan kembali.<br />

Untuk mengatasi masalah diatas maka pascal menawarkan suatu fasilitas<br />

yang di mungkinkan suatu pengubah/variabel bersifat dinamis. Variabel dinamis<br />

adalah suatu variabel yang akan dialokasikan hanya pada saat diperlukan, yaitu<br />

setelah program dieksekusi. Variabel-variabel ini juga dapat dihapus pada saat<br />

program dieksekusi, sehingga ukuran variabel akan selalu berubah.<br />

<strong>2.</strong>1. Variabel Pointer<br />

Variabel dinamik tidak dapat dideklarasikan secara eksplisit seperti halnya<br />

mendeklarasikan variabel statik <strong>dan</strong> tidak dapat secara langsung ditunjukkan oleh<br />

suatu pengenal (identifier). Variabel dinamik hanya dapat ditunjukkan oleh<br />

variabel khusus yang berisi alamat memori yang digunakan oleh variabel dinamik<br />

tersebut. Variabel khusus ini disebut juga dengan variabel pointer. Variabel<br />

Pointer adalah suatu variabel yang menunjuk ke alamat memori yang digunakan<br />

untuk menampung data yang akan diproses.<br />

Lab. Teknik Informatika – Struktur Data 1


Deklarasi Variabel Pointer :<br />

Var : ^<br />

Contoh Pendeklarasian :<br />

Var<br />

JumlahData : ^Integer;<br />

NamaSiswa : ^String[25];<br />

NilaiSiswa : ^Real;<br />

Pendeklarasian variabel pointer tidak jauh berbeda dengan pendeklarasian<br />

variabel biasa, hanya perlu ditambahkan simbol topi ( ^ ) – biasa juga disebut<br />

ceret atau circumflex. Simbol topi tersebut menandakan bahwa variabel tersebut<br />

menunjuk ke lokasi tertentu di memori.<br />

<strong>2.</strong><strong>2.</strong> Operasi Pada Pointer<br />

Pada pointer ada dua operasi dasar yang dapat dilakukan yaitu :<br />

1. Operasi mengkopi simpul<br />

<strong>2.</strong> Operasi mengkopi isi simpul<br />

Untuk memahami operasi di atas perhatikan contoh berikut. Pertama kali kita<br />

deklarasikan variabel pointernya, yaitu :<br />

Var<br />

P1, P2 : ^Byte;<br />

Posisi P1 <strong>dan</strong> P2 di memory sekarang ini adalah P1 menunjuk ke tipe data Byte<br />

<strong>dan</strong> P2 juga menunjuk ke tipe data Byte.<br />

P1<br />

<br />

P2<br />

<br />

Lab. Teknik Informatika – Struktur Data 2


Jika kita mengisi variabel P1 dengan 5 san P2 dengan 8 maka posisi P1 <strong>dan</strong> P2<br />

sekarang adalah :<br />

P1:=5; P2:=8;<br />

P1<br />

5<br />

P2<br />

8<br />

Jika kita memberikan statement :<br />

P1:=P2;<br />

Maka gambar diatas berubah menjadi :<br />

P1<br />

5<br />

P2<br />

8<br />

Dari gambar diatas dapat di perhatikan bahwa sekarang pointer P2 juga<br />

menunjuk ke simpul yang ditunjuk oleh pointer P1. Simpul yang tadinya ditunjuk<br />

oleh P2 menjadi terlepas. Dalam keadaan seperti ini, karena tidak ditunjuk oleh<br />

suatu pointer lain, maka simpul tersebut tidak bisa dimasuki lagi karena lokasi<br />

simpul tersebut dalam variabel tidak diketahui lagi (kecuali apabila simpul ini<br />

ditunjuk oleh pointer yang lain). Operasi inilah yang disebut dengan operasi<br />

mengkopi pointer.<br />

adalah :<br />

Kita kembali lagi ke gambar sebelumnya. Jika statemen yang diberikan<br />

P1^:=P2^;<br />

Lab. Teknik Informatika – Struktur Data 3


Maka hasil yang kita peroleh adalah :<br />

P1<br />

5<br />

P2<br />

5<br />

Operasi inilah selanjutnya yang disebut dengan operasi mengkopi isi simpul.<br />

<strong>2.</strong>3. Variabel Dinamik<br />

Variabel dinamik dibentuk dengan menggunakan variabel pointer yang telah<br />

dialokasikan. Pengalokasian variabel ini menggunakan statement New(). Jika kita<br />

tidak membutuhkan variabel dinamik yang telah kita bentuk maka kita dapat<br />

menghapusnya dari memory dengan menggunakan statemen Dispose(). Sampai<br />

saat ini kita baru membentuk satu buah variabel dinamik.<br />

Jika kita memakai banyak variabel dinamis maka kita akan membutuhkan<br />

banyak variabel pointer. Oleh karena itu ada baiknya jika kita hanya<br />

menggunakan satu variabel pointer saja untuk menyimpan banyak data dengan<br />

metode yang kita sebut dengan link list.<br />

<strong>2.</strong>4. Linked List<br />

Link list merupakan suatu variabel yang bertipe pointer yang membentuk<br />

suatu untaian yang saling berhubungan. Tiap untaian tersebut diletakkan pada<br />

memory. Tempat yang disediakan pada suatu area memori tertentu untuk<br />

menyimpan data dikenal dengan sebutan Node/Simpul. Linked list juga disebut<br />

dengan seranai beranai merupakan suatu variabel pointer yang simpulnya bertipe<br />

Record.<br />

Gambar <strong>2.</strong>1 Simpul-simpul yang membentuk seranai beranai<br />

Lab. Teknik Informatika – Struktur Data 4


Deklarasi Linked List di dalam Pascal :<br />

Type<br />

PSimpul = ^Simpul<br />

Simpul = Record<br />

Info : Tipe Data;<br />

Next : PSimpul;<br />

End;<br />

Var<br />

Head, Tail : PSimpul;<br />

Variabel Head <strong>dan</strong> Tail selanjutnya dialokasikan dengan statement New(), yang<br />

dihasilnya nantinya merupakan link list yang sudah terbentuk.<br />

Ada beberapa hal yang harus diketahui mengenai link list, diantaranya adalah :<br />

1. Link list selalu memiliki pointer petunjuk yang selalu menunjuk pada awal<br />

dari list yang disebut Head.<br />

<strong>2.</strong> Link list juga selalu memiliki pointer petunjuk menunjuk pada akhir dari list<br />

yang disebut Tail, kecuali untuk jenis circular.<br />

3. Setiap simpul yang terbentuk selalu memiliki nilai NIL, kecuali jika simpul<br />

tersebut sudah ditunjuk oleh simpul yang lainnya (Link list belum<br />

terhubung).<br />

4. Posisi simpul terakhir pada link list selalu bernilai NIL karena ia tidak<br />

menunjuk pada simpul yang lainnya, kecuali bentuk circular.<br />

5. Operasi yang dapat dilakukan pada Link List diantaranya adalah :<br />

a. Menambah Simpul (di Depan, Belakang <strong>dan</strong> Tengah).<br />

b. Menghapus Simpul (di Depan, Belakang <strong>dan</strong> Tengah).<br />

c. Membaca isi link list (Membaca maju <strong>dan</strong> mundur).<br />

Struktur umum Link List dapat dilihat pada gambar <strong>2.</strong>2 dibawah ini:<br />

Lab. Teknik Informatika – Struktur Data 5


Info<br />

next<br />

NIL<br />

Head<br />

Tail<br />

Gambar <strong>2.</strong>2 Struktur Umum Link List<br />

<strong>2.</strong>5. Operasi Pada Link List<br />

Ada tiga jenis operasi pada link list, yaitu :<br />

1. Menambah Simpul<br />

Menambah simpul pada link list ada tiga macam yaitu menambah di depan,<br />

belakang <strong>dan</strong> tengah, tapi hanya penambahan yang umum dipakai saja oleh link<br />

list yang akan dibahas yaitu penambahan simpul dibelakang. Selanjutnya<br />

penambahan yang lain akan dibahas pada pertemuan-pertemuan selanjutnya.<br />

Penambahan di belakang maksudnya menambahkan simpul-simpul baru pada<br />

posisi Tail. Gambar <strong>2.</strong>3 ini merupakan ilustrasi penambahan simpul di<br />

belakang.<br />

Head<br />

Tail<br />

Temp<br />

A B C D E<br />

a.<br />

Head<br />

Tail<br />

Temp<br />

A B C D E<br />

b.<br />

Head<br />

Tail<br />

Temp<br />

A B C D E<br />

c.<br />

Gambar <strong>2.</strong>3 Ilustrasi Penambahan Simpul di Posisi Tail<br />

Lab. Teknik Informatika – Struktur Data 6


Berikut ini merupakan procedure Tambah simpul pada Pascal :<br />

Procedure Tambah(Var Head, Tail : PSimpul; Elemen : Char);<br />

Var Temp : PSimpul;<br />

Begin<br />

New(Temp);<br />

Temp^.Info := Elemen;<br />

If Head = NIL Then { Jika Link List Masih Kosong }<br />

Head := Temp<br />

Else<br />

Tail^.Next := Temp; { Gambar <strong>2.</strong>3.b. }<br />

Tail := Temp; { Gambar <strong>2.</strong>3.c. }<br />

Tail^.Next := NIL;<br />

End;<br />

<strong>2.</strong> Menghapus Simpul<br />

Operasi menghapus simpul juga ada tiga macam yaitu menghapus simpul di<br />

depan, belakang <strong>dan</strong> tengah. Untuk menghapus sebuah simpul diperlukan satu<br />

buah tambahan variabel pointer yaitu variabel bantu yang berguna untuk<br />

menunjukkan simpul manakah yang akan dihapus. Procedure Hapus<br />

selengkapnya adalah sebagai berikut :<br />

Procedure Hapus(Var Head, Tail : PSimpul; Elemen : Char);<br />

Var Temp1, Temp2 : PSimpul;<br />

Begin<br />

If Head = NIL Then { Jika Link List Masih Kosong }<br />

Writeln(‘Link List Masih Kosong’)<br />

Else If Head^.Info = Elemen Then { Simpul Pertama dihapus<br />

}<br />

Begin<br />

Temp2:=Head;<br />

Lab. Teknik Informatika – Struktur Data 7


Head := Temp2^.Next;<br />

Dispose(Temp2);<br />

End<br />

Else {Menghapus simpul tengah / }<br />

Begin {Akhir }<br />

Temp1 := Head<br />

{ Memulai proses pencarian elemen yang akan dihapus }<br />

While (Elemen Temp1^.Info) And (Temp1^.Next NIL)<br />

Do<br />

Temp1 := Temp1^.Next;<br />

If Temp2 NIL Then { Jika simpul ketemu }<br />

Begin<br />

{ Jika Simpul yang di cari ada di tengah }<br />

If Temp2 Tail Then<br />

Temp1^.Next := Temp2^.Next<br />

Else<br />

Begin<br />

Tail := Temp1;<br />

Tail^.Next := NIL;<br />

End;<br />

Dispose(Temp2);<br />

End<br />

Else<br />

{ Simpul yang akan dihapus tidak ketemu }<br />

Writeln(‘Simpul Tidak di ketemukan !’);<br />

End;<br />

End;<br />

3. Membaca Isi Link List<br />

Ada dua jenis untuk membaca isi link list yaitu membaca maju <strong>dan</strong> membaca<br />

mundur.<br />

Lab. Teknik Informatika – Struktur Data 8


a. Membaca Maju<br />

Membaca maju artinya membaca isi seranai beranai mulai posisi Head<br />

sampai ke posisi Tail. Berikut ilustrasi pembacaan isi simpul beserta<br />

prosedur pembacaannya :<br />

Head<br />

Temp<br />

Tail<br />

A B C D<br />

E<br />

Gambar <strong>2.</strong>4 Ilustrasi pembacaan dari Head ke Tail<br />

Procedure Baca_Maju(Head : PSimpul);<br />

Var Temp : PSimpul;<br />

Begin<br />

Temp := Head;<br />

Repeat<br />

Write(Temp^.Info,’ ‘);<br />

Temp := Temp^.Next<br />

Until Temp NIL;<br />

End;<br />

b. Membaca Mundur<br />

Membaca mundur artinya membaca isi seranai beranai mulai posisi Tail<br />

sampai ke posisi Head. Berikut ilustrasi pembacaan isi simpul beserta<br />

prosedur pembacaannya :<br />

Head<br />

Tail<br />

A B C D<br />

E<br />

Gambar <strong>2.</strong>5 Ilustrasi pembacaan dari Tail ke Head<br />

Procedure Baca_Mundur(Temp : PSimpul);<br />

Lab. Teknik Informatika – Struktur Data 9


Begin<br />

If Temp NIL Then<br />

Begin<br />

Baca_Mundur(Temp^.Next);<br />

Write(Temp^.Info,’ ‘);<br />

End;<br />

End;<br />

Ada berbagai jenis linked list, contoh diatas merupakan seranai beranai<br />

tunggal (Single Link List). Adapun jenis-jenis link list antara lain adalah :<br />

1. Single Link List / Link list satu arah (One Way List)<br />

Disebut demikian karena pada setiap simpul hanya memiliki satu buah field<br />

yang berhubungan dengan simpul berikutnya. Dalam pembuatan Single Link<br />

List dapat menggunakan 2 metode, yaitu:<br />

LIFO (Last In First Out), aplikasinya : Stack (Tumpukan)<br />

LIFO adalah suatu metode pembuatan Link List dimana data yang masuk<br />

paling akhir adalah data yang keluar paling awal.<br />

FIFO (First In First Out), aplikasinya : Queue (Antrian)<br />

LIFO adalah suatu metode pembuatan Link List dimana data yang masuk<br />

paling awal adalah data yang keluar paling awal juga.<br />

Link list ini memiliki beberapa variasi lain diantaranya :<br />

a. Header Single Link List : Jenis single link list yang memiliki simpul<br />

tambahan pada awal simpul yang berguna untuk informasi tambahan.<br />

Contoh dibawah ini merupakan header single link list yang pada simpul<br />

header-nya berisi informasi mengenai banyaknya simpul di dalam list.<br />

Head<br />

Tail<br />

4<br />

A B C D<br />

Gambar <strong>2.</strong>6 Header Single Link List<br />

Lab. Teknik Informatika – Struktur Data 10


. Circular Single Link List : Jenis single link list yang tidak pernah<br />

mempunyai tail atau tidak pernah NIL selalu berputar Head = Tail;<br />

Head<br />

A B C D E<br />

Gambar <strong>2.</strong>7 Circular Single Link List<br />

c. Header Circular Single Link List : Jenis circular single link list yang<br />

memiliki simpul tambahan di awal sebagai informasi tambahan. Contoh<br />

dibawah ini merupakan circular header single link list yang pada simpul<br />

headernya berisi informasi mengenai banyaknya simpul di dalam list.<br />

Head<br />

4 A B C D<br />

Gambar <strong>2.</strong>8 Header Circular Single Link List<br />

<strong>2.</strong> Double Link List / Link list dua arah (Two Way List)<br />

Link List ini memiliki dua buah field yang digunakan untuk menunjuk ke<br />

simpul sebelumnya <strong>dan</strong> ke simpul sesudahnya. Banyak digunakan untuk<br />

mempermudah proses pencarian simpul dalam suatu seranai beranai. Link list<br />

ini memiliki beberapa variasi lain diantaranya :<br />

a. Header Double Link List : Jenis double link list yang memiliki simpul<br />

tambahan pada awal simpul yang berguna untuk informasi tambahan.<br />

b. Circular Double Link List : Jenis double link list yang tidak pernah<br />

mempunyai tail atau tidak pernah NIL selalu berputar Head = Tail;<br />

c. Header Circular Double Link List : Jenis circular double link list yang<br />

memiliki simpul tambahan di awal sebagai informasi tambahan.<br />

Lab. Teknik Informatika – Struktur Data 11


LAPORAN PENDAHULUAN<br />

1. Jelaskan pengertian dari:<br />

a. Variabel Statis<br />

b. Variabel Dinamis<br />

c. Variabel Pointer.<br />

<strong>2.</strong> Bagaimana cara pendefinisian Variabel Pointer & Variabel Dinamis.<br />

3. Apa yang dimaksud dengan Head, Tail <strong>dan</strong> NIL.<br />

4. Jelaskan mengenai operasi pada pointer.<br />

5. Jenis-jenis Link List <strong>dan</strong> operasi pada link list.<br />

MATERI PRAKTIKUM<br />

1. Mengetahui Variabel Statis, Dinamis <strong>dan</strong> Pointer terutama perbedaan<br />

diantara ketiganya.<br />

<strong>2.</strong> Mengetahui jenis-jenis link list (keseluruhan jenisnya) minimal dengan<br />

menggunakan bagan/gambar atau juga dapat dengan program sederhana.<br />

3. Membuat program-program sederhana berupa pendefinisan link list <strong>dan</strong><br />

operasi-operasi link list.<br />

4. Membuat program menu pulldown dengan menggunakan link list. Menu<br />

pulldown terdiri dari Create link list, insert link list, delete link list, search<br />

link list <strong>dan</strong> exit main menu. Menu-menunya diisi semua kecuali search<br />

link list.<br />

5. Nilai K (Keterampilan) didapat jika praktikan dapat mengisi menu<br />

pulldown search link list.<br />

LAPORAN AKHIR<br />

Buat Algoritma <strong>dan</strong> program sederhana dari Link List.<br />

Lab. Teknik Informatika – Struktur Data 12

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!