Linked List (Struktur Untaian) Dfett
Linked List (Struktur Untaian) Dfett
LIST
Materi III: Struktur Data By. Gladly C. Rorimpandey, ST, MISD Laidy Manoppo, S.Pd
PENGERTIAN POINTER
Pointer adalah sebuah penunjuk alamat pada memori yang digunakan untuk menyimpan data yang akan diproses. Perbedaan Array & Pointer
Kriteria Sifat Array Statis Dinamis Sesuai kebutuhan Pointer
Ukuran
Pasti
Suatu pointer dapat menunjuk ke data bertipe elementer, terstruktur, pointer yang lain, atau tidak bertipe. Jika suatu pointer tidak menunjuk ke manamana, pointer itu dinamakan dangling, sedangkan bagian memori yang tidak dapat diakses karena tidak ada pointer yang menunjuk dinamakan garbage (sampah).
Dalam Pascal, pointer dapat diisi dengan nilai yang berasal dari:
1. NIL
2. Fungsi Ptr 3. Operator @
Reserved word NIL NIL merupakan reserved word dalam Pascal, di mana pointer yang bernilai NIL dianggap tidak menunjuk alamat memori manapun.NIL biasa digambarkan dengan lambang ground. Fungsi Ptr Sintaks: Function Ptr(Seg, Ofs : word) : pointer; dengan Seg : segmen memori. Ofs : offset memori. Fungsi Ptr mengembalikan pointer dari segmen dan offset yang dimasukkan. Operator @ Sintaks: <nama_var>:=@<variabel_yang_alamatnya_diambil>; Operator ini digunakan untuk mengambil alamat variabel yang akan ditunjuk
CONTOH PROGRAM
Deklarasi tipe data pointer: program deklarasi; uses crt; var p : ^integer; nilai : integer; begin clrscr; nilai:=12; p:=@nilai; writeln(p^); p^:=100; writeln(p^); writeln(nilai); readln; end.
Output:
12 100 100
PEMBAHASAN
Pada contoh program deklarasi ini, pertamatama dideklarasikan variabel p sebagai pointer yang bertipe integer. Dibuat sebuah variabel lagi yang diberi nama nilai dan bertipe integer. Variabel nilai diisi dengan nilai 12. Kemudian variabel p menunjuk alamat dari variabel nilai dengan operator @, sehingga variable p berisi nilai 12, dan ditampilkan outputnya di layar. Kemudian variabel p diberi nilai 100, dan secara otomatis variabel nilai juga bernilai 100 karena sudah ditunjuk oleh variabel p. Kemudian isi dari variabel p yang baru dan variabel nilai ditampilkan di layar.
Output: alamat pointer p = 23327: 110; isi pointer p = ini string nilai!!! alamat pointer q = 24414: 0; isi pointer q = ini isi pointer q!!! alamat pointer r = 24414: 0; isi pointer r = ini isi pointer q!!! alamat pointer s = 0: 0; isi pointer s = ini isi pointer q!!!
PEMBAHASAN
Pada program ini dibuat 4 variabel pointer yang bertipe string, yaitu p, q, r, s. Dan sebuah variabel dengan nama nilai yang bertipe juga string (bukan pointer). Pertama-tama variabel nilai diisi dengan nilai ini string nilai!!!. Kemudian variabel p (pointer) menunjuk alamat dari variabel nilai dengan operator @, sehingga variabel p juga berisi ini string nilai!!!. Kemudian dipesan tempat pada heap dengan prosedur New untuk variabel q. Kemudian variabel q diisi ini isi pointer q!!!. Setelah itu variabel r menunjuk alamat dari variabel q, sehingga alamat maupun isinya sama. Kemudian variabel s diisi dengan nilai dari variabel q, tapi dalam hal ini hanya nilainya saja, sedangkan alamatnya tidak.
Back
Contoh Program
LINKED LIST
(STRUKTUR UNTAIAN)
Terdiri dari Single Linked List (Untaian Tunggal) dan Double Linked List (Untaian Ganda)
SINGLE LINKED LIST ADALAH SUATU STRUKTUR DATA YANG TERDIRI ATAS WADAH UNTUK DATA (ITEM) DAN SUATU PENUNJUK (POINTER) KE ELEMEN UNTAIAN LAINNYA.
Item Item Item
Null
Next
Next
Suatu pointer khusus disediakan untuk menunjuk ke awal untaian head, dan di akhir untaian akan menunjuk item kosong null.
PENYAJIAN LINKED LIST DALAM MEMORI 1. Array INFO(K) : Menyajikan bagian informasi
2. 3. Array LINK(K) : field nextpointer Variabel START : untuk menyimpan alamat dari elemen LIST Pada bagian akhir dari LIST, nextpointer bernilai NULL.
Procedure insertList (input x : item; in-out Head : pointer;) [ memasukkan satu elemen baru di untaian L ] Definisi Variabel thisptr,lastptr:pointer; Rincian Langkah if(Head)=null; then New(thisptr); thisptr.nextnull; thisptr.isi x; Head thisptr;
Contoh program
else
ENDIF.
THISPTR HEAD; LASTPTR NULL; WHILE (THISPTR < > NULL DO LASTPTR THISPTR; THISPTR THISPTR.NEXT; ENDWHILE NEW(THISPTR); THISPTR.NEXT NULL; LASTPTR.NEXT THISPTR; THISPTR.ISI X;
Mencari Elemen (searchList) Prosedur pencariannya sbb: 1. 2. Telusuri untaian dengan memeriksa isi elemen apakah sama dengan yang dicari Bila sama maka variabel found = true, bila tidak found = false
PROCEDURE SEARCHLIST (INPUT X:ITEM; INPUT HEAD:POINTER; OUTPUT THISPTR:POINTER; OUTPUT LASTPTR:POINTER; OUTPUT FOUND:BOOLEAN) { mencari item x dakan suatu untaian} Definisi Variabel {Tidak ada} Rincian Langkah lastptr Null; thisptr Head; found false; while (thisptr < > Null) and (not found) do if ( x < > thisptr.isi) then lastptr thisptr thisptr thisptr.next;
Kate
Lisa
Becky
Bill
LIST DATA
HEAD
FOUND FALSE;
MORETOSEARCH : FALSE FOUND : FALSE LOCATION : FALSE MENCARI CHARLIE DALAM UNTAIAN MENGHASILKAN
Kate
List data
Lisa
Becky
Bill
PROSES PENGHAPUSAN ELEMEN DAPAT DILAKUKAN SBB: 1. CARI ELEMEN YANG AKAN DIHAPUS (LOCATION, FOUND= TRUE 2. BILA KETEMU MAKA HAPUS (DISPOSE)
Procedure deleteList (in-out Head:pointer; input x:item; ouput done:boolean) { Menghapus x dari untaian}
Definisi Variabel
thisptr,latsptr:pointer; Rincian Langkah searchList(Head, thisptr, lastptr, x, done); if(done) then if(lastptr=Null) then lastptr Head.next; dispose(Head); Head lastptr; else lastptr.next thisptr.next; dispose(thisptr); endif endif.
Kate
LIST DATA
Lisa
Becky
Bill
LOCATION HEAD MORETOSEARCH : TRUE FOUND : TRUE APABILA YANG DIHAPUS (DELETE) ADALAH LISA, MAKA POINTER KE LISA DIPINDAHKAN KE BECKY
List data
Kate
Lisa
Becky
Bill
Apabila yang dihapus (delete) adalah Kate, maka pointer ke Kate dipindahkan ke Lisa
1. Sisip Depan (Insert Front), artinya menempatkan elemen baru selalu di depan. Langkahnya sbb:
1. ciptakan node baru, New(node); 2. pointer next node baru ini menunjuk ke elemen yang ditunjuk Head, 3. node.next Head 4. Isi node dengan elemen baru, node.isi x; 5. pointer head ini menunjuk ke node baru, Head node;
2. Sisip Akhir (Insert End),artinya menempatkan elemen baru selalu di belakang. Langkahnya sbb:
1. ciptakan node baru, New(node); 2. Tempatkan elemen baru pada node baru, node.isi x; 3. pointer node baru selalu menunjuk akhir null, node.next null; 4. telusuri untaian mulai dari head hingga akhir elemen (Last) thisNode Head; Last null; while (thisNode.next < > null) do Last thisNode; thisNode thisNode.next; endwhile; 5. pointer terakhir menunjuk node baru, Last.next Node;
Untaian Melingkar (Circular Linked List) Yaitu untaian tunggal yang telah dimodifikasi, dimana pointer next pada elemen terakhir yang menunjuk null diubah hingga menunjuk elemen pertama yang ditunjuk head.
Karena untaian ini melingkar, maka posisi head bisa ditempatkan paling depan atau paling belakang dari keseluruhan untaian.
Salah satu proses yang paling penting pada untaian ini adalah proses mencari elemen (searchClist), karena proses ini diperlukan ketika membaca suatu elemen tertentu, menyisipkan elemen dan juga menghapus elemen.
1. Head (Penunjuk Elemen Pertama), 2. Location (Penunjuk Node Yang Dibaca), Dan 3. Predloc (Penunjuk Node Sebelum Location)
PROCEDURE SEARCHCLIST (HEAD, ITEM, LOCATION, PREDLOC, FOUND): 1. LOCATION HEAD.NEXT; 2. PREDLOC HEAD; 3. FOUND FALSE; 4. MASIHCARI TRUE; 5. WHILE (MASIHCARI && ! FOUND) DO IF (ITEM < LOCATION.ISI) THEN MASIHCARI FALSE; ELSE IF (ITEM = LOCATION.ISI) THEN FOUND TRUE; ELSE{ PREDLOC LOCATION; LOCATION LOCATION.NEXT; MASIHCARI (LOCATION!= HEAD.NEXT) } ENDIF; ENDIF; ENDWHILE;
UNTAIANGANDA
Struktur untaian ganda (double linked list) adalah suatu untaian yang memiliki dua pointer, satu pointer menunjuk ke belakang, yaitu next dan satu pointer menunjuk ke depan yaitu back. akses pada untaian ini bersifat maju (forward) atau bersifat mundur (backward) dari posisi mana saja dalam untaian. Head adalah pointer yang menunjuk elemen pertama. Tail adalah pointer yang menunjuk elemen terakhir.
Tail A B
NULL
NULL
PROCEDURE INITDLIST OUTPUT HEAD, TAIL:POINTER) {MENGINISIALISASI SUATU UNTAIAN GANDA} DEFINISI VARIABEL {TIDAK ADA} RINCIAN LANGKAH HEAD NULL; TAIL NULL;
Penyisipan satu elemen baru ke dalam suatu untaian tidak berurut pada posisi terakhir dapat dilakukan sbb:
PROCEDURE INSERTDLIST 1. CIPTAKAN NODE BARU 2. POINTER NEXT NODE BARU MENUNJUK NULL 3. POINTER BACK NODE BARU MENUNJUK PADA ELEMEN TERAKHIR DALAM UNTAIAN DITUNJUK OLEH POINTER TAIL. 4. BILA POINTER HEAD MENUNJUK NULL (BERARTI UNTAIAN BARU)
PROCEDURE SEARCHDLIST MASIHCARI TRUE; LOCATION HEAD; FOUND FALSE; WHILE (MASIHCARI &&!FOUND) DO IF (ITEM < LOCATION.ISI) THEN MASIHCARI FALSE; ELSE IF (ITEM = LOCATION.ISI) THEN FOUND TRUE; ELSE { LOCATION LOCATION.NEXT; MASIHCARI LOCATION !=NULL); } ENDIF; ENDIF; ENDWHILE;
Menyisipkan elemen yang harus berada pada posisi antara head dan tail.
Tail A B
NULL
newNode
C
NEXT NULL
B
1 3 4
D
2 location
newNode
Proses Penyisipan Secara Umum, Sbb: 1. Ciptakan Node Baru, New(node), Node.Next Null; Node.Back Null; Node.Isi X; 2. Suatu Pointer Location Untuk Mencari Posisi, Location Head; 3. Selama X Masih <= Isi Pointer,maju Terus While ( X <= (Location.Next).Isi) Do Location Location.Next; 4. Pointer Back Dari Node Baru (1) Diupdate, Node.Back Location.Back; 5. Pointer Back Dari Thispoint (4) Menunjuk Node, Location.Back Node; 6. Pointer Next Posisi Sebelumnya (3) Menunjuk Node, (Location.Back).Next Node: 7. Pointer Next Dari Node Baru (2) Menunjuk Posisi Saat Ini, Node.Next Location;