IKG2A3/ Pemrograman Terstruktur 2
ZK Abdurahman Baizal
KK Algoritma dan Komputasi
Representasi Fisik List Linier
Representasi Fisik List Linier
Setelah representasi logic, perlu dilakukan represntasi fisik untuk implementasi
Representasi list linier secara "fisik", artinya
implementasi list linier dalam struktur data yang nantinya dapat ditangani oleh pemroses bahasa-bahasa pemrograman
Representasi fisik :
–Kontigu
Keterurutan elemen list secara eksplisit, berdasarkan urutan
indeks tabel
Implementasi : tabel
Alokasi memory : statis (dalam C dan pascal)
–Berkait :
Keterurutan elemen list secara implisit, perlu didefinisikan Implementasi : tabel, pointer
Alokasi memory : dinamis
Setiap elemen tabel mengandung informasi info, sedangkan informasi mengenai Next tidak perlu lagi disimpan secara eksplisit, karena secara
implisit sudah tersirat dalam struktur data yang menjadi tempat penyimpanannya
{List direpresentasi pada tabel secara kontigu}
Kamus :
constant IndexMin : integer = 1 constant IndexMax : integer = 100 constant Nil : integer = 0
type InfoType : ... {ElmType : terdefinisi } TabElmtList : array[IndexMin..IndexMax] of Info type address : integer [IndexMin..IndexMax,Nil] {Deklarasi nama untuk variabel kerja}
N : address
{alamat elemen terakhir. Karena field NEXT tidak ada secara eksplisit, maka satu-satunya jalan untuk mengenali elemen terakhir adalah dengan @-nya}
{Deklarasi alamat}
P : address {address untuk traversal}
{Maka First(L)..Last(L) adalah indeks efektif elemen tabel anggota list. Next(P) menjadi P ← P + 1, Next(P) tidak terdefinisi untuk P=N, Info(P) menjadi TabElmtList[P].Info}
Representasi Fisik List Linier BERKAIT dengan Pointer
Kamus :
{List direpresentasi dg pointer}
Address : ^ElmtList
type InfoType : ……….{terdefinisi}
type ElmtList : <Info: InfoType, Next: address> type List : <First: address>
{Deklarasi nama untuk variable keja}
P: address {address untuk traversal}
{Maka penulisan First(L) menjadi L.First Next(P) menjadi P^.Next
Representasi Fisik List Linier BERKAIT
dengan Pointer
procedure CreateNewElmt (input X: InfoType; output P: address)
{Mengalokasi sebuah tempat di memori untuk menyimpan X}
{I.S. Terdefinisi X}
{F.S. Telah dialokasi sebuah tempat di memori dengan alamat P, X telah ditempatkan di P} Kamus : Algoritma : new(P) P^.Info X P^.Next nil
Jika bahasa pemrograman tidak menyediakan struktur
pointer (dengan primitif Allocate, Free, Saturate), maka kita dapat melakukan implementasi fisik alamat dengan indeks tabel.
Representasi berkait pada dasarnya menggunakan alokasi memory dinamis. Dalam beberapa bahasa pemrograman, alokasi memory pada tabel adalah statis
Oleh karena itu kita harus mendefinisikan suatu tabel
GLOBAL, yang setiap elemennya adalah elemen list yang
diacu oleh alamat → supaya alokasi memory jadi dinamis
Representasi Fisik List Linier BERKAIT dengan tabel
Representasi Fisik List Linier BERKAIT dengan tabel
Kamus :
{List direpresentasi secara berkait dg tabel} type InfoType : ... { terdefinisi }
type ElmtList : <info: InfoType, Next: address > type Address : integer [IndeksMin..IndexMax, Nil] {TABEL MEMORI LIST, GLOBAL}
constant IndexMin : integer = 1 constant IndexMax : integer = 100 constant Nil : integer = 0
{Nil:address tak terdefinisi, di luar [IndexMin..IndexMax]} TabElmt : array[IndexMin..IndexMax] of ElmtList
FirstAvail : Address {alamat pertama list siap pakai} {Maka penulisan First(L) menjadi First
Next(P) menjadi TabElmtList[P].Next Info (P) menjadi TabElmtList[P].Info }
Representasi Fisik List Linier BERKAIT
dengan tabel
Kamus (lanjutan): procedure InitTab
{Inisialisasi tabel yang akan dipakai sebagai memori list}
procedure AllocTab (Output P : address) :
{Mengambil sebuah elemen siap pakai P pada awal list FirstAvail}
procedure DeAllocTab(Input P : address) :
Representasi Fisik List Linier BERKAIT dengan tabel
procedure InitTab
{Inisialisasi tabel yang akan dipakai sebagai memori list} {I.S. Sembarang}
{F.S. TabElmt[IndexMin..IndexMax] siap dipakai sebagai elemen list berkait, Elemen pertama yang available adalah
FirsAvail=1. Next[i]=i+1 untuk i [IndexMin..IndexMax-1], Next[IndexMax]=Nil} Kamus P: address Algoritma : P traversal [IndexMin..IndexMax-1] TabElmt[P.Next] ← P + 1 TabElmt[IndexMax].Next ← Nil FirstAvail ← IndexMin
Representasi Fisik List Linier BERKAIT dengan tabel
procedure AllocTab(Output P: address)
{Mengambil sebuah elemen siap pakai P pada awal list FirstAvail} {I.S. FirstAvail mungkin kosong}
{F.S. Jika FirstAvail tidak Nil, P adalah FirstAvail dan FirstAvail yang baru adalah Next[FirstAvail]
Jika FirstAvail =Nil, tuliskan pesan ‘Tidak tersedia lagi elemen siap pakai,P=Nil }
Kamus : Algoritma :
if (not MemFull) then
P ← TabElmt[FirstAvail]
FirstAvail ← TabElmt[FirstAvail].Next else
Representasi Fisik List Linier BERKAIT dengan tabel
procedure DeAllocTab(Input P: address)
{Mengembalikan sebuah elemen P pada awal list FirstAvail} {I.S. FirstAvail mungkin kosong. P ≠ Nil}
{F.S. FirstAvail = P}
Kamus : Algoritma :
TabElmtp.Next ← FirstAvail FirstAvail ← P
Ilustrasi dari urut-urutan pemanggilan dan status pemakaian memori list tersebut dapat dilihat pada gambar berikut
1 9 8 7 6 5 4 3 2 FirstAvail 1 9 8 7 6 5 4 3 2 FirstAvail FirstAvail First 2 1
Terdefinisi sebuah list L, mungkin kosong. Jika L tidak kosong elemen-elemen L unik, artinya tidak ada 2 atau lebih elemen yang sama. Akan
disisipkan sebuah info baru X ke dalam list L sebagai elemen terakhir jika pada L belum ada elemen dengan info X.
procedure InsertX1 (input/output L: List; input X: InfoType)
{I.S. Terdefinisi X dan L, mungkin kosong. Jika L tidak kosong, L terurut membesar berdasar info}
{F.S. Jika sebelumnya X belum ada di L maka X disisipkan menjadi di L sebagai elemen terakhir, L tetap terurut membesar berdasar info} Kamus P,Pt: address Algoritma : if IsEmpty(L) then CreateNewElement(X,P) InsertFirst(L,P) else Pt L.First while (Pt^.info<>X)and(Pt^.next<>NIL) do Pt Pt^. next {(Pt^.info=X) or (Pt^.next=NIL) }
Studi Kasus 1
procedure CreateNewElmt (input X: InfoType; output P: address)
{Mengalokasi sebuah tempat di memori untuk menyimpan X} {I.S. Terdefinisi X}
{F.S. Telah dialokasi sebuah tempat di memori dengan alamat P, X telah ditempatkan di P} Kamus : Algoritma : new(P) P^.Info X P^.Next nil
Terdefinisi sebuah list L, mungkin kosong. Jika L tidak kosong elemen-elemen L terurut membesar berdasar info. Akan disisipkan sebuah info baru X ke dalam list L. Setelah penyisipan X, list L tetap terurut membesar berdasarkan info
procedure InsertX2 (input/output L: List; input X: InfoType)
{I.S. Terdefinisi X dan L, mungkin kosong. Jika L tidak kosong, L terurut membesar berdasar info}
{F.S. X telah disisipkan di L, L tetap terurut membesar berdasar info}
Kamus Prec, Pt, P : address Algoritma : CreateNewElmt(X,P) if IsEmpty(L) then InsertFirst(L,P) else Prec NIL Pt L.First while (Pt^.info<=X)and(Pt^.next<>NIL) do Prec Pt Pt Pt^.next {(Pt^.info > X) or (Pt^.next=NIL) }
if Pt^.info<=X then {Pt Elemen terakhir} Insert-After(Pt,P) {P menjadi elemen terakhir} else
if Prec=NIL then {Pt Elemen pertama} InsertFirst(L,P) {P menjadi elemen pertama} else
Misal diketahui 2 list L1 dan L2 yang tidak terurut. Buatlah sebuah algoritma untuk membuat sebuah list baru L3 yang elemen-elemennya merupakan irisan dari elemen L1 dan L2 (Elemen L3 unik)
Misal diketahui 2 list L1 dan L2 yang tidak terurut. Buatlah sebuah algoritma untuk membuat sebuah list baru L3 yang elemen-elemennya merupakan union dari elemen L1 dan L2 (Elemen L3 unik)
Diktat Kuliah IF2181 Struktur Data, Inggriani Liem, ITB, 2003.