Academia.eduAcademia.edu

Algoritma & Struktur Data Algoritma & Struktur Data

Algoritma Algoritma & & Struktur Struktur Data Data Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com HP: 0888-673-1891 URL: http://asnugroho.net/lecture/ds.html Name Anto Satriyo Nugroho Birthday October 1970 Education received B.Eng(S1), M.Eng (S2) and Dr.Eng (S3) from Nagoya Institute of Technology, Japan (Electrical & Computer Eng.) in 1995, 2000 dan 2003. Scholarship from Pemerintah RI (S1) & Japanese government Monbukagakusho (S2 & S3) Core competence - Pattern Recognition, Artificial Intelligence & Datamining - Biomedical Engineering & Bioinformatics/Computational Biology - Research activities & publications can be seen from http://asnugroho.net/ Work experiences • 1990-now BPP Teknologi (Pusat Teknologi Informasi & Komunikasi) • 2003-2004 Visiting Professor at School of Computer & Cognitive Sciences, Chukyo University, Japan • 2004-2007 Visiting Professor at School of Life System Science & Technology, Chukyo University, Japan • 2003-2007 Researcher at Institute for Advanced Studies of Artificial Intelligence, Chukyo University Japan • 2007-now Vice president of Indonesian Society for Softcomputing • 2007-now Lecturer at Swiss German University, Al Azhar Univ. Indonesia Referensi Referensi 1. Donald E. Knuth, The Art of Computer Programming: Vol.1-3 Fundamental Algorithms, 3rd Ed., Addison Wesley, 1997 2. Thomas Cormen, Charles Leiserson, Introduction to Algorithms (2nd ed.), MIT Press, 2001 3. Hiroyuki Kondoh, Teihon C puroguramaa no tameno arugorizumu to deta kouzou, Softbank Publishing, 1998 Berbahasa Jepang, buku teks struktur data dan algoritma yang sangat terkenal di Jepang. Saat masih mengajar di Chukyo Univ., saya memakai buku ini sebagai buku teks. Slide saya buat berdasarkan penjelasan yang diberikan pada buku ini 4. Bohyoh Shibata, Meikai C Gengo Nyuumon-hen, Softbank publishing, 2004 Dr.Shibata menerima penghargaan untuk buku teks C++ yang ditulisnya. Sebagaimana halnya dengan buku teks C++, buku pengantar C di atas ditulis dengan bahasa yang mudah difahami dengan contoh-contoh yang memudahkan seseorang memahami bahasa C. Beberapa contoh yang saya tampilkan pada kuliah ini merujuk pada buku ini. 5. Thompson Susabda Ngoen, Pengantar Algoritma dengan Bahasa C, Penerbit Salemba Teknika, 2006 Cara Cara Belajar Belajar 1. Datang tepat waktu. Toleransi keterlambatan adalah 15 menit. Siswa yang datang terlambat lebih dari 15 menit tetap berhak mengikuti kuliah, tetapi dihitung sebagai tidak hadir. 2. Apabila ada kendala yang menyebabkan keterlambatan tidak dapat dihindari, informasikan ke dosen lewat SMS (nama & alasan). Apabila alasan dapat diterima, walau terlambat sekalipun absensi tetap dihitung hadir. 3. Membuat catatan: misalnya dengan mem-print slide dan membuat catatan pada slide 4. Ketinggalan sekali saja, akan berakibat fatal. Cukup berat memahami kuliah berikutnya. 5. Kalau tidak faham segera bertanya 6. Kalau terlalu cepat, jangan segan minta agar diperlambat 7. Kalau terlalu lambat, jangan segan minta agar dipercepat 8. Mengulang materi yang diajarkan di rumah 9. Melatih SENDIRI kemampuan programming dari materi yang diajarkan UJIAN UJIAN LISAN LISAN 10.Di akhir tiap kuliah akan diberikan beberapa soal untuk latihan/PR 11.Minggu berikutnya diadakan UJIAN LISAN berdasarkan soal yang diberikan sebagai PR 12.Nilai ujian lisan akan berpengaruh pada penentuan nilai akhir 13.Saya ingin anda semua memperoleh 100 untuk ujian LISAN. Karena itu silakan perbaiki nilai ujian lisan anda. Perbaikan nilai ujian lisan dapat dilakukan di sebarang waktu (konsultasikan waktu anda dengan saya via email asnugroho@gmail.com) 14.Tidak ada Ujian Ulang ! Struktur Data dan Algoritma bukan matakuliah yang dapat difahami dalam semalam ! Apakah Apakah Algoritma Algoritma & & Struktur Struktur Data Data itu itu ?? Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html Ketentuan Ketentuan & & Asumsi Asumsi • Menguasai pemakaian bahasa C, terutama – pointer – structure • Materi kuliah dapat didownload dari http://asnugroho.net/lecture/ds.html Agenda Agenda 1 Pendahuluan: apakah algoritma & struktur data itu ? Array: satu dimensi & multidimensi 2 Array & Pointer & Structure Latihan array, pointer & structure 3 Computational Complexity Latihan array, pointer & structure 4 Linear list, stack & queue (1) Latihan 5 Linear list, stack & queue (2) Latihan 6 Doubly-linked list & tree structure (1) Latihan Agenda Agenda 7 Tree structure (2) Latihan 8 Hash Latihan 9 Sequential & Binary Search Latihan 10 Selection sort & Insertion sort Latihan pemrograman selection sort & insertion sort 11 Quick sort & Merge sort Latihan pemrograman quick & merge sort 12 Review Review Tahapan Tahapan dalam dalam Pemrograman Pemrograman 1. 2. 3. Analisa masalah Memilih algoritma dan struktur data untuk menyelesaikan masalah itu Coding Programming tidak hanya sekedar mengetik di keyboard Definisi Definisi Algoritma: prosedur terbatas yang terdiri beberapa operasi menyelesaikan suatu masalah (Ibaraki) program: algoritma yang diimplementasikan dalam bahasa pemrograman tertentu Struktur data cara pengaturan data agar bisa disimpan memory komputer secara efisien Hubungan Hubungan antara antara Algoritma Algoritma & & Struktur Struktur Data Data Wirth: algoritma + struktur data = program • Algoritma →penyelesaian satu masalah secara matematis • Turing machine – Model matematika komputer – Memiliki tape dengan panjang tak terhingga sebagai alat penyimpan ingatan (memory) – Running time, kecepatan tak terhingga • Padahal komputer yang ada sangat terbatas baik memory maupun kecepatannya Turing Turing Machine Machine • Status controller • head … • Head bergeser ke kirikanan dengan kecepatan tak terbatas Head membaca/menulis data pada pita Panjang pita tak terbatas … Pita 1 dimensi dengan panjang tak terhingga Hubungan Hubungan antara antara Algoritma Algoritma & & Struktur Struktur Data Data Di dunia nyata, kemampuan komputer maupun memory sangat terbatas 1234.345 12.4 14.5 42.0 19.902 17.8 Hubungan Hubungan antara antara Algoritma Algoritma & & Struktur Struktur Data Data • Performa algoritma yang ideal – Memory yang diperlukan kecil,running time singkat • Tradeoff antara waktu dan ruang (memory) Memory Besar Running time Lama Singkat Kecil Hubungan Hubungan antara antara Algoritma Algoritma & & Struktur Struktur Data Data • Bagaimana data harus direpresentasikan saat membuat program ? Struktur data List, stack, queue, tree, dll • Algoritma yang baik + Struktur data yang tepat = program yang baik – Pemilihan algoritma dan struktur data yang tepat harus mempertimbangkan skala data, CPU, memori, dsb. – Perlu pengetahuan algoritma dan struktur apa saja yang ada dan mungkin dipakai Contoh Contoh Algoritma: Algoritma: BUBBLE BUBBLE SORT SORT banyaknya data: n Data diurutkan/disorting dari yang bernilai besar Proses step 1 : step 2 : : … step n-1 Periksalah nilai dua elemen mulai dari urutan ke-n sampai urutan ke-1. Jika nilai kiri<kanan, tukarkan kedua data itu. Periksalah nilai dua elemen mulai dari urutan ke-n sampai urutan ke-2. Jika nilai kiri<kanan, tukarkan kedua data itu. Periksalah nilai dua elemen mulai dari urutan ke-n sampai urutan ke-n-1. Jika nilai kiri<kanan, tukarkan kedua data itu. Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 7 4 5 8 10 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 7 4 5 10 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 7 4 10 5 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 7 10 4 5 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 7 4 5 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 7 4 8 5 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 7 8 4 5 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Step-3 10 8 7 4 5 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Step-3 10 8 7 5 4 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Step-3 10 8 7 5 4 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Step-3 10 8 7 5 4 Step-4 10 8 7 5 4 Perhatikan Perhatikan !! • Apakah yang anda peroleh setelah satu iterasi dalam bubble sort selesai ? – Setelah iterasi pertama selesai, elemen dengan nilai terbesar akan muncul di ujung paling kiri – Setelah iterasi kedua selesai, elemen dengan nilai terbesar kedua akan muncul pada urutan kedua dari kiri – dst. QUIZ QUIZ 1. Urutkan deret angka berikut dengan bubble sort 13 14 10 4 18 20 25 17 2. Tuliskan hasil tiap langkah (step). Bubble Bubble Sort Sort Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html Contoh Contoh Algoritma: Algoritma: BUBBLE BUBBLE SORT SORT banyaknya data: n Data diurutkan/disorting dari yang bernilai besar Proses step 1 : step 2 step n-1 Periksalah nilai dua elemen mulai dari urutan ke-n sampai urutan ke-1. Jika nilai kiri<kanan, tukarkan kedua data itu. Periksalah nilai dua elemen mulai dari urutan ke-n sampai urutan ke-2. Jika nilai kiri<kanan, tukarkan kedua data itu. : : Periksalah nilai dua elemen mulai dari urutan ke-n sampai urutan ke-n-1. Jika nilai kiri<kanan, tukarkan kedua data itu. Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 7 4 5 8 10 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 7 4 5 10 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 7 4 10 5 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 7 10 4 5 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 7 4 5 8 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 7 4 8 5 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 7 8 4 5 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Step-3 10 8 7 4 5 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Step-3 10 8 7 5 4 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Step-3 10 8 7 5 4 Bubble Bubble Sort: Sort: tahap tahap demi demi tahap tahap Awal 7 4 5 8 10 Step-1 10 7 4 5 8 Step-2 10 8 7 4 5 Step-3 10 8 7 5 4 Step-4 10 8 7 5 4 Perhatikan Perhatikan !! • Apakah yang anda peroleh setelah satu iterasi dalam bubble sort selesai ? – Setelah iterasi pertama selesai, elemen dengan nilai terbesar akan muncul di ujung paling kiri – Setelah iterasi kedua selesai, elemen dengan nilai terbesar kedua akan muncul pada urutan kedua dari kiri – dst. C C Program Program untuk untuk Bubble Bubble Sort Sort void bubble_sort(int x[ ], int datanum) { int i,j; int tmp; for(i=0;i<datanum-1;i++) for(j=datanum-1;j>i;j--) { if( x[j-1] < x[j]) { tmp=x[j]; x[j]=x[j-1]; x[j1]=tmp; } } } #include <stdio.h> bubble_sort(int x[],int datanum) { int i,j; int tmp; for(i=0;i<datanum-1;i++) for(j=datanum-1;j>i;j--) if( x[j-1] < x[j]) { tmp=x[j]; x[j]=x[j-1]; x[j-1]=tmp; } } int main(void) { int i; int data[10]= {10,3,2,1,4,7,6,9,5,8}; bubble_sort(data,10); for(i=0;i<10;i++){ printf("%d %d\n",i,data[i]); } } Computational Computational Complexity Complexity Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html Agenda Agenda 1 Pendahuluan: apakah algoritma & struktur data itu ? Array & Pointer & Structure (1): satu dimensi & multidimensi 2 Array & Pointer & Structure (2) Array & Pointer & Structure (3) 3 Computational Complexity Array & Pointer & Structure (4) 4 Linear list, stack & queue (1) Latihan 5 Linear list, stack & queue (2) Latihan 6 Doubly-linked list & tree structure (1) Latihan Agenda Agenda 7 Tree structure (2) Latihan 8 Hash Latihan 9 Sequential & Binary Search Latihan 10 Selection sort & Insertion sort Latihan pemrograman selection sort & insertion sort 11 Quick sort & Merge sort Latihan pemrograman quick & merge sort 12 Review Review Apakah Apakah program program yang yang baik baik itu itu ?? Bagaimanakah cara membuat program yang baik ? Algoritma yang tepat/sesuai dengan masalah +pemilihan struktur data yang tepat Bagaimana mengukur baik-tidaknya sebuah algoritma ? ”Order sebuah algoritma” Computational complexity sebuah algoritma Bagaimana mengukur kualitas sebuah algoritma ? Sortinglah deretan angka di bawah ini : 1 5 3 2 100 12 25 17 23 13 … Algoritma sorting sangat bervariasi. Bagaimana memilih algoritma yang terbaik ? Apakah Apakah WAKTU WAKTU merupakan merupakan parameter parameter tepat tepat untuk untuk mengukur mengukur kualitas kualitas sebuah sebuah algoritma algoritma ?? Cepat tidaknya jalannya sebuah program sangat bergantung kepada arsitektur komputer Komputer tua/lambat 1 jam Komputer baru/cepat 1 detik Waktu bukan parameter yang baik, karena sangat tergantung arsitektur komputer Apakah Apakah WAKTU WAKTU merupakan merupakan parameter parameter tepat tepat untuk untuk mengukur mengukur kualitas kualitas sebuah sebuah algoritma algoritma ?? Waktu yang diperlukan untuk menjalankan sebuah program juga sangat tergantung kualitas code (kemampuan programmer), walaupun dijalankan pada komputer yang sama Program yang ditulis A 10 s Program yang ditulis B 30 s Standar Standar evaluasi evaluasi Algoritma Algoritma • Pada prinsipnya diukur berdasarkan waktu eksekusi/menjalankan program tsb. • Masalah: 1. Sangat tergantung pada komputer yang dipakai untuk menjalankan program 2. Sangat tergantung pada kualitas programmer dalam menuliskan program Evaluasi memakai computational Complexity (Big Oh notation) Complexity Complexity • Definisi: Waktu yang diperlukan untuk menjalankan sebuah algoritma pada sebuah komputer virtual, yang direpresentasikan secara “kasar” sebagai fungsi dari n (n adalah banyaknya input data) • Karakteristik: tidak dipengaruhi oleh hardware komputer maupun kemampuan programming • O : representasi worst-case complexity 2 O(n ) Complexity algoritma berbanding lurus terhadap n2 (n adalah banyaknya input data) Worst Worst case case vs vs Average Average complexity complexity • Worst case complexity: mengasumsikan input data dalam kondisi terburuk • Average complexity:sulit untuk dihitung • Umumnya algoritma dievaluasi berdasarkan worst case complexity • Contoh perkecualian Quicksort 2 Worst case complexity: O(n ) Average complexity: O(n logn) Karakteristik Karakteristik worst worst case case complexity complexity O O( f (n)) + O(g(n)) = O(max(f (n), g(n))) Dua operasi yang berturutan dengan complexity masing-masing dalam fungsi f dan g, maka complexity total adalah yang terbesar antara f dan g O( f (n)) ⋅ O(g(n)) = O( f (n) ⋅ g(n)) Bila sebuah operasi dengan complexity O(f(n)) dijalankan pada O(g(n)) kali, maka complexity total operasi tersebut adalah f x g O Catatan Catatan Penting Penting • Big Oh notation merepresentasikan evaluasi algoritma terhadap input data sebanyak n • Nilai yang berada dalam tanda kurung () adalah 1, log n, n, n2, n pangkat bilangan bulat yang lain • Notasi ini mengabaikan koefisien berupa konstanta seperti 2, 100, 0.1, atau berupa variabel a Contoh: O(2n) ditulis sebagai O(n), karena 2 diabaikan Contoh Contoh O(3n 2 ) + O(2n) = O ( n 2 ) + O ( n) = O(max(n 2 , n)) O(n 2 ) = O(n2 ) + O(n) = O(max(n2 , n)) 2 = O(n ) O(n 2 )O(n) = O(n 2 .n) = O(n 3 ) 22dst Relasi nilai n, log (n), n Relasi nilai n, log (n), n dst 2 1 logn n n logn n 3 n kecil k L n n log n n log n n*n n*n*n 2^n 1 0.00 0.00 1 1 2 2 1.00 2.00 4 8 4 3 1.58 4.75 9 27 8 4 2.00 8.00 16 64 16 5 2.32 11.61 25 125 32 6 2.58 15.51 36 216 64 7 2.81 19.65 49 343 128 8 3.00 24.00 64 512 256 9 3.17 28.53 81 729 512 10 3.32 33.22 100 1000 1024 11 3.46 38.05 121 1331 2048 n 2 besar Hafalkan urutan di atas ! Catatan Catatan dalam dalam memilih memilih algoritma algoritma 1. 2. 3. 4. Compexity saja tidak cukup Contoh: Hash memiliki complexity yang kecil. Tetapi memiliki beberapa kelemahan seperti hilangnya informasi urutan registrasi data, masalah pada memory dsb. Untuk data berskala kecil, tidak selamanya algoritma yang ordernya kecil selalu lebih baik daripada algoritma yang berorder besar (algoritma yang berorder kecil, bisa jadi memiliki koefisien konstanta bernilai besar) Algoritma yang berorder kecil kadangkala memerlukan waktu yang lebih lama dalam proses coding (penulisan program) program yang sering dipakai: pilihlah algoritma yang berorder complexitykecil program yang hanya sekali pakai (jarang): pilihlah yang paling mudah dalam proses coding Trade of antara waktu dan memory Complexity Complexity Bubble Bubble Sort Sort Hitunglah complexity bubble sort ! 1. void bubble_sort(int x[ ], int datanum) 2. { 3. int i,j; 4. int tmp; 5. for(i=0;i<datanum-1;i++) 6. for(j=datanum-1;j>i;j--) 7. if( x[j-1] < x[j]) { 8. tmp=x[j]; 9. x[j]=x[j-1]; 10. x[j-1]=tmp; 11. } 12. } Complexity Complexity Bubble Bubble Sort Sort 1. 2. 3. Baris ke-5: area kuning array scanning dari kiri ke kanan diulang sebanyak (n-1) kali Complexity: O(n) Baris ke-6: area hijau array scanning dari kanan ke kiri, tiap 2 buah data dibandingkan dan jika urutan besar-kecilnya tidak benar, kedua data di swap. Rata-rata: n/2 Complexity: O(n) Baris ke 7-11: area abu-abu tidak ada loop complexity: O(1) Total complexity: O(n) x O(n) x O(1) = O(n2) Latihan Latihan Sederhanakan notasi berikut O(3n 2 + log n) + O(n log n + 3n) = O(n log n + 4n)O(4n) = O(2 n ) + O (10n log n + 2n 2 + log n) + O (30 log n + 3n) = List, List, Stack Stack & & Queue Queue Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html Beberapa Beberapa Jenis Jenis Struktur Struktur Data Data 1. Array 1. Linear List 2. Stack 3. Queue 1. Apa ? 2. Bagaimana cara implementasinya ? 2. List 1. Connected List 2. Circular List 3. Doubly-linked List 4. Multi list structure 3. Tree Structure Linear Linear List List Apakah Apakah Linear Linear List List itu itu ?? • Sekumpulan elemen yang diatur secara terurut x[1], x[2],L, x[k −1], x[k], x[k +1],L, x[n] • Linear List tidak sama dengan Connected-List Operasi Operasi pada pada Linear Linear List List No. Operasi 1 Menambahkan sebuah elemen sebelum elemen ke-k 2 Menghapus elemen ke-k 3 Membaca/menulis isi elemen ke-k 4 Mencari elemen dengan key tertentu 5 Menggabungkan beberapa list menjadi satu 6 Memecah sebuah list ke beberapa buah 7 Mengcopy sebuah list 8 Menghitung banyaknya elemen dalam sebuah list List, List, Stack Stack & & Queue Queue • Tidak semua operasi list diperlukan pada setiap program – Penentuan struktur data didasarkan pada operasi yang diperlukan saja agar bisa berjalan dengan efisien • Pada sebuah Linear List, penyisipan dan penghapusan elemen dapat dijalankan di sebarang posisi • Bentuk khusus linear list: Penambahan elemen dan penghapusannya dilakukan di posisi terdepan atau posisi terbelakang saja Stack Queue Stack dan Queue juga merupakan salah satu jenis list List, List, Stack Stack & & Queue Queue • Pada sebuah Linear List, penyisipan dan penghapusan elemen dapat dijalankan di sebarang posisi • Penambahan dan penghapusan elemen pada stack/queue dilakukan di posisi terdepan atau posisi terbelakang saja 1 2 3 4 5 6 Stack 1 2 3 4 5 6 Queue 1 2 3 4 5 6 List Stack Stack Apakah Apakah Stack Stack itu itu ?? Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi PUSH : Menambahkan elemen pada sebuah stack PUSH 1 top== bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi PUSH : Menambahkan elemen pada sebuah stack PUSH 2 1 top bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi PUSH : Menambahkan elemen pada sebuah stack PUSH 3 top 2 1 bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi PUSH : Menambahkan elemen pada sebuah stack PUSH 4 top 3 2 1 bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi PUSH : Menambahkan elemen pada sebuah stack 5 PUSH top 4 3 2 1 bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi PUSH : Menambahkan elemen pada sebuah stack 6 top 5 PUSH 4 3 2 1 bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi POP : Menghapus sebuah elemen dari sebuah top stack 6 5 POP 4 3 2 1 bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi POP : Menghapus sebuah elemen dari sebuah stack 5 POP top 4 3 2 1 bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi POP : Menghapus sebuah elemen dari sebuah stack POP 4 top 3 2 1 bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi POP : Menghapus sebuah elemen dari sebuah stack POP 3 top 2 1 bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi POP : Menghapus sebuah elemen dari sebuah stack POP 2 1 top bottom Apakah Apakah Stack Stack itu itu ?? • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan • Yang dihapus adalah elemen yang paling terakhir ditambahkan • Nama lain: LIFO (Last In First Out) • Operasi POP : Menghapus sebuah elemen dari sebuah stack POP 1 top==bottom Apakah Apakah Stack Stack itu itu ?? PUSH dan POP Stack Stack Overflow Overflow & & Stack Stack Underflow Underflow • Stack Overflow Menambahkan data pada sebuah stack yang telah penuh • Stack Underflow Menghapus data dari sebuah stack yang sudah kosong Queue Queue Apakah Apakah Queue Queue itu itu ?? Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front==rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 3 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 3 4 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 3 4 5 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 3 4 5 6 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 1 front 2 3 4 5 6 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 2 front 3 4 5 6 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 3 front 4 5 6 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 4 front 5 6 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 5 front 6 rear Apakah Apakah Queue Queue itu itu ?? • Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain • Data yang dihapus adalah data yang paling awal ditambahkan • Nama lain: FIFO (First In First Out) • Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 6 front==rear Animasi Animasi Queue Queue ENQUEUE dan DEQUEUE Latihan Latihan 11 • Gambarkan kondisi stack setelah dilakukan operasi berikut: push(10); push(2); pop(); push(20); pop(); push(15); push(5); 2 10 10 Latihan Latihan 22 • Gambarkan kondisi queue setelah dilakukan operasi berikut: enqueue(10); 10 enqueue(32); enqueue(5); dequeue(); enqueue(10); dequeue(); dequeue(); 10 32 Beberapa jenis struktur data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. 2. 3. 4. Connected List Circular List Doubly-linked List Multi list structure 3. Tree Structure 1. Apa ? 2. Bagaimana cara implementasinya ? Implementasi Linear List • List size (banyaknya elemen): n x[1], x[ 2], L , x[ k − 1], x[ k ], x[ k + 1], L , x[ n] • Memasukkan (menyisipkan) data baru sebelum data no.k ①Mencari posisi dimana data harus dimasukkan 31 10 12 14 16 1 2 3 4 … … 18 20 k-1 k 22 24 k+1 k+2 … 26 n Implementasi Linear List • List size (banyaknya elemen): n x[1], x[ 2], L , x[ k − 1], x[ k ], x[ k + 1], L , x[ n] • Memasukkan (menyisipkan) data baru sebelum data no.k 31 ② data sesudah no.k digeser (shift) satu ke belakang 10 12 14 16 1 2 3 4 … … 18 k-1 k 20 22 k+1 k+2 24 … n 26 Implementasi Linear List • List size (banyaknya elemen): n x[1], x[ 2], L , x[ k − 1], x[ k ], x[ k + 1], L , x[ n] • Memasukkan (menyisipkan) data baru sebelum data no.k • Rata-rata shift data: n/2 Computational complexity: O (n) 10 12 14 16 1 2 3 4 … … 18 31 k-1 k 20 22 k+1 k+2 24 … 26 n+1 Implementasi Linear List • Membaca/menulis konten sebuah data: O(1) random access • Penambahan data: O(n) • Penghapusan data: O(n) Stack lambat Queue efisien dalam komputasi Beberapa jenis struktur data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. 2. 3. 4. Connected List Circular List Doubly-linked List Multi list structure 3. Tree Structure 1. Apa ? 2. Bagaimana cara implementasinya ? Implementasi Stack memakai Array • Penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling depan top n (stack pointer) Menunjuk ke satu posisi di atas top x[n-1] x[n-2] … Menambahkan data ke stack (PUSH) x[n++] = data; x[3] x[2] x[1] bottom x[0] Menghapus data dari stack (POP) data =x[--n]; Saat PUSH/POP dilakukan, jangan lupa mengupdate stack pointer Suplemen (cara pemakaian ++ dan --) n++ n -- setelah diproses n = n + 1 setelah diproses n = n – 1 x[7] 10 x[6] x[5] 13 x[4] 9 x[3] 5 x[2] 14 x[1] 2 x[0] 3 7 ++n sebelum diproses n = n + 1 -- n sebelum diproses n = n – 1 n=3; printf(“%d\n”,x[n]); 5 3 printf(“%d\n”, n); printf(“%d\n”,x[++n]); 9 printf(“%d\n”, n); 4 printf(“%d\n”,x[n++]); 9 5 printf(“%d\n”, n); printf(“%d\n”,x[n--]); 7 printf(“%d\n”, n); 4 printf(“%d\n”,x[--n]); 5 printf(“%d\n”, n); 3 Implementasi Stack • 4 operasi utama dalam implementasi stack 1.init :inisialisasi stack (mengosongkan stack) 2. push:menambahkan data pada stack 3. pop :menghapus data dari stack 4. empty:memeriksa apakah stack sudah kosong atau tidak Reverse Polish Notation (RPN) • • • Reverse Polish Notation: menaruh operator di belakang Nama lain : postfix notation Implementasi RPN memakai stack 1. Jika “angka”, tambahkan pada stack 2. Jika “operator”, turunkan (POP) dua buah data dari stack, lakukan perhitungan, dan tambahkan (PUSH) hasilnya pada stack Reverse Polish Notation (RPN) • Downloadlah program dari situs kuliah, compile dan jalankan • Cara penulisan A+B A B + A −B A / B A B − A B / A ∗ B A B ∗ Reverse Polish Notation (RPN) while ((c = getchar()) != EOF) { Setelah baris ke-67 if (isdigit(c)) { ungetc(c, stdin); Jika input data adalah angka, baca ulang scanf("%ld", &x); Data tsb dan PUSH-lah data itu pada stack push(x); } x else { switch (c) { ? case '+': ? b = pop(); a = pop(); push(a + b); Jika input data itu bukan angka, lakukan perhitungan sesuai dengan operasi yang break; ditunjukkan oleh input data tsb. (+,-,*,/) case '-': … …. } } } switch (c) { case '+': b = pop(); a = pop(); Jika operator itu ‘+' push(a + b); break; case '-': b = pop(); a = pop(); Jika operator itu ‘-' push(a - b); break; case '*': b = pop(); a = pop(); Jika operator itu ‘∗' push(a * b); break; case '/': b = pop(); a = pop(); Jika operator itu ‘/' push(a / b); break; case '\n': if (! empty()) printf(“Jawab: %ld \n", pop()); Jika return key init(); break; pop pop push b a a+b ? ? ? ? Reverse Polish Notation (RPN) Contoh-1 10 + 5 Data di PUSH ke stack Jika operator, lakukan operasi pada dua data terakhir yang di PUSH ke stack 10 5 + + 10 5 5 10 10 push(10) push(5) 10+5 hitung !! 15 Reverse Polish Notation (RPN) Contoh-2 10 / 5 Data di PUSH ke stack Jika operator, lakukan operasi pada dua data terakhir yang di PUSH ke stack 10 5 / / 10 5 5 10 10 push(10) push(5) 10/5 hitung !! 2 Reverse Polish Notation (RPN) Contoh-3 10 * (5 +4) A∗B→AB∗ (banyaknya input > 2) 10, (5+4) , * A+B→AB+ 10 , ( 5, 4, +), * 10 5 4 + * + 10 ∗ 4 4 5 5 5 9 9 10 10 10 10 10 90 Reverse Polish Notation (RPN) ⎛ 12 ⎞ ⎛ 14 ⎞ ⎜ 6 − ⎟, ⎜ ⎟,* 3⎠⎝2⎠ ⎝ Contoh-4 ⎛ 12 ⎞ 14 ⎜6 − ⎟∗ 3⎠ 2 ⎝ ⎛ ⎛ 12 ⎞ ⎞ ⎜⎜ 6, ⎜ ⎟,− ⎟⎟, (14,2, /),* ⎝ ⎝3⎠ ⎠ (6, (12,3, /),−), (14,2, /),* 6 12 3 / − 14 2 / * / 3 6 / − 3 12 12 12 4 4 6 6 6 6 6 2 2 ∗ 2 14 14 14 7 7 2 2 14 2 2 2 Latihan 1 a) Ubahlah perhitungan di bawah ke dalam RPN 12 ⎛ 16 ⎞ * ⎜ 25 − ⎟ 3 ⎝ 4⎠ 40 +2 10 b) Implementasikan perhitungan di atas dengan stack, dan gambarkan kondisi stack tiap tahap Beberapa jenis struktur data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. 2. 3. 4. Connected List Circular List Doubly-linked List Multi list structure 3. Tree Structure 1. Apa ? 2. Bagaimana cara implementasinya ? Implementasi Queue • • • Implementasi queue lebih sulit daripada stack. Pada stack, penambahan dan penghapusan data hanya dilakukan pada satu ujung saja, sehingga cukup mengubah posisi pointer sesuai dengan penambahan/pengurangan data Implementasi queue, harus mengubah posisi DUA buah pointer, yaitu pointer yang menunjuk ke FRONT, dan pointer yagn menunjuk ke REAR Ada dua cara implementasi queue: rear stack front queue Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT rear front Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT • Saat front==rear, berarti queue kosong front==rear Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Masalah yang timbul pada Cara 1 Front dari rear selalu bertambah secara motononik, sehingga memerlukan array dengan ukuran tak terhingga front array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Pointer selalu bergerak ke kanan, tak pernah kembali Menyambungkan FRONT dan REAR dari array itu sehingga membentuk cincin (RING BUFFER) Cara 1 • n-2 n-1 0 1 • • • rear Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 • n-2 n-1 0 1 • • • rear Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 • n-2 n-1 0 1 • • • rear Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 • n-2 n-1 0 1 • • • rear Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 • n-2 n-1 0 1 • • • rear Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 • n-2 n-1 0 1 • • • rear Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 • n-2 n-1 0 1 • • • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear rear front Queue adalah pada bagian yang berwarna hijau Cara 1 • n-2 n-1 0 1 • • • rear Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 • n-2 n-1 0 1 • • • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama Menambahkan data ke queue: nilai rear dinaikkan satu Menghapus data dari queue: nilai front dinaikkan satu Queue kosong pada saat front==rear rear==front Queue adalah pada bagian yang berwarna hijau Masalah pada Ring Buffer • Pada saat rear==front , ada dua interpretasi yang muncul, “queue kosong” ataukah “queue full” n-2 n-1 0 1 n-2 n-1 empty rear==front 0 1 full rear==front Queue adalah pada bagian yang berwarna hijau Masalah pada Ring Buffer • Solusi – Menyiapkan sebuah FLAG untuk memberi tanda kalau queue kosong – Queue dijaga agar tidak pernah full, dengan menyisakan sebuah elemen yang kosong n-2 n-1 0 1 Tugas • Downloadlah program stack.c dan selesaikan fungsi push dan pop ! • Jelaskan operasi yang dilakukan pada tiap baris program stack.c itu Tugas • Downloadlah program simulasi QUEUE: queue.c dan selesaikan fungsi-fungsi sbb. – void enqueue(char *x) – void dequeue() – Void queue_print() • Implementasi memakai RING BUFFER, dengan selalu menyisakan sebuah elemen kosong • Queue size: 5 (fixed) • Input yang dimasukkan berupa character string Contoh hasil eksekusi [1] tambahkan task [2] eksekusi [3] selesai Isi task: baca buku Kondisi QUEUE: [0] baca buku 1 [1] tambahkan task [2] eksekusi [3] selesai 1 Isi task: membuat program Kondisi QUEUE: [0] baca buku [1] membuat program [1] tambahkan task [2] eksekusi [3] selesai Menjalankan task: baca buku Kondisi QUEUE: [1] membuat program 2 Hint • Dalam fungsi enqueue/dequeue, posisi pointer front dan rear harus diupdate sehingga menunjuk ke posisi yang benar – Pengubahan posisi tsb. Memakai fungsi next() – Pada fungsi next(), sisa pembagian dihitung dengan cara membaginya dengan QUEUE_SIZE, sehingga jika nilai itu melebih QUEUE_SIZE, dia akan kembali ke ujung depan queue. – Posisi berikutnya dihitung dengan posisiberikutnya =next(posisi saat ini) Pembahasan STACK.C • Implementasi program STACK memakai array kosong kosong 4 stack_size data stack_pointer (top +1) top 3 2 1 bottom push() void push(int *x,int val) { if(stack_pointer > stack_size-1) { printf(“Stack overflow\n”); //memeriksa apakah overflow atau tidak } else { x[stack_pointer++]=val;//tambahkan data pada stack } stack_pointer } kosong stack_pointer kosong 4 3 2 1 kosong val 4 3 2 1 pop() void pop(int *x) { Pada program ini, penghapusan data tidak perlu dilakukan. Cukup dengan mengubah posisi stack_pointer if(stack_pointer <= 0) { printf("Stack underflow\n"); } else { stack_pointer--; // menurunkan stack pointer } } kosong val 4 3 2 1 stack_pointer kosong val 4 3 2 1 stack_pointer Tugas: QUEUE.C • Downloadlah program simulasi QUEUE: queue.c dan selesaikan fungsi-fungsi sbb. – void enqueue(char *x) – void dequeue() – Void queue_print() • Implementasi memakai RING BUFFER, dengan selalu menyisakan sebuah elemen kosong • Queue size: 5 (fixed) • Input yang dimasukkan berupa character string Contoh hasil eksekusi [1] tambahkan task [2] eksekusi [3] selesai Isi task: baca buku Kondisi QUEUE: [0] baca buku 1 [1] tambahkan task [2] eksekusi [3] selesai 1 Isi task: membuat program Kondisi QUEUE: [0] baca buku [1] membuat program [1] tambahkan task [2] eksekusi [3] selesai Menjalankan task: baca buku Kondisi QUEUE: [1] membuat program 2 Hint • Dalam fungsi enqueue/dequeue, posisi pointer front dan rear harus diupdate sehingga menunjuk ke posisi yang benar – Pengubahan posisi tsb. Memakai fungsi next() – Pada fungsi next(), sisa pembagian dihitung dengan cara membaginya dengan QUEUE_SIZE, sehingga jika nilai itu melebih QUEUE_SIZE, dia akan kembali ke ujung depan queue. – Posisi berikutnya dihitung dengan posisiberikutnya =next(posisi saat ini) queue,front,rear Memakai next untuk maju satu kotak Memakai next untuk maju satu kotak front queue 0 1 rear 2 3 4 5 6 7 データ格納領域 queue[front] Ujung depan queue. Dari sini dapat dihapus (dequeue) queue[rear] Bagian ekor dari queue. Di sinilah data baru dimasukkan Fungsi next akan bergerak maju terus, dan setelah sampai ujung kanan akan berpindah ke kotak 0 enqueue() next Kondisi full rear queue 0 1 2 3 rear front 4 0 1 queue[rear] void enqueue(char *x) { // Periksalah terlebih dahulu, apakah queue itu full atau tidak // Jika tidak full, tambahkan baru ke queue // Selesaikan fungsi ini if (next(rear) == front) error("Queue sudah penuh\n"); else { sprintf(queue[rear],x); rear=next(rear); } } 2 3 4 dequeue() // DEQUEUE sebuah task dari queue, dan menjalankannya void dequeue() { char *x; // Periksalah apakah queue itu kosong atau tidak // Jika tidak kosong, DEQUEUE-lah sebuah elemen // dari queue, dan tampilkan pada layar baris sbb. // "Menjalankan task: (isi task)" // Selesaikan fungsi ini if (empty()) queue error("Queue kosong\n"); else { x=queue[front]; front=next(front); printf("\tMenjalankan task: %s\n",x); } } next front 0 1 2 3 4 queue[front] queue_print() front queue // Menampilkan isi QUEUE void queue_print() { 0 rear 1 2 4 Pada queue[i] i digerakkan dari front sampai ke rear // Selesaikan fungsi ini int i; printf("Kondisi QUEUE:\n"); for(i=front;i != rear; i=next(i)) printf("\t[%d] %s ", i, queue[i]); printf("\n"); } 3 Linked List Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html Beberapa jenis struktur data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. 2. 3. 4. Linked List Circular List Doubly-linked List Multi list structure 3. Tree Structure 1. Apa ? 2. Bagaimana cara implementasinya ? Apakah Linked List itu ? • Elemen (disebut dengan CELL, atau SEL dalam bahasa Indonesia) yang mungkin terletak terpisah-pisah di memory, disambungkan dengan pointer. • Tiap sel berisi dua informasi : nilai dan pointer ke sel berikutnya nilai nilai Pointer to next CELL nilai Pointer to next CELL CELL Pointer to next CELL Mengapa memakai Linked List ? 1. 2. 3. 4. Mudah untuk menambahkan dan menghapus elemen (pada array tidak mungkin menambahkan elemen, karena banyaknya elemen sudah ditentukan dari awal) Panjang list bisa diubah dengan bebas (panjang array fixed) Mudah untuk menyambungkan beberapa list, maupun memutuskannya (array tidak bisa) Memungkinkan user mendesain struktur data yang kompleks Array vs Linked List Array Linked List Penambahan dan Tidak mungkin Mungkin penghapusan elemen Panjang list Fixed Bisa diubah Akses ke elemen O(1) O(n) Random access Sequential access (harus mengikuti pointer satu demi satu) lambat cepat Array vs Linked List header 1 a[0] 2 a[1] 3 a[2] 13 address 13 1 18 value int a[3]; int n; Array Address tiap sel berurutan address 18 2 24 address 24 3 value next value next Pointer ke sel berikutnya (next) (NULL) struct CELL { struct CELL *next; int value; } ∗header; Linked List Address tidak berurutan Akses ke tiap sel dimulai dari header NULL POINTER • Nilai yang dimiliki sebuah pointer adalah address pada memory dimana data tersimpan • Pointer yang tidak menunjuk ke address manapun disebut dengan NULL pointer. Maksudnya, satu kondisi khusus dimana pointer itu belum diset dengan sebuah address tertentu • Pada stdio.h biasanya didefinisikan dengan nilai 0 • Saat fungsi fopen,malloc dieksekusi, jika terdapat error, maka nilai yang dikembalikan adalah NULL Pada kuliah ini, NULL disimbolkan dengan kotak yang diberi garis diagonal AKSES SEKUENSIAL z z Sel berisi (value + pointer ke sel berikutnya) Akses hanya bisa dilakukan searah saja, dari ujung depan ke arah belakang. Akses berlawanan arah tidak dapat dilakukan. Cara menampilkan isi seluruh list : struct CELL *p; for(p=header;p!=NULL;p=p->next) printf(“%d\n”,p->value); header 12 pointer 25 12 1 25 value pointer 2 37 37 value pointer 3 結果: 1 2 3 value pointer Pointer p digerakkan ke kanan dengan cara p=p->next Cara menampilkan isi sel tertentu • Pada array (misalnya nama array: a), isi sel tertentu dapat ditampilkan dengan cara a[nomer urut sel keberapa]. Misalnya a[5] akan menampilkan isi sel ke-6. Hal ini karena satu sel dengan sel yang lain terletak pada posisi yang berurutan di memory. • Pada linked list, kita tidak tahu secara langsung, sel itu terletak dimana dalam memory. Akses harus dilakukan satu persatu, urut mulai dari sel terdepan Cara menampilkan isi sel tertentu Tampilkan isi (value) sel ke-3 ! address header 37 37 4 38 38 2 40 40 13 Sel ke-1 pointer Sel ke-1→ isi: value=4 address sel berikutnya=38 52 52 40 NULL Cara menampilkan isi sel tertentu Tampilkan isi (value) sel ke-3 ! address header 37 37 4 38 Sel ke-1 38 2 40 40 13 Sel ke-2 pointer Sel ke-2→ isi: value=2 address sel berikutnya=40 52 52 40 NULL Cara menampilkan isi sel tertentu Tampilkan isi (value) sel ke-3 ! address header 37 37 4 38 Sel ke-1 38 2 40 Sel ke-2 40 13 52 52 40 NULL Sel ke-3 pointer Sel ke-3→ isi: value=13 address sel berikutnya=52 Sampai di sini sudah bisa menampilkan isi sel ke-3 Operasi pada Linked List 1. 2. 3. Menambahkan data pada linked list 1. Menambahkan sel baru yang terletak setelah sebuah sel tertentu 2. Menambahkan sel baru pada posisi terdepan sebuah linked list Menghapus data pada linked list 1. Menghapus sebuah sel yang terletak setelah sebuah sel tertentu 2. Menghapus sel pada posisi terdepan sebuah linked list Syarat-syarat pada perbatasan Menambahkan sel baru 1. 2. 3. Membuat sel yang akan ditambahkan (memakai malloc) Mengeset “value” pada sel itu Mengeset pointer “next” yang menunjukkan koneksi antara satu sel dengan yang lain Catatan penting: Pada linked list, penambahan sebuah sel baru hanya bisa dilakukan pada posisi sesudah sel tertentu, tetapi tidak dapat ditambahkan pada posisi sebelum sel tsb. Contoh penambahan sel baru Here! header 37 4 37 38 2 next 38 sel ke-1 40 13 next 40 sel ke-2 52 40 next 52 sel ke-3 next sel ke-4 3 Ingin menambahkan sel 37 37 4 38 sel ke-1 sesudah sel ke-3(value=13) 100 38 2 40 sel ke-2 40 13 3 3 sel ke-3 100 52 52 40 sel ke-4 Koneksi pada pointer next disesuaikan Menambahkan sel baru setelah sel yang ditunjuk oleh pointer x (1)Sediakan pointer p yang menunjuk ke sebuah sel struct CELL *p; (2)Buatlah sebuah sel baru dengan malloc() (alokasi memory) yang dimulai dengan address yang ditunjukkan oleh pointer p (3)Set-lah value pada sel p Masukkan sel p p (4)Modifikasi pointer p->next = x->next; 18 next Alokasi memory x->next = p; 9 dengan malloc x 20 5 next 24 24 13 28 28 2 73 Menambahkan sel baru setelah sel yang ditunjuk oleh pointer x (1)Sediakan pointer p yang menunjuk ke sebuah sel struct CELL *p; (2)Buatlah sebuah sel baru dengan malloc() (alokasi memory) yang dimulai dengan address yang ditunjukkan oleh pointer p (3)Set-lah value pada sel p Masukkan p (4)Modifikasi pointer p->next = x->next; 18 next x->next = p; 9 24 sel p x 20 5 next 18 24 13 28 28 2 73 Operasi pada Linked List 1. 2. 3. Menambahkan data pada linked list 1. Menambahkan sel baru yang terletak setelah sebuah sel tertentu 2. Menambahkan sel baru pada posisi terdepan sebuah linked list Menghapus data pada linked list 1. Menghapus sebuah sel yang terletak setelah sebuah sel tertentu 2. Menghapus sel pada posisi terdepan sebuah linked list Syarat-syarat pada perbatasan Menambahkan sel baru pada posisi terdepan sebuah linked list • Cara menambahkan sel baru pada posisi terdepan sebuah linked list berbeda dengan cara menambahkan sel ke tengah list tsb. • Memakai pointer header yang menunjukkan posisi terdepan sebuah linked-list Menambahkan sel baru pada posisi terdepan sebuah linked list (1)Sediakan pointer p yang menunjuk ke sebuah sel struct CELL *p; (2)Buatlah sebuah sel baru dengan malloc() (alokasi memory) yang dimulai dengan address yang ditunjukkan oleh pointer p (3)Set-lah value pada sel p (4)Substitusikan address pada header ke bagian next pada p p->next = header; (5) Updatelah nilai header dengan address p p header = p; 18 next Alokasi memory dengan malloc 9 header 24 24 13 next 28 28 2 73 Menambahkan sel baru pada posisi terdepan sebuah linked list (1)Sediakan pointer p yang menunjuk ke sebuah sel struct CELL *p; (2)Buatlah sebuah sel baru dengan malloc() (alokasi memory) yang dimulai dengan address yang ditunjukkan oleh pointer p (3)Set-lah value pada sel p (4)Substitusikan address pada header ke bagian next pada p p->next = header; (5) Updatelah nilai header dengan address p p header = p; 18 9 header 18 24 13 next 24 next 28 28 2 73 Menambahkan sel baru pada posisi terdepan sebuah linked list • Cara lain menambahkan sel baru pada posisi terdepan sebuah list • Header bukan pointer melainkan sel ke-0 • Memakai cara yang sama dengan list (1)(menambahkan elemen pada tengah-tengah sebuah list) Menambahkan sel baru pada posisi terdepan sebuah linked list (2) (1) Header tidak didefinisikan sebagai sebuah pointer, melainkan sebuah sel struct CELL header; (2)Tempatkan next pada header agar menunjuk ke posisi terdepan pada list,dan header dianggap sebagai sel ke-0 (3)Masukkan elemen p pada posisi sesudah elemen ke-0 (4)Selanjutnya sama dengan proses penambahan sel baru pada penjelasan sebelumnya (modifikasi next) p 18 9 x 24 28 header - 24 sel ke-0 13 28 sel terdepan 2 73 Menambahkan sel baru pada posisi terdepan sebuah linked list (2) (1) Header tidak didefinisikan sebagai sebuah pointer, melainkan sebuah sel struct CELL header; (2)Tempatkan next pada header agar menunjuk ke posisi terdepan pada list,dan header dianggap sebagai sel ke-0 (3)Masukkan elemen p pada posisi sesudah elemen ke-0 (4)Selanjutnya sama dengan proses penambahan sel baru pada penjelasan sebelumnya (modifikasi next) p 18 9 24 x 24 - 18 sel ke-0 13 28 28 2 73 Operasi pada Linked List 1. 2. 3. Menambahkan data pada linked list 1. Menambahkan sel baru yang terletak setelah sebuah sel tertentu 2. Menambahkan sel baru pada posisi terdepan sebuah linked list Menghapus data pada linked list 1. Menghapus sebuah sel yang terletak setelah sebuah sel tertentu 2. Menghapus sel pada posisi terdepan sebuah linked list Syarat-syarat pada perbatasan Menghapus sebuah sel 1. 2. 3. 4. Periksa pointer NULL Mengubah pointer next (skip 1 sel) Mengeluarkan isi sel yang dihapus (optional) Bebaskan memory yang dialokasikan memakai fungsi free() Catatan penting Pada linked list, kita bisa menghapus sebuah sel yang terletak pada posisi sesudah sel tertentu. Tetapi kita tidak dapat menghapus sebuah sel yang ditunjuk oleh pointer itu sendiri ! Contoh penghapusan sebuah sel 37 37 4 38 38 2 40 40 13 40 40 13 3 3 100 52 52 40 52 52 40 ingin dihapus skip 37 37 4 40 38 2 hapus dengan fungsi free() 3 3 100 Cara menghapus sel sesudah sel x 指定セル直後のセルを削除 (1)siapkan pointer yang akan menunjuk ke sel yang akan dihapus struct CELL *p; (2)Periksalah apakah sel yang dihapus itu NULL atau tidak if(x->next == NULL) fatal_error(”sel tidak dapat dihapus karena tidak ada sel lagi sesudahnya”); (3)Set-lah agar pointer p menunjuk ke sel yang ingin dihapus p = x->next; (4)Sesuaikan next dari sel sel x (skip p) x->next = p->next; (5)Print-lah isi sel yang ditunjuk oleh pointer p (6)Bebaskan memory yang ditunjuk oleh pointer p x free(p); 31 18 18 23 20削除 23 27 ingin dihapus 18 Cara menghapus sel sesudah sel x 指定セル直後のセルを削除 (1)siapkan pointer yang akan menunjuk ke sel yang akan dihapus struct CELL *p; (2)Periksalah apakah sel yang dihapus itu NULL atau tidak if(x->next == NULL) fatal_error(”sel tidak dapat dihapus karena tidak ada sel lagi sesudahnya”); (3)Set-lah agar pointer p menunjuk ke sel yang ingin dihapus p = x->next; (4)Sesuaikan next dari sel sel x (skip p) x->next = p->next; (5)Print-lah isi sel yang ditunjuk oleh pointer p skip (6)Bebaskan memory yang ditunjuk oleh pointer p x p free(p); 31 23 18 23 20 削除 23 27 18 Cara menghapus sel sesudah sel x 指定セル直後のセルを削除 (1)siapkan pointer yang akan menunjuk ke sel yang akan dihapus struct CELL *p; (2)Periksalah apakah sel yang dihapus itu NULL atau tidak if(x->next == NULL) fatal_error(”sel tidak dapat dihapus karena tidak ada sel lagi sesudahnya”); (3)Set-lah agar pointer p menunjuk ke sel yang ingin dihapus p = x->next; (4)Sesuaikan next dari sel sel x (skip p) x->next = p->next; (5)Print-lah isi sel yang ditunjuk oleh pointer p (6)Bebaskan memory yang ditunjuk oleh pointer p x free(p); 23 31 23 27 dihapus dengan free() 18 Operasi pada Linked List 1. 2. 3. Menambahkan data pada linked list 1. Menambahkan sel baru yang terletak setelah sebuah sel tertentu 2. Menambahkan sel baru pada posisi terdepan sebuah linked list Menghapus data pada linked list 1. Menghapus sebuah sel yang terletak setelah sebuah sel tertentu 2. Menghapus sel pada posisi terdepan sebuah linked list Syarat-syarat pada perbatasan Menghapus sel pada posisi terdepan sebuah linked list • • Memakai cara yang lain dengan cara menghapus sel di tengah-tengah sebuah linked list Memanfaatkan pointer header Menghapus sel pada posisi terdepan sebuah linked list (1)Siapkan pointer p struct CELL *header, *p; (2)Periksa apakah header NULL atau tidak if(header == NULL) fatal_error(”List kosong, sehingga penghapusan sel tidak dapat dilakukan”); (3)Set-lah address elemen terdepan ke p p = header; (4)Update-lah pointer header header = p->next; (5)Tampilkan isi sel yang ditunjuk oleh p (optional) (6) Bebaskan memory yang ditunjuk oleh pointer p header 18 18 20 23 23 p Ingin dihapus 27 18 Menghapus sel pada posisi terdepan sebuah linked list (1)Siapkan pointer p struct CELL *header, *p; (2)Periksa apakah header NULL atau tidak if(header == NULL) fatal_error(”List kosong, sehingga penghapusan sel tidak dapat dilakukan”); (3)Set-lah address elemen terdepan ke p p = header; (4)Update-lah pointer header header = p->next; (5)Tampilkan isi sel yang ditunjuk oleh p (optional) (6) Bebaskan memory yang ditunjuk oleh pointer p header 18 23 23 27 dihapus dengan fungsi free() 18 Menghapus sel pada posisi terdepan sebuah linked list • Memakai cara sama seperti saat menghapus sel pada tengah-tengah sebuah list • Header bukan pointer, melainkan sel ke-0 Menghapus sel pada posisi terdepan sebuah linked list (2) (1)Header dideklarasikan sebagai sebuah sel. p dideklarasikan sebagai pointer yang menunjuk ke sel yang ingin dihapus struct CELL header, *p; (2)Substitusikan address header ke pointer x x=&header (3)Selanjutnya pergunakan cara yang sama dengan cara menghapus sel yang berada di tengah-tengah sebuah list. Yaitu menghapus sel yang terletak sesudah sel yang ditunjuk oleh pointer x. 17 18 header sel ke-0 18 20 23 sel ke-1 23 27 18 sel ke-2 sel yang ingin dihapus Menghapus sel pada posisi terdepan sebuah linked list (2) (1)Header dideklarasikan sebagai sebuah sel. p dideklarasikan sebagai pointer yang menunjuk ke sel yang ingin dihapus struct CELL header, *p; (2)Substitusikan address header ke pointer x x=&header (3)Selanjutnya pergunakan cara yang sama dengan cara menghapus sel yang berada di tengah-tengah sebuah list. Yaitu menghapus sel yang terletak sesudah sel yang ditunjuk oleh pointer x. x=17 - 18 header(x) Sel ke-0 p=18 20 23 23 27 18 p sel yang ingin dihapus Menghapus sel pada posisi terdepan sebuah linked list (2) (1)Header dideklarasikan sebagai sebuah sel. p dideklarasikan sebagai pointer yang menunjuk ke sel yang ingin dihapus struct CELL header, *p; (2)Substitusikan address header ke pointer x x=&header (3)Selanjutnya pergunakan cara yang sama dengan cara menghapus sel yang berada di tengah-tengah sebuah list. Yaitu menghapus sel yang terletak sesudah sel yang ditunjuk oleh pointer x. skip p=18 header Sel ke-0 23 20 23 23 27 18 p dihapus dengan fungsi free Rangkuman • • • • Linked list terdiri dari komponen-komponen berikut – value – pointer ke sel berikutnya Data yang tersimpan (value) pada linked-list diakses dengan cara sekuensial. Untuk melihat value dari suatu sel yang berada di tengah list, kita harus mengikuti alur list, mulai dari sel pertama dan seterusnya sampai bertemu dengan sel yang value-nya ingin ditampilkan. Penambahan sel, penghapusan sel dapat dilakukan dengan cara mengubah pointer Ada dua cara operasi penambahan dan penghapusan sel yang terdepan. Yang lebih mudah adalah dengan memakai header bukan sebagai pointer, melainkan sebagai sel ke-0 value next value next value next value next Latihan (1) Pada saat header = 35, gambarkan linked list yang dibuat dari sel-sel dibawah. address value *next 13 24 18 21 18 21 13 23 26 26 100 35 NULL 20 18 (2) Gambarkan kondisi linked-list saat sel dengan value 24 dihapus (3) Gambarkan kondisi linked-list saat sel berikut ditambahkan Sesudah sel dengan value 23 42 45 Operasi pada Linked List 1. 2. 3. Menambahkan data pada linked list 1. Menambahkan sel baru yang terletak setelah sebuah sel tertentu 2. Menambahkan sel baru pada posisi terdepan sebuah linked list Menghapus data pada linked list 1. Menghapus sebuah sel yang terletak setelah sebuah sel tertentu 2. Menghapus sel pada posisi terdepan sebuah linked list Syarat-syarat pada perbatasan Syarat-syarat pada perbatasan • Hal-hal yang harus diperhatikan – Bagaimana menghandle sel terdepan dan terbelakang – Proses saat list kosong • Program linkedlist.c (Angka diurutkan, nilainya semakin tinggi) – Sel yang jadi pusat operasi (pointer p) – Pointer yang menunjuk ke address sel sebelumnya (pointer q) 5 7 7 q(=5) p(=7) Contoh program Linked List • Downloadlah program linkedlist.c yang disediakan di situs kuliah http://asnugroho.net/lecture/ds.html • Pelajari isinya dan selesaikan fungsi cell_delete Fungsi insert struct CELL { struct CELL *next; int value; }; typedef struct CELL cell; cell header; cell_insert(int a) { cell *p, *q, *new_cell; /* mencari posisi dimana sel harus dimasukkan */ p = header.next; q = &header; while (p != NULL && a > p-> value) { q = p; p = p->next; } Akses ke tiap sel satu persatu header 20 38 - 38 q 2 40 40 p p=header.next = 38 q=&header = 20 while (p != NULL) { q = p; p = p->next; } 5 52 52 7 70 70 12 Akses ke tiap sel satu persatu header 20 - 38 38 2 q 40 40 5 p while (p != NULL ) { q = p; q = 38 p = p->next; p = 40 } 52 52 7 70 70 12 Akses ke tiap sel satu persatu header 20 - 38 38 2 40 40 5 q while (p != NULL) { q = p; q = 40 p = p->next; p = 52 } 52 52 7 p 70 70 12 Akses ke tiap sel satu persatu header 20 - 38 38 2 40 40 5 52 52 7 70 q while (p != NULL) { q = p; q = 52 p = p->next; p = 70 } 70 12 p Akses ke tiap sel satu persatu header 20 - 38 38 2 40 40 5 52 52 7 70 70 12 q while (p != NULL) { q = p; q = 70 p = p->next; p = NULL } p Ingin memasukkan 4(a=4) header 20 38 - 38 q 2 40 40 5 52 52 p p=header.next = 38 q=&header = 20 p->value=2 while ((p != NULL ) && (p-> value < a)) { q = p; p = p->next; } 7 70 70 12 Ingin memasukkan 4(a=4) header 20 - 38 38 2 40 40 q 5 52 52 p p=header.next = 38 q=&header = 20 while ((p != NULL ) && (p-> value < a)) { q = p; q = 38 p = p->next; p = 40 } 7 70 70 12 Ingin memasukkan 4(a=4) header 20 - 38 38 2 40 q p=40 q=38 40 5 52 52 7 70 70 12 p p->value=5 while ((p != NULL ) && (p-> value < a)) { q = p; Keluar dari loop p = p->next; Masukkan 4 sebelum p(value 5) } /* Masukkan sel baru */ Ingin memasukkan 4(a=4) header 20 - 38 38 2 40 40 q 5 p 52 52 7 35 4 70 70 12 new_cell /* Menambahkan sel baru */ If ((new_cell=(cell*)malloc(sizeof(cell)))==NULL) fatal_error(”memory tidak cukup”); new_cell->next=p; ←di sini new_cell->next diisi dengan 40 q->next=new_cell; ←di sini q->next diisi dengan 35 new_cell->value=a; } Memasukkan new_cell (value 4) sebelum p(value 5) = memasukkan sel baru sesudah q. Untuk itulah dalam proses ini diperlukan 2 pointer p dan q ! Ingin memasukkan 4(a=4) header 20 - 38 38 2 40 35 5 52 52 7 35 4 70 70 40 12 new_cell /* Menambahkan sel baru */ If ((new_cell=(cell*)malloc(sizeof(cell)))==NULL) fatal_error(”memory tidak cukup”); new_cell->next=p; ←di sini new_cell->next diisi dengan 40 q->next=new_cell; ←di sini q->next diisi dengan 35 new_cell->value=a; } Memasukkan new_cell (value 4) sebelum p(value 5) = memasukkan sel baru sesudah q. Untuk itulah dalam proses ini diperlukan 2 pointer p dan q ! Latihan • Selesaikan fungsi cell_delete pada program linkedlist.c, untuk menghapus data yang telah ditambahkan pada sebuah list • Jelaskan secara singkat program yang dibuat (komentar) Hint Untuk menyelesaikan cell_delete buatlah program dengan urutan sbb. ① ② ③ ④ Periksalah, apakah list itu kosong atau tidak. Jika tidak kosong, lanjutkan ke step ②. Jika list itu kosong, tampilkan error message, dan kembalilah ke fungsi main Akseslah sel pada list itu satu persatu dengan pointer p dan q untuk mencari data yang akan dihapus (yaitu a ) Jika sampai akhir ternyata sel yang dihapus tidak ditemukan, tampilkan “Sel yang dihapus tidak ditemukan”, dan kembali ke fungsi main Jika sel yang ingin dihapus ditemukan, hapuslah sel itu dan kembali ke fungsi main void cell_delete(int a) { cell *p, *q; p=header.next; } q=&header; ① Periksalah, apakah list itu kosong atau tidak. Jika tidak kosong, lanjutkan ke step ②. Jika list itu kosong, tampilkan error message, dan kembalilah ke fungsi main ② Akseslah sel pada list itu satu persatu dengan pointer p dan q untuk mencari data yang akan dihapus (yaitu a) ③ Jika sampai akhir ternyata sel yang dihapus tidak ditemukan, tampilkan “Sel yang dihapus tidak ditemukan”, dan kembali ke fungsi main ④ Jika sel yang ingin dihapus ditemukan, hapuslah sel itu dan kembali ke fungsi main PR • Rancanglah bagaimana membuat program stack, tetapi tidak memakai array, melainkan memakai linked-list(Dengan kata lain: Selesaikan fungsi push, pop dan stack_print pada linkedliststack.c) • Hint: Penambahan dan penghapusan elemen pada stack harus bisa dijalankan pada O(1). Karena itu penambahan dan penghapusan data harus dilakukan pada sel yang terdepan Beberapa Beberapa Jenis Jenis Struktur Struktur Data Data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. Linked List 2. Circular List 3. Bidirectional List 4. Multi list structure 3. Tree Structure Beberapa Beberapa Jenis Jenis Struktur Struktur Data Data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. Linked List 2. Circular List 3. Bidirectional List 4. Multi list structure 3. Tree Structure Circular Circular List List Apakah Apakah Circular Circular List List itu itu ?? • Semua sel dalam list disambungkan dengan pointer, dan sel yang terakhir disambungkan dengan sel pertama • Struktur data berbentuk cincin • Tidak ada sel pertama maupun sel terakhir dalam list, karena setiap sel disambungkan oleh pointer sehingga berbentuk cincin. Linked Linked List List vs vs Circular Circular List List Variabel ptr Linked list 13 13 1 18 18 2 24 24 3 NULL Variabel ptr Circular list 13 13 1 18 18 2 24 24 3 13 Kembali ke sel terdepan Cara Cara akses akses tiap tiap sel sel pada pada Circular Circular List List struct CELL *ptr, *p; if(ptr != NULL) { p = ptr; do { printf(“%d\n”,p->value) /* tampilkan value pada sel yang ditunjuk oleh p */ p = p->next; } while (p != ptr); // Setelah semua bagian dalam loop dieksekusi, // evaluasilah apakah p!= ptr } Variabel ptr 13 13 1 18 18 2 24 24 3 13 Hasil: 1 2 3 Cara Cara ini ini tidak tidak benar benar !! struct CELL *ptr, *p; if(ptr != NULL) { p = ptr; while (p != ptr) { printf(“%d\n”,p->value) p = p->next; } } Cara ini tidak benar. Bagian dalam loop tidak akan dijalankan karena sebelum masuk loop syarat p!=ptr tidak akan pernah terpenuhi Circular Circular List List memakai memakai head head struct CELL *ptr, *p; if(ptr != NULL) { Saat ptr==NULL p = ptr; berarti list kosong do { printf(“%d\n”,p->value p = p->next; } while (p != ptr); } Saat p==ptr Berarti sudah sampai di akhir list Dua syarat ini mungkinkah disatukan ? memakai head Circular Circular List List memakai memakai head head Variabel ptr 13 13 1 18 Variabel head 13 33 1 18 - 13 18 2 24 18 2 24 24 3 13 24 3 33 Circular Circular List List memakai memakai head head struct CELL head; head 33 - 13 13 1 18 18 2 24 24 3 33 Circular List dengan 3 sel head 33 - 33 Circular List dalam kondisi kosong head.next== & head (pointer next dari head menunjuk ke head itu sendiri) Catatan: bandingkan Circular List di atas dengan linked list berikut head 13 18 24 33 1 18 2 24 3 - 13 Circular Circular List List memakai memakai head head struct CELL head, *p; for(p = head.next; p!= &head; p = p->next) // head tidak di-lompati (skip) { perlu ditambahkan bagian untuk melewati “head” agar sel tsb. tidak diproses } (1) head 33 - 13 13 1 18 18 2 24 (2) 24 3 33 (3) Beberapa Beberapa Jenis Jenis Struktur Struktur Data Data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. Linked List 2. Circular List 3. Bidirectional List 4. Multi list structure 3. Tree Structure Bidirectional Bidirectional List List Apakah Apakah bidirectional bidirectional list list itu itu ?? • • Semua sel yang terdapat pada list disambungkan dengan pointer, sedangkan tiap sel memiliki TIGA komponen : value, pointer ke sel sebelumnya dan pointer ke sel berikutnya Dengan memiliki dua buah pointer ini, maka bidirectional list dapat diakses dengan DUA arah : ke arah depan dan ke belakang prev value next value next prev value next value next Linked List Bidirectional List Bidirectional Bidirectional List List 33 24 - 13 13 33 1 18 18 struct CELL { struct CELL *prev; struct CELL *next; MYDATA value; }; 13 2 24 24 18 3 33 address prev value next Misalnya int, char, float, long, double, dsb Kelebihan Kelebihan dan dan kelemahan kelemahan Kelebihan 1. List bisa diakses dengan dua arah : ke depan maupun ke belakang 2. Penambahan dan penghapusan data menjadi mudah, karena pada tipe ini kita dapat menambahkan sel baru sesudah maupun sebelum sebuah sel. Demikian juga dalam hal menghapus sel. Kelemahan 1. Sebuah data memiliki dua buah pointer, sehingga memerlukan space yang lebih besar Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 p 1 18 13 2 24 57 10 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 18 13 2 24 (1) p 57 10 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 18 13 2 24 (1) p 13 57 10 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 18 13 2 24 (2) p 13 57 10 18 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 18 57 2 24 (3) p 13 57 10 18 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 57 57 2 24 (4) p 13 57 10 18 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menghapus menghapus sebuah sebuah sel sel Hapuslah sel yang ditunjuk pointer p p 13 33 1 18 18 13 2 24 24 p->prev->next=p->next; p->next->prev=p->prev; free(p); 18 (1) (2) Yang diubah bukan hanya pointer next tetapi juga pointer prev 3 33 Cara Cara menghapus menghapus sebuah sebuah sel sel Hapuslah sel yang ditunjuk pointer p p 13 33 1 18 24 13 2 24 24 18 (1) skip p->prev->next=p->next; p->next->prev=p->prev; free(p); (1) (2) Yang diubah bukan hanya pointer next tetapi juga pointer prev 3 33 Cara Cara menghapus menghapus sebuah sebuah sel sel Hapuslah sel yang ditunjuk pointer p p 13 33 1 18 24 13 2 24 24 (2) p->prev->next=p->next; p->next->prev=p->prev; free(p); 13 (1) (2) Yang diubah bukan hanya pointer next tetapi juga pointer prev 3 33 Latihan Latihan Bidirectional Bidirectional List List 1. Gambarkan bidirectional list berikut 3 head 10 3 20 28 38 - 10 38 28 70 28 3 10 30 38 2. Tambahkan sel berikut setelah sel yang berisi value “20” 128 27 3. Gambarkan kondisi bidirectional list, setelah sel yang berisi value “70” dihapus. Kerjakan soal ini terhadap list yang diperoleh dari no.2 di atas. Doubly Doubly Linked Linked List List Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html Beberapa Beberapa Jenis Jenis Struktur Struktur Data Data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. Linked List 2. Circular List 3. Doubly Linked List 4. Multi list structure 3. Tree Structure Outline Outline • Review doubly-linked list • Latihan Apakah Apakah doubly-linked doubly-linked list list itu itu ?? • • Semua sel yang terdapat pada list disambungkan dengan pointer, sedangkan tiap sel memiliki TIGA komponen : value, pointer ke sel sebelumnya dan pointer ke sel berikutnya Dengan memiliki dua buah pointer ini, maka doubly-linked list dapat diakses dengan DUA arah : ke arah depan dan ke belakang prev value next value next prev value next value next Linked List Bidirectional List Doubly-linked Doubly-linked List List 33 24 - 13 13 33 1 18 18 struct CELL { struct CELL *prev; struct CELL *next; MYDATA value; }; 13 2 24 24 18 3 33 address prev value next Misalnya int, char, float, long, double, dsb Kelebihan Kelebihan dan dan kelemahan kelemahan Kelebihan 1. List bisa diakses dengan dua arah : ke depan maupun ke belakang 2. Penambahan dan penghapusan data menjadi mudah, karena pada tipe ini kita dapat menambahkan sel baru sesudah maupun sebelum sebuah sel. Demikian juga dalam hal menghapus sel. Kelemahan 1. Sebuah data memiliki dua buah pointer, sehingga memerlukan space yang lebih besar Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 p 1 18 13 2 24 57 10 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 18 13 2 24 (1) p 57 10 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 18 13 2 24 (1) p 13 57 10 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 18 13 2 24 (2) p 13 57 10 18 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 18 57 2 24 (3) p 13 57 10 18 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menambahkan menambahkan sel sel baru baru Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel yang ditunjuk oleh pointer p 13 18 33 1 57 57 2 24 (4) p 13 57 10 18 x x−>prev=p; x−>next=p−>next; p−>next−>prev=x; p−>next=x; (1) (2) (3) (4) Yang diubah bukan hanya pointer next tetapi juga pointer prev Cara Cara menghapus menghapus sebuah sebuah sel sel Hapuslah sel yang ditunjuk pointer p p 13 33 1 18 18 13 2 24 24 p->prev->next=p->next; p->next->prev=p->prev; free(p); 18 (1) (2) Yang diubah bukan hanya pointer next tetapi juga pointer prev 3 33 Cara Cara menghapus menghapus sebuah sebuah sel sel Hapuslah sel yang ditunjuk pointer p p 13 33 1 18 24 13 2 24 24 18 (1) skip p->prev->next=p->next; p->next->prev=p->prev; free(p); (1) (2) Yang diubah bukan hanya pointer next tetapi juga pointer prev 3 33 Cara Cara menghapus menghapus sebuah sebuah sel sel Hapuslah sel yang ditunjuk pointer p p 13 33 1 18 24 13 2 24 24 (2) p->prev->next=p->next; p->next->prev=p->prev; free(p); 13 (1) (2) Yang diubah bukan hanya pointer next tetapi juga pointer prev 3 33 Latihan Latihan pemrograman pemrograman 1. Downloadlah doublyll.c dari http://asnugroho.net/lecture/ds.html 2. Selesaikan fungsi cell_insert() 3. Fungsi cell_insert() adalah menambahkan databaru pada sebuah doubly linked list, dimana data harus dalam kondisi terurutkan. Dimulai dari data dengan nilai kecil, dan semakin ke belakang semakin besar. Doubly-linked Doubly-linked List List 33 24 - 13 13 33 10 18 18 struct CELL { struct CELL *prev; struct CELL *next; int value; }; 13 20 24 address prev value next Doubly-linked Doubly-linked List List 33 24 - 13 13 33 10 18 18 13 20 24 new_cell 25 15 Sel ini akan ditambahkan ke list Doubly-linked Doubly-linked List List 33 24 - 13 13 new_cell 33 10 18 18 13 20 24 p=13 p->value=10 → 10 < 15 →pindah ke sel berikutnya 25 15 Doubly-linked Doubly-linked List List 33 24 - 13 13 33 10 18 18 13 20 24 p=18 p->value=20 → 20 > 15 new_cell 25 15 pindah ke sel sebelumnya Doubly-linked Doubly-linked List List 33 24 - 13 13 33 10 18 18 13 20 24 p=13 tambahkan sel baru sesudah sel yang ditunjuk new_cell 25 15 Doubly-linked Doubly-linked List List 33 24 - 13 13 33 new_cell 13 10 18 25 25 15 18 25 20 24 Doubly-linked Doubly-linked List List void cell_insert(int a) { cell *p, *new_cell; ① ①Mencari Mencariposisi posisidimana dimananew_cell new_cellharus harusdimasukan dimasukan ② ②Alokasi Alokasimemory memoryuntuk untuknew_cell new_cellmemakai memakaimalloc malloc ③ ③Tambahkan Tambahkannew_cell new_cellpada padaposisi posisiyang yangditentukan ditentukan } Latihan Latihan pemrograman pemrograman 1. Gambarkan bidirectional list berikut 3 head 10 3 20 28 38 - 10 38 28 70 28 3 10 30 38 2. Tambahkan sel berikut setelah sel yang berisi value “20” 128 27 3. Gambarkan kondisi bidirectional list, setelah sel yang berisi value “70” dihapus. Kerjakan soal ini terhadap list yang diperoleh dari no.2 di atas. Tree Tree Structure Structure Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html Beberapa Beberapa Jenis Jenis Struktur Struktur Data Data 1. Array 1. Linear List 2. Stack 3. Queue 2. List 1. Linked List 2. Circular List 3. Doubly Linked List 4. Multi list structure 3. Tree Structure Outline Outline 1. 2. 3. 4. Apakah Tree Structure itu ? Binary Tree & implementasinya Tree Traversal Implementasi tree (selain binary tree) Apakah Apakah Tree Tree Structure Structure itu itu ?? • Struktur data yang menunjukkan hubungan bertingkat (memiliki hierarkhi) • Contoh: direktori/folder pada windows atau linux My Document My Pictures My Music Struktur data Pointer & Structure Linked list Tree Nama Nama komponen komponen pada pada Tree Tree node 1 node leaf 4 2 3 6 5 8 leaf root 9 leaf 7 leaf leaf 10 node Hubungan Hubungan antar antar komponen komponen • • • • Hubungan antar elemen: parentchild, father-son, motherdaughter Nama node: nama(angka) yang dipakai untuk membedakan sebuah node dengan node yang lain. Dalam kuliah ini adalah 4 angka yang tertulis dalam leaf lingkaran. Label: nilai yang diingat oleh sebuah node Tree vs Graph – Tree: setiap node kecuali root hanya memiliki sebuah parent – Graph: dapat memiliki lebih dari sebuah parent node 1 root node 2 3 6 5 8 leaf 9 leaf 7 leaf leaf 10 Contoh graph node Hubungan Hubungan antar antar komponen komponen • • • sibling:node-node yang memiliki parent yang sama Ancestor dari node x: node yang ditemukan, ketika menyusuri tree ke atas dari node x Descendant dari node x: node yang ditemukan ketika menyusuri tree ke bawah dari node x node 1 node leaf 4 2 3 6 5 8 leaf root 9 leaf 7 leaf leaf 10 node Hubungan Hubungan antar antar komponen komponen • • • sibling:node-node yang memiliki parent yang sama Ancestor dari node x: node yang ditemukan, ketika menyusuri tree ke atas dari node x Descendant dari node x: node yang ditemukan ketika menyusuri tree ke bawah dari node x node 1 node leaf 4 2 3 6 5 8 leaf root 9 leaf 7 leaf leaf 10 node Hubungan Hubungan antar antar komponen komponen • • • sibling:node-node yang memiliki parent yang sama Ancestor dari node x: node yang ditemukan, ketika menyusuri tree ke atas dari node x Descendant dari node x: node yang ditemukan ketika menyusuri tree ke bawah dari node x node 1 node leaf 4 2 3 6 5 8 leaf root 9 leaf 7 leaf leaf 10 node Level Level 0 1 2 4 6 5 8 9 3 1 7 2 10 3 Definisi Definisi TREE TREE Sebuah tree didefinisikan sebagai struktur y ang dibentuk secara recursive oleh kedua rule berikut: 1. Sebuah node adalah sebuah tree. Node satu-satunya pada tree ini berfungsi sebagai root maupun leaf. 2. Dari k buah tree T1~Tk , dan masing-masing memiliki root n1~nk.Jika node n adalah parent dari noden1~nk, akan diperoleh sebuah tree baru T yang memiliki root n. Dalam kondisi ini, tree T1~Tkmenjadi sub-tree dari tree T. Root dari sub-tree n1~nkadalah child dari node n . Tree root 1 leaf node Definisi Definisi TREE TREE Sebuah tree didefinisikan sebagai struktur y ang dibentuk secara recursive oleh kedua rule berikut: 1. Sebuah node adalah sebuah tree. Node satu-satunya pada tree ini berfungsi sebagai root maupun leaf. 2. Dari k buah tree T1~Tk , dan masing-masing memiliki root n1~ nk.Jika node n adalah parent dari noden1~nk, akan diperoleh sebuah tree baru T yang memiliki root n. Dalam kondisi ini, tree T1~Tkmenjadi sub-tree dari tree T. Root dari sub-tree n1~ nkadalah child dari node n . T1 1 n1 2 4 3 5 T2 6 2 1 n2 3 T3 1 n3 2 3 T4 1 n4 Definisi Definisi TREE TREE 2. Dari k buah tree T1~Tk , dan masing-masing memiliki root n1~ nk.Jika node n adalah parent dari noden1~nk, akan diperoleh sebuah tree baru T yang memiliki root n. Dalam kondisi ini, tree T1~Tkmenjadi sub-tree dari tree T. Root dari sub-tree n1~ nkadalah child dari node n . 1 n T 2 T1 6 8 7 12 T2 n1 13 9 3 n2 10 T3 4 n3 11 14 T4 5 n4 Ordered Ordered vs vs Unordered Unordered tree tree Ordered tree – Antar sibling terdapat urutan “usia” – Node yang paling kiri berusia paling tua (sulung), sedangkan node yang paling kanan berusia paling muda (bungsu) – Posisi node diatur atas urutan tertentu Unordered tree – Antar sibling tidak terdapat urutan tertentu Outline Outline 1. 2. 3. 4. Apakah Tree Structure itu ? Binary Tree & implementasinya Tree Traversal Implementasi tree (selain binary tree) Definisi Definisi Definisi Binary Tree 1. Sebuah tree yang kosong juga merupakan sebuah binary tree 2. Binary tree harus memenuhi salah satu syarat berikut z Tidak memiliki anak z Memiliki subtree di sebelah kiri (left subtree) z Memiliki subtree di sebelah kanan (right subtree) z Memiliki baik left subtree maupun right subtree HATI-HATI DALAM MENGGAMBAR BINARY TREE a a b a a b b a c b Subtree (child) yang dimiliki bukan kiri maupun kanan Implementasi Implementasi Binary Binary Tree Tree struct node { struct node *left; struct node *right; mydata label; } left right label a b a c b c Contoh Contoh A 10 10 14 14 18 14 B 18 H 26 38 26 C D 26 18 56 78 56 E 56 100 78 F 100 G 100 H B 38 C 38 A G D 78 E F Latihan Latihan 11 • Gambarkan implementasi dari binary tree berikut 10 20 C 40 A 30 B D 50 80 G F E 60 70 90 I H 100 J Outline Outline 1. 2. 3. 4. Apakah Tree Structure itu ? Binary Tree & implementasinya Tree Traversal Implementasi tree (selain binary tree) Definisi Definisi Tree Tree Traversal Traversal z z z Teknik menyusuri tiap node dalam sebuah tree secara sistematis, sehingga semua node dapat dan hanya satu kali saja dikunjungi Ada tiga cara traversal z preorder z inorder z postorder Untuk tree yang kosong, traversal tidak perlu dilakukan Preorder Preorder 1. 2. 3. Visit the root Traverse the left subtree Traverse the right subtree A B H D C E F G A→B→C→D→E→G→F→H Implementasi Implementasi dalam dalam bahasa bahasa C C struct node { struct node ∗left; struct node ∗right; char label; } void preorder(struct node *p) { if (p==NULL) return; jika empty-tree, tidak perlu lakukan apa-apa printf(“visit %c ”, p−>label); tampilkan label node yang dikunjungi preorder(p−>left); traverse the left subtree preorder(p−>right); traverse the right subtree } Inorder Inorder 1. 2. 3. Traverse the left subtree Visit the root Traverse the right subtree A B H D C E F G C→B→G→E→D→F→A→H Implementasi Implementasi dalam dalam bahasa bahasa C C struct node { struct node ∗left; struct node ∗right; char label; } void inorder(struct node *p) { if (p==NULL) return; jika empty-tree, tidak perlu lakukan apa-apa inorder(p−>left); traverse the left subtree printf(“visit %c ”, p−>label); tampilkan label node yang dikunjungi inorder(p−>right); traverse the right subtree } Postorder Postorder 1. Traverse the left subtree 2. Traverse the right subtree 3. Visit the root A B H D C E F G C→G→E→F→D→B→H→A Implementasi Implementasi dalam dalam bahasa bahasa C C struct node { struct node ∗left; struct node ∗right; char label; } void postorder(struct node *p) { if (p==NULL) return; jika empty-tree, tidak perlu lakukan apa-apa postorder(p−>left); traverse the left subtree postorder(p−>right); traverse the right subtree printf(“visit %c ”, p−>label); tampilkan label node yang dikunjungi } Latihan-2 Latihan-2 Tuliskan hasil preorder, inorder dan postorder traversal untuk binary tree berikut. A I B D C E F J G H K L Outline Outline 1. 2. 3. 4. Apakah Tree Structure itu ? Binary Tree & implementasinya Tree Traversal Implementasi tree (selain binary tree) Teknik Teknik implementasi implementasi tree tree • • Binary tree hanya memiliki dua anak: kiri dan kanan. Karena itu implementasinya hanya memerlukan dua buah pointer untuk masingmasing subtree. Untuk implementasi tree yang memiliki sebarang anak, dapat dilakukan dengan dua cara – memakai linked-list – memakai binary tree Contoh Contoh 1 2 3 4 6 5 Implementasi Implementasi memakai memakai linked-list linked-list 3 1 2 3 4 1 6 5 5 2 23 23 5 37 37 35 87 77 77 10 87 15 95 95 25 10 3 15 4 label child 25 5 35 6 struktur yang Merepresentasikan node struktur yang merepresentasikan koneksi antar node Implementasi Implementasi memakai memakai binary-tree binary-tree 1000 1 1001 1 2 3 4 6 5 1001 2 1003 1002 1003 3 label child sibling 1004 1002 6 1004 4 1005 1005 5 Implementasi Implementasi memakai memakai binary-tree binary-tree 1000 1 1001 1 2 6 3 4 1001 2 1003 1002 1002 6 5 1003 3 1004 1004 4 1005 1005 5 Implementasi Implementasi memakai memakai binary-tree binary-tree Rotasi ke kanan 45° 1001 2 1003 1002 6 3 4 3 1000 1 1001 6 2 2 1 1 1002 6 5 4 1003 3 1004 5 1004 4 1005 1005 5 Latihan-3 Latihan-3 Jelaskan implementasi tree berikut a) memakai linked-list b) memakai binary tree 10 50 C 100 300 G 250 F B D A 150 E 200 H 350 450 J 400 I 500 K Linear Linear & & Binary Binary Search Search Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html Agenda Agenda • Linear Search • Binary Search 3 operasi: Penambahan data Pencarian data Penghapusan data Linear Linear Search Search struct { int key; int data; } table[100]; int n; (1) (2) (3) (4) (5) (6) int search(int key) { int i; i=0; while (i < n){ if(table[i].key==key) return(table[i].data); i++; } return -1; } statement Cara Cara kerja kerja Linear Linear Search Search key data table 1 3 4 8 13 14 18 20 21 10 12 14 16 18 20 22 24 26 0 1 2 3 4 5 6 7 8 … 130 26 99 Cara Cara kerja kerja Linear Linear Search Search key data search(18) i=0 table 1 3 4 8 13 14 18 20 21 10 12 14 16 18 20 22 24 26 0 1 2 3 4 5 6 7 8 … 130 26 99 Cara Cara kerja kerja Linear Linear Search Search key data search(18) i=1 table 1 3 4 8 13 14 18 20 21 10 12 14 16 18 20 22 24 26 0 1 2 3 4 5 6 7 8 … 130 26 99 Cara Cara kerja kerja Linear Linear Search Search key data search(18) i=2 table 1 3 4 8 13 14 18 20 21 10 12 14 16 18 20 22 24 26 0 1 2 3 4 5 6 7 8 … 130 26 99 Cara Cara kerja kerja Linear Linear Search Search key data search(18) i=