• Tidak ada hasil yang ditemukan

LIS BERKAIT (LINKED LIST) Tennov Simanjuntak

N/A
N/A
Protected

Academic year: 2021

Membagikan "LIS BERKAIT (LINKED LIST) Tennov Simanjuntak"

Copied!
36
0
0

Teks penuh

(1)

LIS BERKAIT

(LINKED LIST)

Tennov Simanjuntak

(2)

Pembahasan Minggu ke-4

Pada Minggu ke-4 (Minggu yang lalu), telah dibahas sub-topik berikut:

– Program yang modular

– Abstract Data Type (ADT) – Lis

– Implementasi lis dengan array dan linked list – Linked List: konstruksi, insersi, dan pencarian.

(3)

Pembahasan minggu ke-5

Pada Minggu ke-5 (Minggu ini), dibahas sub- topik berikut:

– Linked List: pengubahan nilai elemen,

penghapusan elemen, dan penghapusan lis.

– Varian linked list:

• Doubly linked list

• Singly circular linked list

• Doubly circular linked list

(4)

Program yang modular

Salah satu aturan yang baku tentang program adalah program tidak terlalu panjang (best practice: tidak ada fungsi/prosedur/rutin yang melebihi 1 halaman).

Untuk mencapainya, program dibagi ke dalam sekumpulan unit yang disebut modul.

Setiap modul adalah sebuah unit logis yang mengerjakan tugas tertentu.

Keuntungan program modular:

Mudah untuk men-debug (menemukan error, bug).

Memungkinkan pengembangan program secara berkelompok.

Memudahkan modifikasi.

(5)

Lapisan abstraksi (layers of abstraction)

Semua sistem komputer didasarkan pada

konsep lapisan abstraksi (layers of abstraction).

Untuk mengembangkan suatu lapisan abstraksi dibutuhkan:

Pendefinisian objek abstrak

Pendefinisian operasi yang dapat dilakukan pada objek.

(6)

Tipe Data Abstrak (Abstract Data Type)

Abstract Data Type (ADT) adalah sebuah tipe data (kumpulan nilai dan operasi legal pada nilai tersebut) yang dapat diakses hanya melalui antarmuka

(interface).

Kita menyebut sebuah program yang menggunakan ADT sebagai klien (client) dan program yang menspesifikasi tipe data sebagai implementasi

(implementation).

Pada ADT, program client yang bertindak sebagai klien mengakses data melalui operasi-operasi yang disediakan antarmuka tanpa perlu

mengetahui implementasi data dan fungsi.

Jadi konsepnya adalah memberikan kemudahan akses kepada program yang bertindak sebagai klien dengan menyembunyikan implementasi dari data dan fungsi.

ADT dapat dilihat sebagai sebuah ekstensi dari perancangan yang modular.

(7)

Tipe Data Abstrak (Abstract Data Type)

Objek seperti list, himpunan (set), pohon (tree), dan graf bersamaan dengan operasi-operasi yang berassosiasi dengannya dapat dipandang sebagai ADT.

Untuk ADT himpunan (Set ADT) mungkin saja didefinisikan operasi seperti gabungan, irisan, ukuran, dan komplemen.

Atau mungkin kita hanya mendefinisikan gabungan dan pencarian.

Tidak ada aturan yang menyatakan jumlah operasi yang harus didukung oleh sebuah ADT. Ini disesuaikan dengan kebutuhan dan merupakan pertimbangan dalam proses perancangan.

(8)

Penerapan struktur data ADT di C

ADT diterapkan di C dengan cara berikut:

Mendefinisikan operasi-operasi struktur data pada

sebuah antarmuka (interface) yang disimpan dalam berkas pendahulu (header file), yakni berkas dengan ekstensi .h.

Menerapkan (implementasi) antarmuka pada berkas dengan ekstensi .c.

Menggunakan fasilitias pra-pemrosesan (the C

Preprocessor) seperti penyertaan berkas (file inclusion), substitusi makro (macro substitution), dan penyertaan kondisional (conditional inclusion).

(9)

List ADT

List umum mengambil bentuk:

Kita sebut list berukuran n.

Kita akan menyebut list khusus dengan ukuran 0 sebagai list nol (null list).

Untuk setiap list kecuali list nol, kita sebut mengikuti dimana i < n dan mendahului (i > 1).

Elemen pertama list adalah dan elemen terakhir .

Posisi sebuah elemen dalam list adalah i.

a

1

,a

2

,a

3

,. . .,a

n

ai+1

ai ai−1 ai

a1 an

ai

(10)

List ADT

Diassosiasikan dengan definisi list pada slide sebelumnya adalah sekumpulan operasi yang dapat dilakukan atas list.

Beberapa operasi yang penting adalah:

find, yang mengembalikan posisi dari kemunculan pertama dari kunci pencarian.

insert

delete

find_kth, yang mengembalikan elemen pada posisi k.

make_null

print_list

(11)

Implementasi list dengan array

List ADT berikut operasinya bisa diterapkan dengan menggunakan array.

Akan tetapi, cara ini tidak baik dengan alasan berikut:

Estimasi jumlah maksimum n diperlukan untuk meningkatkan efisiensi memori.

Meskipun dapat dilakukan alokasi memori dinamik, tetap memerlukan operasi realokasi memori yang membutuhkan sumber daya komputasi yang banyak jika terjadi perubahan jumlah elemen.

Operasi find dan print dapat dilakukan dalam waktu linier O(n).

Operasi find_kth dapat dilakukan dalam waktu konstan O(1).

Operasi insert dan delete dengan penyisipan sangat mahal karena memerlukan penyusunan (mendorong) elemen-elemen array.

(12)

Lis berkait (linked list): definisi

Implementasi list menggunakan linked list memberikan solusi ketidakefisienan implementasi list dengan array.

Implementasi linked list dapat menghindari biaya linier (linear cost) dari aksi insert dan delete dari satu elemen.

Linked list didefinisikan sebagai kumpulan elemen dimana setiap elemen merupakan bagian dari sebuah simpul (node) yang juga berisi kaitan ke sebuah simpul yang lain [2].

Linked list dapat juga didefinisikan sebagai kumpulan struktur yang tidak perlu saling berdekatan di memori

dimana setiap struktur terdiri atas elemen dan pointer ke struktur yang mengikutinya [1].

(13)

Lis berkait (linked list): definisi

Kita sebut pointer ke struktur selanjutnya sebagai next pointer (pointer berikut).

Next pointer dari struktur terakhir bernilai 0

(NULL).

(14)

Linked list: representasi

Representasi linked list

Representasi linked list dengan nilai pointer aktual

Untuk dapat mengakses elemen list di atas, kita harus tahu informasi mengenai struktur pertama (elemen list pertama).

(15)

Linked list dengan header

Header adalah node penanda (sentinel) yang

berada pada posisi 0 (posisi pertama dari list).

(16)

Representasi node sebagai struktur

Sebuah node/simpul pada linked list, dalam bahasa pemrograman C dipresentasikan sebagai struktur dengan 2 variabel anggota, yakni:

elemen (nilai) dan pointer ke simpul berikutnya.

Didefinisikan oleh struct berikut ini (header file) :

(17)

Representasi node sebagai struktur

Dalam implementation file (.c).

(18)

Konstruksi linked list

Pada prinsipnya, konstruksi atau pembuatan linked list terdiri atas 2 langkah, yakni:

Pembuatan header

Penyisipan/pemasukan (element insertion)

(19)

Pembuatan header

Sebuah linked list direpresentasikan oleh

header, sebuah penanda yang berada di awal

atau pada node 0.

(20)

Fungsi pembuatan header

(21)

Penyisipan elemen (element insertion)

Pada aksi insert, sebuah elemen akan disisipkan atau dimasukkan ke dalam list L pada posisi P.

Fungsi insert akan menyisipkan elemen tersebut

setelah posisi node yang ditunjuk oleh P.

(22)

Fungsi penyisipan elemen

(23)

Pencarian di linked list

Ada 2 pencarian yang dapat dilakukan di linked list, yakni:

Pencarian berdasarkan nilai elemen (search key merupakan nilai elemen).

Pencarian berdasarkan indeks elemen (pada kasus ini anda hendak mendapatkan nilai elemen dari node pada indeks atau urutan ke-k).

Pencarian berdasarkan nilai elemen diwakili oleh fungsi: find(key, L) dapat dilakukan dalam waktu linier dengan batas atas O(n).

Pencarian berdasarkan indeks elemen diwakili oleh fungsi: find_kth(i, L) tidak seefisien implementasi list menggunakan array. Kompleksitas

implementasi array adalah O(1) sedangkan linked list sebesar O(i).O

(24)

Pencarian berdasarkan nilai elemen

Deklarasi fungsi pada antar muka (berkas header, .h).

Position Find( ElementType X, List L );

Implementasi fungsi (.c)

(25)

Pengubahan nilai elemen (update)

Untuk mengubah nilai elemen, pertama sekali posisi elemen perlu dicari. Setelah posisi

didapatkan maka nilai elemen diubah.

Deklarasi fungsi pada antar muka ( header - .h).

void Update(ElementType X, Position P);

Implementasi fungsi (.c)

void Update(ElementType X, Position P){

P->Element = X;

}

(26)

Penghapusan elemen (element deletion)

Illustrasi:

Dari illustrasi dapat dipahami bahwa penghapusan elemen dilakukan dengan menghapus simpul.

Untuk menghapus elemen, program harus tahu simpul yang mendahului (simpul pendahulu atau predecessor).

Penghapusan simpul dilakukan dengan membebaskan(menghapus) memori yang telah dialokasikan sebelumnya dengan fungsi

penghapusan memori pada pustaka stdlib: free(pointer).

Penghapusan elemen dapat dilakukan dengan kompleksitas O(n).

(27)

Penghapusan elemen (element deletion)

Deklarasi fungsi pada antar muka (header - .h).

Position FindPrevious(ElementType X, List L);

void Delete(ElementType X, List L);

Implementasi fungsi FindPrevious(.c)

(28)

Penghapusan elemen (element deletion)

Sebelum melakukan penghapusan, ada baiknya diperiksa apakah lis memiliki element atau tidak.

Deklarasi fungsi untuk memeriksa lis kosong atau tidak (header - .h):

int IsEmpty(List L);

Implementasi fungsi IsEmpty(.c)

int IsEmpty(List L){

return L->Next == NULL;

}

(29)

Penghapusan elemen (element deletion)

Implementasi fungsi Delete(.c)

(30)

Penghapusan linked list (list deletion)

Penghapusan linked list dilakukan dengan

menghapus semua simpul yang ada pada linked list.

Setelah itu, klien program dapat membebaskan memori untuk header lis.

Penghapusan linked list (semua elemen) dapat

dilakukan dengan kompleksitas O(n).

(31)

Penghapusan linked list (list deletion)

Deklarasi fungsi pada antar muka (header - .h).

void DeleteList(List L);

Implementasi (berkas .c)

(32)

Varian linked list

Linked list yang telah anda pelajari disebut dengan linked list dengan pengait/pointer tunggal (singly linked list).

Ada beberapa lagi varian dari linked list seperti:

Linked list dengan pointer ganda (doubly linked list).

(33)

Varian linked list

Circular linked list: linked list dimana simpul terakhir menunjuk ke simpul pertama

Singly circular linked list

Doubly circular linked list

(34)

ADT untuk varian linked list

Pada prinsipnya ADT untuk varian linked list

mengikuti teknik-teknik yang telah anda terapkan pada Linked List ADT (singly linked list).

Perbedaan implementasi disebabkan oleh

struktur dan pengorganisasian pointer (pengait).

Oleh sebab itu, pembuatan ADT untuk varian

linked list yang lain diberikan sebagai bahan

latihan pemrograman struktur data bagi anda.

(35)

?

(36)

Referensi

1. M.A.Weiss, Data Structures and Algorithm

Analysis in C, 2nd eds., Addison-Wesly, 1997.

2. R. Sedgewick, Algorithms in C, Parts 1 -4, 3rd

edition, Addison-Wesley 1998.

Referensi

Dokumen terkait

Otitis media akut dapat dise#a#kan invasi virus Campak ke dalam telin$a ten$a!% Gendan$ telin$a #iasana !peremia pada fase prodormal dan stadium erupsi% 4ika terjadi invasi

positi untuk (at bermuatan negati !anoda#. 3lektrolit dalam jam lemon bertenaga adalah asam sitrat. erakan elektron dimulai ketika lapisan seng pada salah satu paku

Strategi ini bertujuan untuk mendapatkan keuntungan lebih melalui penekanan biaya produksi dengan menemukan pemasok alternatif sehingga harga bahan baku

Dalam rancangan tampilan ini terdapat 2 button yang dapat dipilih oleh pengguna, yaitu button1 merupakan tombol informasi yang berfungsi untuk masuk ke dalam halaman

Ide dalam penelitian ini berawal dari Sistem Informasi Sinode Wilayah GKI (SISWA GKI) yang akan menggunakan banyak platform pada sistem tersebut, seperti web, desktop,

Kita seyogyanya tak perlu merasa rendah diri dengan kemampuan matahari, bulan, angin, laut, maupun setan yang dalam beberapa bidang melangkahi kesanggupan manusia,

Peneliti : Selain berdasarkan nilai ulangan harian, apakah ada informasi lain yang digunakan dalam menetapkan peserta didik yang harus mengikuti program remedi?. Guru : Tidak

Mahasiswa mampu mengembangkan beberapa algoritma untuk memanipulasi beberapa elemen list (berbasis array, linked list dan doubly linked list) serta dapat menjelaskan