LINKED LIST Linked list atau senatai berantai adalah kunpulan liniar sejumlah data , atau kumpulan komp kompon onen en yang yang disu disusu sun n seca secara ra beru beruru ruta tan n poin pointe terr.
Masi Masing ng-m -mas asin ing g komp kompon onen en
dinamakan dinamakan dengan simpul simpul (node). Simpul Simpul dalam suatu Linked Linked list terbagi menjadi menjadi dua bagian yaitu medan informasi yang berisi informasi yang akan disimpan dan diolah, dan berikutnya. Ada sejumlah operasi medan penyambung (Link field ) yang berisi simpul berikutnya. yang bisa kita lakukan pada sebuah Linked list yaitu membaca isi link, menambah simpul, menghapus simpul dan mencari informasi pada Linked list .
1. Mena Menamb mbah ah simp simpul ul Operasi menambah menambah simpul bisa dipecah berdasarkan berdasarkan posisi simpul dabu yang akan di sisipkan, yaitu simpul baru selalu diletakkan sebagai simpul pertama, dan simpul baru menyisip diantara kedua simpul yang sudah ada. Berikut contohnya : type Simpul = ^Data ; Data = record Inf Info : char ; B erikut
: Simpul ;
end ; var Element
: char ;
Awal, Akhir, Baru : Simpul ;
2. Menam Menamba bah h di di Bela Belakan kang g Operasi penambahan simpul pada Linked list adalah penambahan suatu Linked list. Simpul-simpul abru yang ditambahkan selalu menjadi sipmpul terakhir. Prosedur yang bisa dipanggil dengan memanggil prosedur : TAMBAH_BELAKANG (Awal, Akhir, Akhi r, Elemen);
Program selengkapnya adalah : 1 Edwin Wirencius - 52007012 – Struktur Data - Senerai
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^.Berikut := Baru; Akhir := Baru; Akhir^.Berikut := nil end ;
Senarai Berantai Biasa (Tambah diakhir) awal
akhir A
B
C
awal
D
A baru
awal A
B
C
B
akhir
baru
C
D
akhir
D
3. Menambah didepan Operasi penambahan simpul baru akan selalu diletakkan diawal link. Prosedur untuk menambah simpul bisa dipanggil dengan menggunakan : TAMBAH_DEPAN AMBAH_DEPAN (Awal, Akhir, Elemen); E lemen);
Program selengkapnya adalah : procedure TAMBAH_DEPAN TAMBAH_DEPAN (var Awal, Akhir : Simpul ;
2 Edwin Wirencius - 52007012 – Struktur Data - Senerai
Elemen : char ) ; var Baru : Simpul ; begin new (Baru) ; Baru^.Info :=Elemen; if Awal = nil then Akhir := Baru else Baru^.Berikut := Awal; Awal := Baru; end ; Senarai Berantai Biasa (Tambah depan) awal akhir A
awal
B
C
baru akhir A
B
C
4. menambah ditengah Untuk Untuk mene menemb mbah ah diten ditenga gan n linke linked d list list meme memerlu rluka kan n meme memerlu rluka kan n bantua bantuan n pointe pointer r misalnya bantu, perhatikan contoh program berikut ; procedure TAMBAH_TENGAH(var Awal, Awal, Akhir : Simpul ; Elemen : char ) ; var Baru, Bantu : Simpul ; begin new (Baru) ; Baru^.Info :=Elemen; if Awal = nil then
3 Edwin Wirencius - 52007012 – Struktur Data - Senerai
begin Awal := Baru; Akhir := Baru; end; else begin Bantu := Awal; while Elemen > Baru^.Berikut^.Info do Bantu := Bantu^.Berikut;
Baru^.Berikut := Bantu^.Berikut; Bantu^.Berikut := Baru; end; end ;
Senarai Berantai Biasa (Tambah ditengah)
bantu
awal
akhir A
B
D 2
C
E
1
baru
5. Menghapus Simpul
4 Edwin Wirencius - 52007012 – Struktur Data - Senerai
Operaasi kedua yang akan dijelaskan adalah operasi menghapus simpul. Dalam menghapus simpul ada suatu hal yang perlu diperhatikan, yaitu bahwa simpul yang bias dihapus adalah simpul yang berada sesudah simpul yang ditunjukan oleh suatu pointer, kecuali untuk simpul pertama. Dengan demikian kita tidak bias menghapus simpul yang ditunjuk oleh suatu pointer atau simpul sebelumnya.
6. Menghapus simpul pertama Untuk menghapus simpul pertama, maka pointer bantu kita dibuat sama dengan pointer awal. Kemudian pointer awal kita pindah kesimpul yang ditunjuk oleh pointer pada simpul yang ditunjuk oleh pointer Bantu. Selanjutnya, simpul yng ditunjuk oleh pointer Bantu kita dispose.
7. Menghapus simpul ditengah atau terakhir. Untuk menghapus simpul yang berada di tengah senarai berantai, pertama kali kita letakan pointer Bantu pada simpul di sebelah kiri simpul yang akan dihapus. Simpul yang akan dihapus kita tunjuk dengan pointer lain. Kemudian, pointer pada simpul yang ditunjuk oleh Bantu kita tunjukan pada simpul yang ditunju oleh pointer pada simpul yang akan dihapus. Selanjutnya simpul yang ditunjuk oleh pointer hapus kita dispose.
8. Senarai berantai berkepala Suatu saat kita perlu meletakan sebuah simpul sebagai simpul pertama dari sebua sebuah h senara senaraii beran berantai tai untuk untuk maksu maksudd-mak maksu sud d terten tertentu tu.. Simp Simpul ul ini ini tidak tidak beris berisii informasi informasi seperti halnya simpul-simpul lain dalam senarai berantai, tapi keberadaannya keberadaannya sangat sangat diperlu diperlukanu kanuntuk ntuk lebih lebih memperc mempercepat epat proses proses eksekus eksekusi. i. Simpul Simpul yang yang demikia demikian n disebut dengan simpul kepala (Header Lode) sehingga senarai berantai disebut senarai berantai berkepala (Headed Linked-List)
5 Edwin Wirencius - 52007012 – Struktur Data - Senerai
Senarai Berantai Berkepala awal
akhir A
B
C
Simpul kepala
9. Senarai berantai sebagai tumpukan. Operasi Operasi penamb penambahan ahan simpul simpul baru baru diawal diawal suatu suatu senarai senarai beranta berantai, i, sehing sehingga ga simpul baru adalah sebagai simpul pertama (harap dibedakan antara simpul kepala dan simpul simpul pertama pertama), ), serupa serupa dengan dengan operasi operasi mempush mempush (memas (memasuka ukan n elemen elemen kedalam kedalam suatu tumpukan. Dalam kedua kasus ini, elemen baru yang ditambahkan adalah satusatunya elemen dalam kumpulan elemen yang bisa segera dimasuk. Tumpukan hanya bisa dimasuk lewat elemen pertama yang menempati posisi teratas dalam tumpukan, dan dan senara senaraii beran berantai tai hanya hanya bisa bisa dima dimasuk suk lewat lewat point pointer er yang yang menu menuju ju ke elem elemen en pertama. Demikian juga halnya dengan operasi POP (menghapus elemen dari suatu tump tumpuk ukan an). ). Dala Dalam m kedu kedua a kasu kasus s ini ini hany hanya a elem elemen en pert pertam ama a yang yang bisa bisa dima dimasu suk k (dihapu (dihapus), s), dan elemen elemen berikut berikutnya nya menjasi menjasi elemen elemen baru yang bisa segera dimasuk dimasuk setelah elemen sebelumnya di POP. POP. Dengan demikian kita bisa menyejikan tumpukan dengan cara lain, yaitu dengan senarai berantai linear. Elemen pertama dalam senarai berantai diperlakukan sebagai elemen teratas dari tumpukan. Dengan mengacu pada prosedur PUSH dan POP kita bisa menyusun prosedur PUSH dan POP yang baru dengan mengingat bahwa kita ingin menyajikan tumpukan menggunakan senarai berantai. Senarai Berantai Sbg Tumpukan PUSH (Menambah didepan)
6 Edwin Wirencius - 52007012 – Struktur Data - Senerai
atau atas
akhir
baru
Simpul kepala
atas
2
C
1
akhir
baru
10. Single linked list Apabila setiap kali anda ingin menambahkan data selalu dengan menggunakan variabel pointer yang baru, anda akan membutuhkan banyak sekali variabel pointer (penunjuk). Jika anda hanya menggunakan satu variabel pointer saja untuk menyimpan banyak banyak data dengan metoda yang kita sebut linked linked list. list. Jika diterjema diterjemahkan hkan,, maka maka berarti suatu daftar isi yang saling berhubungan.
Dalam pembuatan single linked list dapat menggunakan dua metoda: a. LIFO (Last In First Out) aplikasinya : Stack (Tumpukan) Adalah Adalah suatu suatu metoda metoda pembuat pembuatan an linked linked list dimana data yang masuk paling paling akhir akhir adalah data yang keluar paling awal. b. FIFO (First In First Out) aplikasinya : Queue (Antrian) Adala suatu metoda pembuatan linked list dimana data yang masuk paling awal adalah data yang keluar paling awal juga. Senarai Berantai Berputar Inisialisasi
7 Edwin Wirencius - 52007012 – Struktur Data - Senerai
kepala
Tambah belakang
baru
kepala 2
kepala
bantu
A
1
A
baru 2
B
1
MULTIPLE LINKED LIST
Multiple linked list merupakan senarai berantai yang memiliki link atau pointer lebih dari satu. Untuk multiple linked list yang memiliki dua link biasanya disebut sebagai doubly linked list (senarai berantai ganda). Senarai berantai ganda memiliki dua buah pointer yang yang biasa biasanya nya masin masingg-ma masin sing g menu menunju njuk k ke simpul simpul sebel sebelum umnya nya dan dan ke simp simpul ul sesudah sesudahnya nya.. Jika dideklar dideklarasik asikan an dalam dalam deklara deklarasi si program program maka maka menjadi menjadi sebagai sebagai berikut. Type Simpul = ^Data; Data = record Info : real; Kanan : simpul; {menunjuk ke simpul sesudahnya} Kiri : simpul; {menunjuk ke simpul sebelumnya} End;
8 Edwin Wirencius - 52007012 – Struktur Data - Senerai
Matriks jarang adalah matriks yang elemen tak nolnya sangat sedikit jika dibandingkan dengan elemen nolnya. Matriks ini mungkin terdiri dari ratusan baris dan kolom atau bahkan bahkan ribuan, ribuan, tetapi tetapi jumlah jumlah elemen elemen tak nolnya nolnya hanya hanya sekian sekian persen persen dari seluruh seluruh elemen yang ada pada matriks tersebut. Contoh matriks jarang adalah sebagai berikut. A= Dalam Dalam pembuata pembuatan n program program untuk untuk menyim menyimpan pan matriks matriks jarang, jarang, yang akan disimpa disimpan n hanya elemen tak nolnya saja supaya lebih menghemat. Ada beberapa cara untuk menyimpan matriks jarang, yaitu dengan array atau menggunakan senarai berantai. Kedua cara tersebut menggunakan teknik penyimpanan berurutan atau memberikan nomor tertentu pada setiap elemen tak nolnya, dimulai dari elemen tak nol pertama yang yang dibe diberi ri nomo nomorr 1, eleme elemen n tak nol nol kedu kedua a diber diberii nomor nomor 2 dan dan seter seterus usnya nya.. Cara Cara pemberian nomornya berdasarkan baris, sehingga vektor baris mencatat nomor elemen tak nolnya. Vektor kolom dan Nilai masing-masing menyimpan nomor kolom dan nilai elemen tak nolnya. Untuk baris yang semua elemennya bernilai nol, maka dalam vektor baris dicatat sebagai 0. Baris Kolom Nilai 1142 2383 3015 4421 5 5 10 7 6 6 3 -2 7 0 4 -5 8898 9 10 10 -1 10 11 8 4 11 13 6 -17 79 Gambar di atas merupakan contoh penyimpanan berurutan untuk matriks jarang pada gambar 2. dari gambar 3 dapat dilihat bahwa vektor yang dibutuhkan 3 buah, yaitu vektor Baris, vektor Kolom dan vektor Nilai. Vektor Baris ukurannya selalu sama yaitu
9 Edwin Wirencius - 52007012 – Struktur Data - Senerai
N+1 dimana N adalah banyaknya baris, sedangkan vektor kolom dan nilai ukurannya gayut terhadap banyaknya elemen tak nolnya. Untuk mengetahui jumlah elemen tak nol pada suatu baris ke I dapat ditentukan dengan persamaan : Ni = Baris[I+1] – Baris[I] Contoh jumlah elemen tak nol baris ke 8 adalah : Ni = Baris[9] – Baris[8] = 10 -8 = 2 Penj Penjel elas asan an di atas atas digu diguna naka kan n untuk ntuk stru strukt ktur ur data data denga engan n arra array y. Jika Jika ingi ingin n menggunakan senarai berantai, maka dapat digunakan senarai berantai, maka dapat digunaka digunakan n senarai senarai beranta berantaii banyak banyak berkepa berkepala la berputar berputar,, dimana dimana deklaras deklarasii struktur struktur datanya adalah sebagai berikut : Type Matriks = ^Elemen; Elemen = record Baris : integer; {nomor baris} Kolom : integer; {nomor kolom} Nilai : real; {nilai elemen tak nol} Kanan : Matriks; {menunjuk ke kolom berikutnya} Bawah : Matriks; {menunjuk ke Baris berikutnya} End; Tabel = array[1..2] of matriks; baris kolom nilai bawah kanan Gambar di atas merupakan cara penyimpanan matriks jarang pada gambar 5. untuk mempermudah penambahan elemen baru, maka setiap baris dan kolomnya memiliki simpul kepala. Keseluruhan senarai juga memiliki simpul kepala yang ditunjukkan oleh pointer pointer M, yang yang memilik memilikii Baris=0 Baris=0,, Kolom=0 Kolom=0 dan Nilai=0. Nilai=0. Simpul Simpul kepala kepala dari kolom pertama ditunjuk oleh M6.Kanan dan simpul kepala dari baris pertama ditunjuk oleh M6.Bawah. Simpul kepala dari suatu baris selalu berisi Kolom=0 dan Nilai=0, sedangkan simpul kepala dari suatu kolom selalu berisi Baris=0 dan Nilai=0. Prosedur di bawah ini digunakan untuk membuat simpul baru. Procedure Buat_Simpul(Var Baru:Matriks;B,K:integer;N:real); Begin
10 Edwin Wirencius - 52007012 – Struktur Data - Senerai
New(Baru); With Baru^ do Begin Baris := B; Kolom := K; Nilai := N; Kanan := nil; Bawah := nil; End; End; Prosedur di bawah ini digunakan untuk mencek apakah nomor baris tertentu sudah ada. Jika sudah akan ditunjuk oleh pointer Nb. Procedure Ada_Baris(Var Nb:Matriks;Ada:Boolean;Awal:Matriks;B:integer); Begin Ada := False; Nb := Awal^.Bawah; Repeat If Nb^.baris = B then {Nomor baris ketemu} Ada := True Else {belum ketemu} Nb := Nb^.bawah; Until Ada or (Nb = Awal) or (Nb^.baris > B) End; Prosedur di bawah ini digunakan untuk mencek apakah nomor kolom tertentu sudah ada. Jika sudah akan ditunjuk oleh pointer Nk. Procedure Ada_Kolom(Var Nk:Matriks;Ada:Boolean;Awal:Matriks;K:integer); Begin Ada := False; Nk := Awal^.kanan; Repeat If Nk^.kolom = K then {Nomor kolom ketemu}
11 Edwin Wirencius - 52007012 – Struktur Data - Senerai
Ada := True Else {belum ketemu} Nk := Nk^.kanan; Until Ada or (Nk = Awal) or (Nk^.kolom > K) End; Prosedur di bawah ini digunakan untuk menyisipkan elemen baru sesuai dengan posisinya. Procedure Sisip_Elemen(Var Awal:Matriks;B,K:integer;N:real); Var Baru,Sb,Sk,N_baris,N_kolom,Bb : Matriks; Ada : Boolean; Begin Buat_Simpul(Baru,B,K,N); {Menset Nomor Baris} Ada_Baris(N_baris,Ada,Awal,B); If not (Ada) then {Ini adalah baris baru} {menentukan letak simpul kepala} {untuk nomor baris} Begin Buat_Simpul(Sb,B,0,0); {membentuk senarai berputar} Sb^.kanan := Sb; Sb^.bawah := Sb; Bb := Awal; While (Bb^.bawah^.barisAwal) do Bb := Bb^.bawah; If Bb^.bawah = Awal then Sb^.bawah := Awal Else Sb^.bawah := Bb^.bawah; Bb^.bawah := Sb;
12 Edwin Wirencius - 52007012 – Struktur Data - Senerai
N_baris := Sb; End; {Mentest nomor kolom} Ada_kolom(N_kolom,Ada,Awal,K); If not (Ada) then {Ini adalah kolom baru menentukan} {letak simpul kepala untuk nomor kolom} Begin Buat_Simpul(Sk,0,K,0); {membentuk senarai berputar} Sk^.kanan := Sk; Sk^.bawah := Sk; Bb := Awal; While (Bb^.kanan^.kolomAwal) do Bb := Bb^.kanan; If Bb^.kanan = Awal then Sk^.kanan := Awal Else Sk^.kanan := Bb^.kanan; Bb^.kanan := Sk; N_kolom := Sk; End; {Menentukan letak elemen baru pada posisinya yang tepat} {Mencari lokasi baris} Sb := N_baris; While (Sb^.kanan^.kolom0) do Sb := Sb^.kanan; If Sb^.kanan^.kolom = 0 then Baru^.kanan := N_baris Else
13 Edwin Wirencius - 52007012 – Struktur Data - Senerai
Baru^.kanan := Sb^.kanan; Sb^.kanan := Baru; {Mencari lokasi kolom} Sk := N_kolom; While (Sk^.bawah^.baris0) do Sk := Sk^.bawah; If Sk^.bawah^.baris = 0 then Baru^.bawah := N_kolom Else Baru^.bawah := Sk^.bawah; Sk^.bawah := Baru; End; Senarai Berantai Ganda kepala
Menambah didepan kepala 4
3
2
A
B
1 baru
Menambah ditengah kepala 4
A
2
C
3 B
1
baru
14 Edwin Wirencius - 52007012 – Struktur Data - Senerai
Menambah dibelakang
kepala A B
baru
Senarai Berantai Ganda Berputar
kepala A
B
C
Inisialisasi kepala
Tambah Simpul C>D
15 Edwin Wirencius - 52007012 – Struktur Data - Senerai
2
kepala
bantu 3
A
C
B
D 1 baru
4
Hapus Simpul bantu kepala A
C
B
bantu
bantu
kepala A
B
1
2
C
A≠B B=B Bantu kembali ke Kepala
16 Edwin Wirencius - 52007012 – Struktur Data - Senerai