• Tidak ada hasil yang ditemukan

Linked List. Bandung 2013

N/A
N/A
Protected

Academic year: 2021

Membagikan "Linked List. Bandung 2013"

Copied!
49
0
0

Teks penuh

(1)

Bandung 2013

(2)

PENGERTIAN LINKED LIST

— 

Salah satu bentuk struktur data, berisi kumpulan data

(node) yang tersusun secara sekuensial, saling

sambung-menyambung, dinamis dan tidak

terbatas.

— 

Linked List sering disebut juga Senarai Berantai

— 

Linked List saling terhubung dengan bantuan variabel

pointer

— 

Masing-masing data dalam Linked List disebut dengan

node (simpul) yang menempati alokasi memori secara

dinamis dan biasanya berupa record

(3)
(4)

Bentuk Linked List

—

Single Linked List

—

Double Linked List

(5)

Single Linked List

Linked list dengan simpul berisi satu link / pointer yang

mengacu ke simpul berikutnya

Medan Data

(Info) Medan Sambungan (next)

Simpul Single Linked List :

(6)

Deklarasi

Single

Linked List (Algoritma)

Type nama_pointer = ↑Simpul Simpul = Record medan_data : tipedata, medan_sambungan : nama_pointer EndRecord nama_var_pointer : nama_pointer  

(7)

Contoh Deklarasi Single Linked List

Type Point = ↑Data Data = Record Info : char , Next : Point Endrecord

(8)

Operasi – operasi Single Linked List

1. 

Penciptaan (create)

2. 

Penyisipan

3. 

Penghapusan

4. 

Traversal

5. 

Pencarian (Searching)

6. 

Pengurutan (Sorting)

7. 

Penghancuran (destroy)

(9)

Penciptaan

Pointer awal dan akhir diberi harga nil/NULL

awal

akhir

(10)

Penyisipan di Depan

- Jika List kosong {

awal = nil

}

baru

baru

1

baru

1

awal

akhir

alloc(baru)

baru

ß nil

baru

.info

ß 1

awal

ß

baru

akhir

ß

baru

(11)

Penyisipan di Depan (lanjutan)

- Jika List tidak kosong {Awal ≠ Nil}

baru

1

akhir

awal

2 3

Misalkan mula-mula keadaan List memiliki dua simpul:

Satu simpul akan disisipkan di depan

alloc(baru)

(12)

Penyisipan di Depan (lanjutan)

baru

1

awal

2

akhir

3

baru

.next

ß

awal

Simpul baru akan disisipkan di depan simpul yang

ditunjuk oleh pointer awal

(13)

Penyisipan di Depan (lanjutan)

awal

2 3

baru

1

akhir

awal

ß

baru

Setelah simpul baru tersambung dengan simpul pertama

dari list, lalu pindahkan pointer awal ke simpul yang baru

(14)

Penyisipan di Depan (lanjutan)

baru

1

awal

2 3

akhir

Keadaan Linked List setelah terjadi penyisipan di

depan/di awal (untuk awal ≠ nil) :

(15)

Algoritma Penyisipan di Depan

Procedure SisipDepanSingle(Input elemen : tipedata, I/O awal, akhir : nama_pointer)

{I.S. : data yang akan disisipkan (elemen), pointer penunjuk awal dan pointer penunjuk akhir sudah terdifinisi} {F.S. : menghasilkan satu simpul yang disisipkan di depan pada single linked list}

Kamus : baru : nama_pointer Algoritma : alloc(baru) baru↑.info ß elemen If (awal = nil) Then baru↑.next ß nil akhir ß baru Else baru↑.next ß awal EndIf awal ß baru EndProcedure

(16)

Penyisipan di Belakang

- Jika List kosong {awal = nil}

{sama seperti pada penyisipan di depan}

awal

3 2

akhir

baru 1

- Jika List tidak kosong {awal ≠ nil}

Misalkan mula-mula List memiliki dua simpul:

Simpul yang akan disisipkan: alloc(baru)

baru.next ß nil

(17)

Penyisipan di Belakang (lanjutan)

baru

1

akhir

awal

3 2 akhir↑.nextß baru

Simpul baru akan disisipkan setelah simpul yang ditunjuk

pointer akhir

(18)

Penyisipan di Belakang (lanjutan)

akhir ß baru

akhir

awal

3 2

baru

1

(19)

Penyisipan di Belakang (lanjutan)

awal

3 2

baru

1

akhir

Keadaan Linked List setelah terjadi penyisipan satu

(20)

Algoritma Penyisipan di Belakang

Procedure SisipBelakangSingle(Input elemen : tipedata, I/O awal, akhir : nama_pointer)

{I.S. : data yang akan disisipkan (elemen), pointer penunjuk awal dan pointer penunjuk akhir sudah terdifinisi} {F.S. : menghasilkan satu simpul yang disisipkan di belakang pada single linked list}

Kamus : baru : nama_pointer Algoritma : alloc(baru) baru↑.info ß elemen baru↑.next ß nil If (awal = nil) Then awal ß baru Else akhir↑.next ß baru EndIf akhir ß baru EndProcedure

(21)

Penyisipan di Tengah

- Jika List kosong {awal = nil}

{

sama seperti pada penyisipan di depan

}

baru

1

awal

2 5 4

akhir

3

Misal akan menyisipkan angka 1 setelah angka 4

- Jika List tidak kosong {awal ≠ Nil}

alloc(baru)

(22)

Penyisipan di Tengah (lanjutan)

Angka 4 ditemukan dengan cara mencari mulai dari simpul pertama sampai simpul yang ada

angka 4 ditemukan (metode sequential search).

bantu

Misalkan pointer yang mencari angka 4 adalah pointer bantu, berarti pointer bantu akan menunjuk simpul ke-2 karena simpul tersebut berisi data yang dicari. baru.next ß bantu↑.next

baru

1 awal 2 5 4 akhir 3 bantu

(23)

Penyisipan di Tengah (lanjutan)

Hubungkan medan sambungan dari simpul yang baru ke simpul tetangganya dari simpul yang ditunjuk oleh pointer bantu

baru.next ß bantu↑.next

baru

1 awal 2 5 4 akhir 3 bantu

(24)

Penyisipan di Tengah (lanjutan)

bantu.next ß baru

Setelah simpul baru terhubung ke simpul setelah simpul yang

ada angka 4, maka sambungkan medan sambungan (next) dari

simpul yang ditunjuk pointer bantu ke simpul baru

bantu

awal

2

baru

1 4

akhir

3 5

(25)

Penyisipan di Tengah (lanjutan)

Keadaan Linked List setelah terjadi penyisipan satu

simpul di tengah (untuk awal ≠ nil) :

bantu

baru

1 2

akhir

5

awal

4 3

(26)

Algoritma Penyisipan di Tengah

Procedure SisipTengahSingle(Input elemen : tipedata, I/O awal, akhir : nama_pointer)

{I.S. : data yang akan disisipkan (elemen), pointer penunjuk awal dan pointer penunjuk akhir sudah terdifinisi}

{F.S. : menghasilkan satu simpul yang disisipkan di tengah pada single linked list}

Kamus : baru,bantu : nama_pointer ketemu : boolean datasisip : tipedata  Algoritma : If (awal = nil) Then alloc(baru) baru↑.info ß elemen baru↑.next ß nil

(27)

Algoritma Penyisipan di Tengah (lanjutan)

awal ß baru akhir ß baru Else Input(datasisip) bantu ß awal ketemu ß false

While (not ketemu and bantu ≠ nil) do If (datasisip = bantu↑.info) Then ketemu ß true Else bantu ß bantu↑.next EndIf EndWhile

(28)

Algoritma Penyisipan di Tengah (lanjutan)

If (ketemu) Then alloc(baru) baru↑.info ß elemen If (bantu = akhir) Then sisip_belakang_single(elemen,awal,akhir) Else baru↑.next ß bantu↑.next bantu↑.next ß baru EndIf Else

Output(“Data yang akan disisipkan tidak ada”); EndIf

EndIf

(29)

Penghapusan di Depan

Proses menghapus satu simpul di depan/di awal Linked List (menghapus simpul yang ditunjuk oleh pointer awal)

- Keadaan List memiliki satu simpul {awal = akhir}

awal akhir

(30)

Penghapusan di Depan (lanjutan)

awal akhir phapus elemen 1 phapus

phapus ß awal elemen ß

phapus↑.info

dealloc(phapus)

awal ß nil akhir ß nil

1

awal akhir

Jika terjadi penghapusan pada Linked List yang hanya memiliki satu simpul, maka Linked List akan kosong

(31)

Penghapusan di Depan (lanjutan)

- Keadaan List memiliki lebih dari satu simpul {awal ≠ akhir}

awal

2 3

akhir

Misalkan mula-mula Linked List memiliki dua simpul

(32)

Penghapusan di Depan (lanjutan)

phapus awal 2 3 akhir elemen awal 2 3 phapus akhir

phapus ß awal elemen ß phapus↑.info

awal ß awal↑.next

dealloc(phapus )

(33)

Penghapusan di Depan (lanjutan)

Keadaan Linked List setelah terjadi penghapusan di

depan/di awal (untuk awal ≠ akhir) :

phapus

awal

3

akhir 2

(34)

Algoritma Penghapusan di Depan

Procedure HapusDepanSingle(Output elemen : tipedata, I/O awal, akhir : nama_pointer)

{I.S. : pointer penunjuk awal dan pointer penunjuk akhir sudah terdifinisi}

{F.S. : menghasilkan single linked list yang sudah dihapus satu simpul di depan}

Kamus : phapus : nama_pointer Algoritma : phapus ß awal elemen ß baru↑.info If (awal = akhir) Then awal ß nil akhir ß nil Else

awalß awal ↑.next EndIf

dealloc(phapus)

EndProcedure

(35)

Penghapusan di Belakang

- Keadaan List memiliki satu simpul (awal = akhir)

awal

1 3

2

akhir

Proses menghapus satu simpul di belakang/di akhir Linked List (menghapus simpul yang ditunjuk oleh pointer akhir)

- Keadaan List memiliki lebih dari satu simpul {awal ≠ akhir}

{sama seperti penghapusan di depan}

(36)

Penghapusan di Belakang (lanjutan)

phapus awal 1 3 akhir 2 elemen

phapus akhir phapus

awal 1 3 2 phapus ß awal elemen ß akhir↑.info phapus ß phapus↑.next phapus ß phapus↑.next akhir ß phapus

(37)

Penghapusan di Belakang (lanjutan)

awal

1 3

phapus

2

akhir

akhir↑.next

ß

nil

dealloc(phapus

)

(38)

Penghapusan di Belakang (lanjutan)

Keadaan Linked List setelah terjadi penghapusan di

belakang/di akhir (untuk awal ≠ akhir) :

phapus akhir phapus

3 awal

1 2

(39)

Algoritma Penghapusan di Belakang

Procedure HapusBelakangSingle(Output elemen : tipedata, I/O awal, akhir : nama_pointer)

{I.S. : pointer penunjuk awal dan pointer penunjuk akhir sudah terdifinisi}

{F.S. : menghasilkan single linked list yang sudah dihapus satu simpul di belakang}

Kamus : phapus : nama_pointer Algoritma : phapus ß awal elemen ß baru↑.info If (awal = akhir) Then awal ß nil akhir ß nil

(40)

Algoritma Penghapusan di Belakang

(lanjutan)

Else

while (phapus↑.next ≠ akhir) do phapus ß phapus↑.next endwhile akhir ß phapus phapus ß phapus↑.next akhir↑.next ß nil EndIf dealloc(phapus) EndProcedure

(41)

Penghapusan di Tengah

- Keadaan List memiliki satu simpul (awal = akhir)

awal

2 5

4

akhir

3

Proses menghapus satu simpul di tengah Linked List (menghapus simpul yang ditunjuk oleh pointer phapus)

{sama seperti penghapusan di depan}

- Keadaan List memiliki lebih dari satu simpul (awal ≠ akhir)

Misalkan mula-mula List memiliki empat simpul, dan akan menghapus simpul ketiga

(42)

phapus

posisihapus=2

Penghapusan di Tengah (lanjutan)

awal 2 5 4 akhir 3 posisihapus=1 posisihapus=3 phapus

Cari simpul yang akan dihapus (simpul ke-3). Pencarian dimulai dari simpul pertama.

Jika ketemu simpul yang akan dihapus, maka simpan datanya kesebuah variabel (elemen).

(43)

bantu awal 2 5 4 phapus akhir 3 posisihapus=3

Penghapusan di Tengah (lanjutan)

Karena medan sambungan dari simpul sebelum simpul yang dihapus harus terhubung ke simpul berikutnya dari simpul yang dihapus, maka harus ada pointer bantuan (bantu) yang menunjuk simpul sebelum simpul yang dihapus.

(44)

Penghapusan di Tengah (lanjutan)

awal 2 5 4 phapus akhir 3 posisihapus=3 bantu

bantu.next ß phapus.next

dealloc(phapus)

Hubungkan medan sambungan dari simpul yang ditunjuk oleh pointer bantu ke simpul tetangganya phapus.

(45)

Penghapusan di Tengah (lanjutan)

5 akhir 2 phapus posisihapus=1 posisihapus=2 posisihapus=3 phapus bantu

Keadaan Linked List setelah terjadi penghapusan di

tengah(untuk awal ≠ akhir) :

awal 4 3 4 3 5 akhir awal

(46)

Traversal

Proses mengunjungi setiap simpul satu persatu dari simpul pertama sampai simpul terakhir

awal

2 5

4

akhir 3

Misalkan proses menampilkan data :

Ø  Tempatkan satu pointer bantuan (bantu) di simpul pertama

awal 2 5 4 akhir 3 bantu

(47)

Traversal (lanjutan)

Ø  Tampilkan ke layar medan data dari simpul yang ditunjuk oleh

pointer bantu, kemudian pointer bantu bergerak ke simpul berikutnya sampai seluruh simpul tertelusuri (bantu = nil)

awal

2 5

4

akhir 3

bantu bantu bantu bantu

3 4 2 5

(48)

Tugas

Buat algoritma dan program untuk menu berikut : Menu Utama 1.  Isi Data 2.  Tambah Data 3.  Hapus Data 4.  Tampil Data 5.  Keluar

Topik : 1. Penjualan Tiket, 2. Perpustakaan, 3. Pendaftaran Pasien, 4. Reservasi Hotel, 5. Laundry, 6. Rental Kendaraan, 7. Outlet, 8. Penyewaan VCD

(49)

Referensi

Dokumen terkait

• Masing-masing elemen pada double linked list terdiri dari tiga bagian, disamping data dan pointer next , masing-masing elemen dilengkapi dengan pointer prev

Karena double linked list memiliki dua pointer sambungan, maka penyisipan bisa dilakukan sebelum data tertentu atau sesudah data tertentu, berbeda dengan single linked list yang

keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan pointer hapus pada head, kemudian dilakukan pergeseran head ke node

Pembacaan Linked List secara mundur bisa dijelaskan sebagai berikut : • Pertama kali kita atur pointer Bantu sama dengan pointer Awal. • Berikutnya, pointer Awal kita kita arahkan

a) Untuk menambah simpul ditengah senarai kita perlu bantuan sebuah pointer lain, misalnya pointer bantu. Dalam hal ini simpul baru akan diletakkan setelah simpul

dilakukan penunjukkan terlebih dahulu dengan pointer hapus pada head, kemudian dilakukan pergeseran head ke node berikutnya sehingga data setelah head menjadi head baru,

dilakukan penggunakan suatu pointer lain (hapus) yang digunakan untuk menunjuk node yang akan dihapus, barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete.

Penyisipan ditengan pada single linked list adalah dengan cara menyisipkan data baru setelah elemen yang ditunjuk oleh variabel bantu pada list, kemudian pointer variabel