Pertemuan Ke 5 : List Linier (Linked List)
Referensi:
1. Inggriani Liem. 2003. Catatan Kuliah Algoritma & Pemrograman, Jurusan Teknik Informatika ITB
2. Rinaldi Munir. 2003. Algoritma dan Pemrograman II. Bandung : Penerbit Informatika
I. List Berkait 1. Definisi
List linier adalah sekumpulan elemen bertype sama, yang mempunyai keterurutan tertentu, yang setiap elemennya terdiri dari 2 bagian : info dan next.
Type ElmtList = record
< Info : InfoType, Next : address >
InfoType adalah sebuah type terdefenisi yang menyimpan informasi sebuah elemen list sedangkan Next adalah address dari elemen berikutnya ( suksesor ). Dengan demikian, jika didefinisikan First adalah alamat elemen pertama list, maka elemen berikutnya dapat diakses secara terurut (suksesif) dari elemen pertama suatu list.
Representasi lojik list dapat digambarkan seperti gambar berikut:
Sebuah list linier dapat dikenali dengan cara:
elemen pertamanya, biasanya melalui alamat elemen pertama yang disebut : First
alamat elemen berikutnya ( suksesor ), jika kita mengetahui alamat sebuah elemen , yang dapat diakses melalui field Next
setiap elemen mempunyai alamat, yaitu tempat elemen disimpan dapat diacu.Untuk mengacu sebuah elemen , alamat harus terdefenisi . Dengan alamat tersebut Informasi yang tersimpan pada elemen list dapat diakses .
elemen terakhirnya. Elemen terakhir dikenali dengan Next(P)==NIL
Jika L adalah list , dan P adalah address : Alamat elemen pertama list L dapat diacu dengan menggunakan notasi : First (L). Elemen yang diacu oleh P dapat dipergunakan informasinya dengan menggunakan notasi :
Info(P) Next(P)
Beberapa pengertian dasar mengenai list adalah:
1. List L adalah List kosong , jika First(L) = Nil
2. Elemen terakhir dikenali, dengan salah satu cara adalah karena Next(Last)=Nil
Secara umum kamus data / deklarasi yang digunakan untuk merepresentasikan list adalah:
Kamus/Deklarasi Nama Umum
type InfoType = … {Sebuah type terdefinisi, record}
type Address pointer to ElmtList
type ElmtList : record
<Info : InfoType,
Next : Address >
type List = record <First : Address >
atau dapat juga type List = Address {Deklarasi Nama Peubah}
L : List P : Address
{ Dengan deklarasi seperti di atas maka:
First(L) menjadi L Info(P) menjadi P↑. Info Next(P) menjadi P↑.Next Nil tetap Nil
2. Skema traversal (penelusuran) untuk list linier
List terdiri dari sekumpulan elemen. Seringkali diperlukan untuk memproses setiap elemen list dengan cara yang sama. Karena itu salah primitif operasi konsultasi dasar pada struktur list adalah traversal, yaitu “mengunjungi” setiap elemen list untuk diproses. Akses list selalu dimulai dari elemen pertama, maka penelusuran selalu dimulai dari elemen pertama dan seterusnya ke elemen – elemen berikutnya sampai dengan elemen terakhir
Procedure SKEMAListTransversal1( Input L : List ) {K. Awal: List L terdefinisi , mungkin kosong }
{K. Akhir: semua elemen list L dikunjungi dan telah diproses }
{Proses : Traversal sebuah list linier. Dengan MARK, tanpa pemrosesan khusus pada list kosong}
{Deklarasi nama}
Kamus/Deklarasi
P : address { address untuk traversal , type terdefenisi } Algoritma
Inisialisasi {Prosedur Inisialialisasi yang terdefinisi, jika ada}
P ← First ( L ) {ambil elemen pertama}
While ( P ≠Nil ) do }
Proses ( P )
P←Next (P) { ambil elemen berikutnya}
{P ==NIL, kondisi keluar dari traversal}
Terminasi {Prosedur terminasi yang terdefinisi}
Procedure SKEMAListTransversal2( Input L : List ) {K. Awal: List L terdefinisi , mungkin kosong }
{K. Akhir: semua elemen list L dikunjungi dan telah diproses }
{Proses : Traversal sebuah list linier dengan perlakuan khusus untuk list linier yang kosong, pemrosesan engan mark}
{Deklarasi nama}
Kamus/Deklarasi
P : address { address untuk traversal , type terdefenisi } Algoritma
Inisialisasi {Prosedur Inisialialisasi yang terdefinisi, jika ada}
If (First(L)==NIL) then Output(“List Kosong)
Else
Until P ← First ( L ) {ambil elemen pertama}
Repeat
Proses ( P )
P←Next (P)
Until ( P == Nil ) do
{P ==NIL, kondisi keluar dari traversal}
Terminasi {Prosedur terminasi yang terdefinisi}
3. Skema Sequential Search untuk list linier
Selain traversal, proses pencarian suatu elemen list adalah primitif yang sering kali didefinisikan pada struktur list. Pencarian dapat berdasarkan nilai yang terdapat pada info, atau berdasarkan alamat tertentu.
3.1. Pencarian suatu nilai, output adalah address
Search ini sering digunakan untuk mengenali suatu elemen list berdasarkan nilai informasi yang disimpan pada elemen yang dicari. Biasanya dengan alamat yang ditemukan, akan dilakukan suatu proses terhadap elemen list tersebut.
Procedure SKEMAListSearch1 ( Input L : List, X : InfoType, Output P : address, Found: Boolean )
{ K. Awal : List linier L sudah terdefinisi dan siap dikonsultasi, X terdefenisi }
{ K.Akhir : P : address pada pencarian beurutan, dimana X diketemukan, P = Nil jika tidak ketemu, Found berharga true jika harga X yang dicari ketemu, false jika tidak. Jika X ada pada list di lebih dari satu elemen, maka yang diambil adalah X pada elemen pertama }
Kamus/Deklarasi -
Algoritma
P ← First ( L ) {ambil elemen pertama}
Found ← false {inisialisasi nilai Found, asumsi belum ditemukan}
While ( P ≠ Nil ) and ( not found ) do
if X = Info (P) then Found ←True else
P ← Next (P) endif
{ P = Nil or Found}
{Jika Found maka P adalah address dimana harga yang dicari diketemukan}
3.2. Pencarian suatu Elemen yang beralamat tertentu
Procedure SKEMAList Search2( Input L : List, P : address, Output : Found: Boolean )
{K. Awal : List linier L sudah terdefinisi dan siap dikonsultasi, X terdefenisi } {K.Akhir : Jika ada elemen list beralamat P, Found berharga true, Jika tidak ada elemen list beralamat P, Found berharga false }
{Proses : Sequential Search 2 pada sebuah list linier L, Semua elemen diperiksa dengan intruksi yang sama }
Kamus/Deklarasi
Pt : address Algoritma
Pt ← First ( L ) {ambil elemen pertama}
Found ← false {inisialisasi nilai Found, asumsi belum ditemukan}
While ( Pt ≠ Nil ) and ( not Found ) do
if Pt = P then
Found ← true else
Pt ← Next (Pt) { Pt = Nil or Found}
{ Jika Found maka P adalah elemen list}
4. Algoritma fungsional list linier
Secara fungsional, pada sebuah list linier biasanya dilakukan pembuatan, penambahan atau penghapusan elemen yang dapat ditulis sebagai berkut : Jika diberikan L, L1 dan L2 adalah list linier dengan elemen ElmtList, maka operasi yang dapat dilakukan :
ListEmpty, CreateList, Insert, Delete, Concat dan UpdateList
4.1. List Kosong
Function IsEmptyList (input: L : List ) → boolean
{ Fungsi digunakan untuk memeriksa apakah sebuah list L kosong, mengirimkan true jika list kosong, false jika tidak kosong}
Kamus/Deklarasi
Pt : address Algoritma
(First (L) = Nil)
4.2. Pembuatan sebuah elemen pada list linier
Pembuatan sebuah list berarti membuat sebuat list KOSONG, yang selanjutnya siap diproses. Realisasi algoritmik dari defenisi funfsional ini adalah sebuah prosedur sebagai berikut.
Procedure CreateList( Output L : List )
{K. Awal : Sembarang , K. Akhir : terbentuk list L yang kosong : First (L) diinisialisasi dengan NIL ) Proses : Membuat list kosong}
Kamus/Deklarasi
- Algoritma
First (L) ← Nil
4.3. Penyisipan sebuah elemen pada list linier
Fungsi penyisipan harus dijabarkan lebih rinci. Hal ini karena elemen yang disisipkan bisa menjadi elemen pertama, setelah sebuah address P atau penyisipan menjadi elemen terakhir atau bahkan menjadi elemen ditengah.
Penyisipan sebuah elemen dapat dilakukan terhadap sebuah elemen yang sudah dialokasi (diketahui address-nya ), atau sebuah elemen yang hanya diketahui nilai Info-nya (berarti belum dialokasi).
4.3.1. Penyisipan address sebagai alemen pertama
Menambahkan sebuah elemen yang diketahui alamatnya sebagai elemen pertama list.
Procedure InsertFirst (Input/Output L:List, Input P: address)
{K. Awal : List L mungkin kosong
{K. Akhir : P adalah elemen pertama list L}
{Proses : Insert sebuah elemen beralamat P sebagai elemen pertama list linier L yang mungkin kosong}
Kamus/Deklarasi
- Algoritma
Next (P) ← First (L) First (L) ← P
4.3.2. Menyisipkan elemen list berupa Nilai pada sebuah list
Menambahkan sebuah elemen yang diketahui nilainya sebagai elemen pertama list.
Procedure InsFirst (Input/output L :List, Input E : infotype )
{ K. Awal : List L mungkin kosong }
{ K. Akhir : Sebuah elemen dialokasikan dan menjadi elemen pertama list L, jika alokasi berhasil. Jika alokasi gagal list tetap seperti semula }
{ Proses : Insert sebuah elemen sebagai elemen pertama list}
Kamus/Deklarasi
P : address Algoritma
Alokasi (P)
If P ≠ Nil then Info (P) ← E
Next (P) ← First (L) First (L) ← P
4.3.3. Menyisipkan setelah elemen list tertentu
Menyisihkan sebuah elemen beralamat P sebagai suksesor dari sebuah elemen list linier yang beralamat Prec
Contoh kasus insert after dengan List tidak kosong seperti gambar di bawah.
K-Awal
K-Akhir setelap Procedur InsertAfter dijalankan terhadap List di atas
Procedure InsertAfter ( Input P, Prec: address )
{K. Awal : Prec adalah elemen list, prec ≠ Nil, P sudah dialokasikan, P ≠ Nil, Next (P) = Nil. K. Akhir : P menjadi suksesor Prec Proses : Insert sebuah elemen beralamat P pada List linier L}
Kamus/Deklarasi
Algoritma
Next (P) ← Next (Prec) Next (Prec) ← P