Academia.eduAcademia.edu

STRUKTUR DATA

2019, Febryan Alfaridzi

LAPORAN PRAKTIKUM STRUKTUR DATA SEMESTER GENAP TAHUN AKADEMIK 2018/2019 Disusun oleh : Nama NIM Prodi Kelompok : Febryan Alfaridzi : 1818057 : TEKNIK INFORMATIKA S1 : 25 PROGRAM STUDI TEKNIK INFORMATIKA S-1 FAKULTAS TEKNOLOGI INDUSTRI INSTITUT TEKNOLOGI NASIONAL MALANG 2019 LEMBAR PERSETUJUAN PRAKTIKUM STRUKTUR DATA SEMESTER GENAP TAHUN AKADEMIK 2018/2019 NAMA NIM PRODI Disusun Oleh : Febryan Alfaridzi : 1818057 : TEKNIK INFORMATIKA S-1 Mengetahui, Kepala Laboratorium Rekayasa Perangkat Lunak Menyetujui, Dosen Pembimbing (Ali Mahmudi,B.Eng,.PhD) NIP.P.1031000429 (Hani Zulfia Zahro’, S.kom,M.kom) NIP.P/Y.1031500480 PROGRAM STUDI TEKNIK INFORMATIKA S-1 FAKULTAS TEKNOLOGI INDUSTRI INSTITUT TEKNOLOGI NASIONAL MALANG 2019 ii KATA PENGANTAR Dengan memanjatkan puji syukur kehadirat Tuhan Yang Maha Esa, karena atas berkah rahmat dan karunia-Nya sehingga kami dapat menyelesaikan Laporan Praktikum Mata Kuliah, guna persyaratan dalam menempuh mata kuliah. Laporan ini disusun berdasarkan percobaan dan teori dasar yang ada dalam buku panduan praktikum ,teori yang diperoleh praktikan dari perkuliahan, dan tidak lupa yaitu Internet sehingga praktikan dapat menambah tidak hanya menguasai teori saja namun juga memahami serta mengaplikasikannya. Terwujudnya laporan ini, tentunya tidak lepas dari bantuan-bantuan yang telah kami terima. Pada kesempatan ini, kami menyampaikan terima kasih yang sebesar-besarnya kepada yang terhormat: 1. Ibu Hani Zulfia Zahro’, S.kom,M.kom selaku dosen pembimbing Praktikum Struktur Data. 2. Bapak Joseph Agus Pranoto,ST. selaku dosen mata kuliah Struktur Data. 3. Bapak Ali Mahmudi, B.Eng.,PhD. selaku Ketua Pelaksana Praktikum Mata Kuliah Jurusan Teknik Informatika ITN Malang. 4. Instruktur Lab. Rekayasa Perangkat Lunak Teknik Informatika yang telah memberi petunjuk kepada kami selama pelaksanaan praktikum. 5. Rekan-rekan yang telah membantu dalam pelaksanaan dan penyelesaian laporan ini. Dalam menyusun laporan ini kami menyadari bahwa laporan ini masih memiliki kekurangan, karena itu segala kritik dan saran yang membangun akan kami nanti demi perbaikan penyusunan laporan selanjutnya. Harapan kami laporan praktikum ini bermanfaat bagi penulis sendiri maupun pembaca sekalian. Malang, Mei 2019 Penulis iii DAFTAR ISI KATA PENGANTAR ........................................................................................ ii DAFTAR ISI ..................................................................................................... iii DAFTAR GAMBAR .......................................................................................... v DAFTAR TABEL ............................................................................................. vi BAB I POINTER, STRUCTURE, REKURSIF ................................................ 1 I.1 Landasan Teori ........................................................................................... 1 I.2 Langkah-langkah Praktikum ....................................................................... 6 I.3 Tugas Praktikum ke-1 : Program Implementasi Pointer ............................... 6 I.4 Tugas Praktikum ke-2 : Program implementasi Struct ................................. 7 I.5 Tugas Praktikum ke-3 : Program Menghitung Nilai Faktorial...................... 8 I.6 Tugas Rumah ke-1 : Program Implementasi Pointer .................................... 9 I.7 Tugas Rumah ke-2 : Program Implementasi Struct .................................... 10 I.8 Tugas Rumah ke-3 : Program Menara Hanoi............................................. 12 I.9 Kesimpulan ............................................................................................... 13 BAB II Stack dan Queue ................................................................................... 1 II.1 Landasan Teori .......................................................................................... 1 II.2 Langkah-langkah Praktikum ...................................................................... 8 II.3 Tugas Praktikum ke-1 : Program Implementasi Stack ................................ 8 II.4 Tugas praktikum ke-2: Program Implementasi Queue .............................. 11 II.5 Tugas Rumah ke-1 : Program Membalikkan Nama mengguakan Stack .... 14 II.6 Tugas Rumah ke-2 : Program Antrian Bank ............................................. 15 II.7 Kesimpulan ............................................................................................. 17 BAB III SORTING ............................................................................................ 1 III.1 Landasan Teori......................................................................................... 1 III.2 Langkah-langkah Praktikum ..................................................................... 4 III.3 Tugas Praktikum ke-1 : Sorting menggunakan Bubble Sort ...................... 5 III.4 Tugas Praktikum ke-2 : Sorting menggunakan Exchange Sort .................. 6 III.5 Tugas Praktikum ke-3 : Sorting menggunakan Insertion Sort .................... 7 III.6 Tugas Praktikum ke-4 : Sorting menggunakan Selection Sort ................... 8 III.7 Tugas Praktikum ke-5 : Sorting menggunakan Quick Sort ........................ 9 iv III.8 Tugas Rumah ke-1 : Program mengurutkan Data Aslab .......................... 11 III.9 Tugas Rumah ke-2 : Program Sorting menggunakan Quick Sort............. 13 III.10 Kesimpulan .......................................................................................... 14 BAB IV SEARCHING ....................................................................................... 1 IV.1 Landasan Teori ........................................................................................ 1 IV.2 Langkah-langkah Praktikum..................................................................... 4 IV.3 Tugas Praktikum ke-1 : Program Implementasi Sequential Search............ 5 IV.4 Tugas Praktikum ke-2 : Program Implementasi Binary Search ................. 6 IV.5 Tugas Praktikum ke-3 : Program Implementasi Interpolation Search ........ 7 IV.6 Tugas Rumah ke-1 : Program Mencari Data Aslab ................................... 9 IV.7 Kesimpulan ............................................................................................ 11 BAB V LINKED LIST ....................................................................................... 1 V.1 Landasan Teori.......................................................................................... 1 V.2 Langkah-langkah Praktikum ...................................................................... 3 V.3 Tugas Praktikum ke-1 : Single Linked List ................................................ 4 V.4 Tugas Praktikum ke-2 : Double Linked List Input Data ............................. 7 V.5 Tugas Rumah ke-1 : Menampilkan Hubungan Orang tua Anak .................. 9 V.6 Tugas Rumah ke-2 : Implementasi Double Linked List .......................... 13 V.6 Kesimpulan ............................................................................................. 17 BAB VI TREE .................................................................................................... 1 VI.1 Landasan Teori (Tree) ............................................................................. 1 VI.2 Langkah-Langkah Praktikum .................................................................. 4 VI.3 Tugas Praktikum ke-1 : Tree .................................................................... 4 VI.4 Tugas Rumah ke-1 : Program Implementasi Tree .................................... 8 VI.5 Kesimpulan ........................................................................................... 12 BAB VII KESIMPULAN................................................................................... 1 DAFTAR PUSTAKA ......................................................................................... 2 v DAFTAR GAMBAR Gambar 1.1 Program Implementasi Pointer ...................................................... 6 Gambar 1.2 Program Implementasi Struct ........................................................ 7 Gambar 1.3 Program Menghitung Nilai Faktorial ............................................. 8 Gambar 1.4 Program Implementasi Pointer ...................................................... 9 Gambar 1.5 Program Implementasi Struct ...................................................... 11 Gambar 1.6 Program Menara Hanoi ............................................................... 12 Gambar 2.1 Program Implementasi Stack....................................................... 10 Gambar 2.2 Program Implementasi Queue ..................................................... 13 Gambar 2.3 Program Membalikkan Nama Menggunakan Stack ..................... 14 Gambar 2.4 Program Antrian Bank ................................................................ 16 Gambar 3.1 Program Sorting menggunakan Bubble Sort .................................. 5 Gambar 3.2 Program Sorting menggunakan Exchange Sort .............................. 6 Gambar 3.3 Program Sorting menggunakan Insertion Sort ............................... 7 Gambar 3.4 Program Sorting menggunakan Selection Sort .............................. 9 Gambar 3.5 Program Sorting menggunakan Quick Sort ................................. 10 Gambar 3.6 Program mengurutkan Data Aslab............................................... 12 Gambar 3.7 Program Sorting menggunakan Quick Sort ................................. 14 Gambar 4.1 Program Implementasi Sequeantial Search .................................... 5 Gambar 4.2 Program Implementasi Binary Search ........................................... 7 Gambar 4.3 Program Implementasi Interpolation Search .................................. 8 Gambar 4.4 Program Mencari Data Aslab ...................................................... 10 Gambar 5.1 Program Single Linked List .......................................................... 7 Gambar 5.2 Program Double Linked List Input Data........................................ 9 Gambar 5.3 Program Menampilkan Hubungan Orang tua Anak ..................... 12 Gambar 5.4 Program Implementasi Double Linked List ................................. 16 Gambar 6.1 Program Tree ................................................................................ 7 Gambar 6.2 Program Implementasi Tree ........................................................ 10 Gambar 6.3 Notasi Tingkat Program Implementasi Tree ................................ 11 Gambar 6.4 Diagram Venn Program Implementasi Tree ................................. 11 vi DAFTAR TABEL Perbedaan pointer dengan variabel biasa .......................................................... 2 Perbandingan Array dengan Linked List ........................................................... 1 Istilah – istilah dalam Tree ............................................................................... 2 I-1 BAB I POINTER, STRUCTURE, REKURSIF Jumlah Pertemuan : 2 x 50 menit Tujuan Praktikum : 1. Praktikan mampu memahami pengertian pointer, structure, rekursif dengan menggunakan C++. 2. Praktikan mengetahui Aturan main dari pointer,structure,rekursif. 3. Praktikan dapat mengoperasikan sebuah program menggunakan metode pointer, structure, dan rekursif. Alat dan bahan : 1. Perangkat komputer 2. Perangkat lunak: Dev C++ 3. Modul Struktur Data 2019 I.1 Landasan Teori 1.1 Pengertian Pointer Pointer adalah suatu variabel penunjuk, berisi nilai yang menunjuk alamat suatu lokasi memori tertentu. Jadi pointer tidak berisi nilai data, melainkan berisi suatu alamat memori atau null, jika pointer tidak berisi data maka disebut null pointer. Untuk mendeklarasikan variabel sebagai pointer, maka hanya menambahkan tanda asterik (*) di depan nama variabel. Dan untuk mendapatkan alamat dari variabel adalah dengan menggunakan operator &. Berikut ini bentuk umum dari pendeklarasian variabel yang bertipe pointer. Tipe_data *nama_pointer; Jika ingin menyimpan alamat dari variabel x, kita dapat menggunakan suatu variabel misalnya Int alamat_x = &x; Maka alamat_x adalah suatu variabel yang berisi alamat dimana nilai x disimpan. Variabel alamat_x disebut variabel pointer atau sering disebut dengan pointer saja. Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf II-2 1.2 Pointer tanpa tipe data Ada cara khusus untuk membuat pointer yang dideklarasikan tersebut tanpa merujuk ke semua tipe data, yaitu dengan mendeklarasikan pointer tersebut sebagai pointer tanpa tipe data atau disebut “void pointer”. Bentuk umumnya adalah : Void *nama_pointer; Perbedaan pointer dengan variabel biasa Variabel Biasa Berisi data/nilai Pointer Berisi alamat memori dari suatu variabel tertentu Operasi yang bisa dilakukan seperti Membutuhkan operator khusus:”&” layaknya operasi biasa +,-,*,/ yang menunjuk alamat dari suatu variabel tertentu. Operator “&” hanya dapat dilakukan kepada variabel dan akan menghasilkan alamat dari variabel itu. Contoh : p = &n Yang kedua : Operator “*”. Operator ini bersifat menggunakan nilai dari alamat variabel yang ditunjuk oleh pointer tersebut. Contoh : int *p; Bersifat statis Bersifat dinamis Deklarasi : int a; Deklarasi : int *a; II-3 1.3 Aturan Pointer Variabel pointer dapat dideklarasikan dengan tipe data apapun. Pendeklarasian variabel pointer dengan tipe data tertentu digunakan untuk menyimpan alamat memori yang berisi data sesuai dengan tipe data yang dideklarasikan, bukan untuk berisi nilai bertipe data tertentu. Tipe data digunakan sebagai lebar data untuk alokasi memori (misalnya char berarti lebar datanya 1 byte, dst). Jika suatu variabel pointer dideklarasikan bertipe float, berarti variabel pointer tersebut hanya bisa digunakan untuk menunjuk alamat memori yang berisi nilai bertipe float juga. 1.4 Pointer Pada Array Array adalah suatu variabel yang menyimpan sekumpulan data yang memiliki tipe sama. Setiap data tersebut menempati lokasi atau alamat memory yang berbeda – beda dan selanjutnya di sebut dengan elemen array. Elemen array tersebut kemudian dapat kita akses melalui indeks yang terdapat di dalamnya namun penting sekali untuk diperhatikan bahwa dalam C++, indeks array selalu di mulai dari 0, bukan 1. 1.5 Pengertian Struct Struct (struktur) adalah kumpulan elemen – elemen data yang digabungkan menjadi satu kesatuan. Masing – masing elemen data tersebut dikenal dengan sebutan field. Field data tersebut dapat memiliki tipe data yang sama ataupun berbeda. Walaupun field – field tersebut berada dalam satu kesatuan, masing – masing field tersebut tetap dapat diakses secara individual. Field – field tersebut digabungkan menjadi satu dengan tujuan untuk kemudahan dalam operasinya. Misalnya ingin mencatat data – data mahasiswa dan pelajar dalam sebuah program. Untuk membedakannya kita dapat membuat sebuah struct mahasiswa yang terdiri dari field nama, nim, program studi dan ipk. Serta sebuah record pelajar yang terdiri dari field – II-4 field nama, nim, alamat dan nilai. Dengan demikian akan lebih mudah untuk membedakan keduanya. Bentuk umum : Struct nama_struct{ Tipe_data1 field1; Tipe_data2 field2; Tipe_dataN fieldN; }; 1.6 Penggunaan dan Pengaksesan Elemen Terstruktur Untuk menggunakan struct, tulis nama struct beserta dengan fieldnya yang dipisahkan dengan tanda titik (“.”). Misalnya anda ingin menulis nim seorang mahasiswa ke layar maka penulisan yang benar adalah sebagai berikut: - Mahasiswa.nim = “1818057”; - Cout << mahasiswa.nim; Jika x adalah pointer bertipe mahasiswa* maka field dari x dapat diakses dengan mengganti tanda titik dengan tanda panah (“->”). - Cout << mahasiswa->nim; 1.7 Pengertian Rekursif Rekursif adalah salah satu metode dalam dunia matematika, rekursif didefinisikan sebagai sebuah fungsi yang mengandung fungsi itu sendiri. Dalam dunia pemrograman, rekursif diimplementasikan dalam sebuah fungsi yang memanggil dirinya sendiri dan prosesnya terjadi secara berulang – ulang. 1.8 Fase dalam Rekursif 1.8.1 Fase Awal Fase awal merupakan fase dimana fungsi tersebut memanggil dirinya sendiri. II-5 1.8.2 Terminate Terminate merupakan fase dimana fungsi tersebut berhenti memanggil dirinya sendiri. 1.8.3 Fase Balik Fase balik merupakan fase mengunjungi kembali kondisi – kondisi dari fase awal yang telah terbentuk dan mengembalikan nilai yang telah didapat dan fase terminal. 1.9 Implementasi Rekursif 1.9.1 Faktorial Dalam matematika, factorial dari bilangan asli n adalah hasil perkalian antara bilangan bulat positif yang kurang dari atau sama dengan n. Faktorial ditulis sebagai n! dan disebut n factorial. Secara umum dapat dituliskan sebagai : n! = n * (n – 1) * (n – 2) . (n – 3) * … * 3 * 2 * 1 1.9.2 Fibonacci Fibonacci adalah kumpulan deret angka seperti berikut ini “1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …”. Setiap bilangan setelah bilangan kedua merupakan jumlah dari dua bilangan sebelumnya. Dengan demikian 2 dari 1+1, 3 dari 2+1, 5 dari 3+2 dan demikian dijabarkan sebagai berikut : Jika n = 0, maka FN = 0, jika n = 1, maka Fn = 1 Jika n > 1, maka Fn = F(n-1)+F(n-2) Implementasi dari fungsi Fibonacci dari definisi diatas dapat dinyatakan sebagai berikut : Karena Fn = n untuk n < 2, kita dapat menyederhanakan dengan pernyataan If. II-6 I.2 Langkah-langkah Praktikum 1. Script ditulis dengan menggunakan Dev C++ 2. Script dicompile dengan menggunakan Dev C++ 3. Aplikasi dijalankan dengan menggunakan Dev C++ I.3 Tugas Praktikum ke-1 : Program Implementasi Pointer 1. Listing Program : #include <iostream> using namespace std; int main(){ int *a,*b,*c=NULL; int d = 10; a = &d; cout<<"Nilai d : "<<d<<" disimpan pada alamat "<<a<<endl; cout<<"Nilai b : "<<b<<" -> disebut dangling pointer"<<endl; cout<<"Nilai c : "<<c<<" -> disebut null pointer"; return 0; } 2. Tampilan Program :. Gambar 1.1 Program Implementasi Pointer 3. Analisa Program Pertama – tama mendeklarasikan 3 buah pointer, d memiliki nilai 10 dan memiliki alamat 0xb4fd64. Ketika b ditampilkan maka yang tampil adalah alamat nya karena belum diisi data. c merupakan null pointer yang artinya adalah kosong. II-7 I.4 Tugas Praktikum ke-2 : Program implementasi Struct 1. Listing Program : #include <iostream> #include <cstdlib> using namespace std; struct mahasiswa{ char nim[11], nama[50]; char alamat[100]; float ipk; }; main(){ mahasiswa mhs; cout<<"Masukkan NIM : ";cin>>mhs.nim; fflush(stdin); cout<<"Masukkan Nama : ";cin>>mhs.nama; fflush(stdin); cout<<"Alamat : ";cin>>mhs.alamat; cout<<"IPK : ";cin>>mhs.ipk; cout<<"================================="<<endl; cout<<"NIM : "<<mhs.nim<<endl; cout<<"Nama : "<<mhs.nama<<endl; cout<<"Alamat : "<<mhs.alamat<<endl; cout<<"IPK : "<<mhs.ipk<<endl; } 2. Tampilan Program :. Gambar 1.2 Program Implementasi Struct II-8 3. Analisa Program : Program diatas merupakan contoh penggunaan struct. Struct mahasiswa berisi dengan elemen Nim, Nama, Alaman bertipe data char dan Ipk bertipe data float yang kemudian Mahasiswa menjadi tipe data untuk variabel mhs I.5 Tugas Praktikum ke-3 : Program Menghitung Nilai Faktorial 1. Listing Program : #include <iostream> using namespace std; int faktorial(int angka){ if(angka<=1){ return 1; } else { return angka*faktorial(angka-1); } } main(){ int bil; cout<<"===Mencari Nilai Faktorial==="<<endl; cout<<"==Dari Bilangan Desimal=="<<endl; cout<<"======================================="<<endl; for(bil=0; bil<=5 ;bil++){ cout<<"Hasil Faktorial ( "<<bil<<" ) "<<faktorial(bil); cout<<endl; } } 2. Tampilan Program : Gambar 1.3 Program Menghitung Nilai Faktorial = II-9 3. Analisa Program : Program diatas adalah program untuk mencari nilai factorial sebuah bilangan, merupakan contoh penerapan rekursif. Apabila angka <= maka akan mereturnkan 1, tapi jika tidak maka akan mereturnkan angka * factorial (angka – 1). Disitulah akan terjadi pemanggilan fungsi secara terus menerus hingga kondisi if terpenuhi . I.6 Tugas Rumah ke-1 : Program Implementasi Pointer 1. Listing Program : #include <iostream> using namespace std; main(){ int x,*y,*z; x=1; y=&x; z=&x; cout<<y<<endl; cout<<*y<<endl; cout<<z<<endl; cout<<*z<<endl; } 2. Tampilan Program : Gambar 1.4 Program Implementasi Pointer 3. Analisa Program : Variabel x berisi data nilainya 1. y mengambil alamat dari variabel x, maka ketika *y dikeluarkan akan menampilan data yang ada pada alamat x. Begitupun dengan pointer z, karena sama sama mengambil alamat dari variabel x. II-10 I.7 Tugas Rumah ke-2 : Program Implementasi Struct 1. Listing Program : #include <iostream> using namespace std; struct mahasiswa{ float tugas,quiz,mid,uas,akhir; string nama,nim,kelas,jurusan; string nilai; }; int main(){ mahasiswa mhs; int jumlahmahasiswa; cout<<"DATA NILAI STRUKTUR DATA"<<endl; cout<<"--------------------------"<<endl; cout<<"Inputan jumlah mahasiswa : ";cin>>jumlahmahasiswa; cout<<endl; for(int a=1; a<=jumlahmahasiswa ;a++){ cout<<"Mahasiswa ke-"<<a<<endl; cout<<"------------------------------------"<<endl; cout<<"Input Nama\t\t : ";cin>>mhs.nama; cout<<"Input NIM\t\t : ";cin>>mhs.nim; cout<<"Input Kelas\t\t : ";cin>>mhs.kelas; cout<<"Input Jurusan\t\t : ";cin>>mhs.jurusan; cout<<endl; cout<<"Input Nilai Tugas\t : ";cin>>mhs.tugas; cout<<"Input Nilai Quiz\t : ";cin>>mhs.quiz; cout<<"Input Nilai MID\t\t : ";cin>>mhs.mid; cout<<"Input Nilai UAS\t\t : ";cin>>mhs.uas; cout<<endl<<endl; mhs.akhir = (mhs.tugas+mhs.quiz+mhs.mid+mhs.uas)/4; cout<<"Nilai Akhir Anda\t : "<<mhs.akhir<<endl; if(mhs.akhir >= 80 && mhs.akhir <= 100){ mhs.nilai = "A"; } else if(mhs.akhir >= 75 && mhs.akhir <80){ mhs.nilai = "B+"; } else if(mhs.akhir >= 70 && mhs.akhir <75){ mhs.nilai = "B"; } else if(mhs.akhir >= 50 && mhs.akhir <70){ mhs.nilai = "C"; } else if(mhs.akhir >= 0 && mhs.akhir <50){ mhs.nilai = "D"; } else{ mhs.nilai = "Salah input nilai"; } cout<<"Nilai Huruf Anda\t : "<<mhs.nilai<<endl; cout<<"===================================================== ========"<<endl<<endl; } II-11 } 2. Tampilan Program : Gambar 1.5 Program Implementasi Struct 3. Analisa Program : Pertama – tama membuat struct yang berisi bermacam elemen. Inputan jumlah mahasiswa adalah menggunakan variabel pada fungsi main bukan menggunakan elemen pada struct. Rata – rata nilai didapat dari 4 nilai mahasiswa yang jumlahkan kemudian di bagikan dan nilai huruf dibuat menggunakan percabangan if. II-12 I.8 Tugas Rumah ke-3 : Program Menara Hanoi 1. Listring Program : #include <iostream> using namespace std; int hanoi(int n, char dari, char bantu, char tujuan){ if (n == 1) cout <<"Pindahkan piring dari "<<dari<<" "<<tujuan<<"\n"; else{ hanoi(n-1, dari, tujuan, bantu); hanoi(1, dari, bantu, tujuan); hanoi(n-1, bantu, dari, tujuan); } } main(){ int jumlah_piring; cout<<"=====Permainan Hanoi====="<<endl<<endl; cout<<"Masukkan Jumlah piring: "; cin>>jumlah_piring; cout<<endl; hanoi(jumlah_piring,'A','B','C'); } 2. Tampilan Program : Gambar 1.6 Program Menara Hanoi ke I-13 3. Analisa Program : Program diatas adalah contoh implementasi rekursif pada C++. Pemanggilan fungsi dirinya sendiri akan terus berjalan apabila kondisi n masih tidak sama dengan 1. Fungsi akan berhenti memanggil dirinya sendiri ketika kondisi if telah terpenuhi. Pada fungsi main, jumlah piring merupakan inputan user dan hasil eksekusi program tergantung pada inputan user tersebut. I.9 Kesimpulan 1. Pointer adalah sebuah variabel yang meyimpan alamat memory, untuk mendapatkan alamat dari sebuah variabel adalah dengan menggunakan operator &, sedangkan untuk memanggil data yang ada di alamat tersebut adalah menggunakan operator *. 2. Struct adalah kumpulan elemen – elemen data yang digabungkan menjadi satu kesatuan yang masing – masing elemen data tersebut disebut dengan field. 3. Rekursif adalah fungsi yang memanggil fungsi itu sendiri dan prosesnya terjadi secara berulang – ulang. Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf II-1 BAB II Stack dan Queue Jumlah Pertemuan : 2 x 60 menit Tujuan Praktikum : 1. Praktikan dapat memahami pengertian dari Stack dan Queue 2. Agar Praktikan mengetahui dan memahami Operasi-operasi yang digunakan di metode Stack dan Queue 3. Praktikan dapat mengoprasikan atau menerapkan metode Stack dan Queue kedalam sebuah program. Alat / bahan : 1. Perangkat komputer 2. Perangkat lunak: Dev C++ 3. Modul Struktur Data 2019 II.1 Landasan Teori 2.1 Pengertian Stack (Tumpukan) Stack (Tumpukan) adalah kumpulan elemen – elemen data yang disimpan dalam satu lajur linear. Kumpulan elemen – elemen data hanya boleh diakses pada satu lokasi saja yaitu posisi atas (TOP) tumpukan. Tumpukan digunakan dalam algoritman pengimbas (parsing), algoritma penilaian (evaluation) dan algoritman penjajahan balik (backtrack). Elemen – elemen di dalam tumpukan dapat bertipe integer, real, record dalam bentuk sederhana atau terstruktur. Stack adalah suatu tumpukan dari benda. Konsep utamanya adalah LIFO (Last In First Out), benda yang terakhir masuk dalam stack akan menjadi benda pertama yang dikeluarkan dari stack. Tumpukan disebut juga “Push Down Stack” yaitu penambahan elemen baru (PUSH) dan pengeluaran elemen dari tumpukan (POP). Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf II-2 2.2 Operasi Dalam Stack (Tumpukan) Operasi yang sering diterapkan pada struktur data Stack (Tumpukan) adalah Push dan Pop. Operasi – operasi yang dapat diterapkan adalah sebagai berikut : 1. Push : digunakan untuk menambah item pada Stack pada Tumpukan paling atas. 2. Pop : digunakan untuk mengambil item pada Stack pada Tumpukan paling atas. 3. Clear : digunakan untuk mengosongkan Stack. 4. Create Stack : membuat Tumpukan baru, dengan jumlah elemen kosong. 5. IsEmpty : fungsi yang digunakan untuk mengecek apakah Stack sudah kosong. 6. IsFull : fungsi yang digunakan untuk mengecek apakah Stack sudah penuh. 2.3 Macam – macam Stack (Tumpukan) 1. Stack dengan Array Sesuai dengan sifat stack, pengambilan atau penghapusan elemen dalam stack harus dimulai dari elemen teratas. 2. Double Stack dengan Array Metode ini adalah teknik khusus yang dikembangkan untuk menghemat pemakaian memori dalam pembuatan dua stack dengan array. Intinya adalah penggunaan hanya sebuah array untuk menampung dua stack. II-3 2.4 Inisialisasi Stack (Tumpukan) Pada mulanya isi top dengan -1, karena array dalam C dimulai dari 0, yang berarti stack adalah Kosong! Top adalah suatu variabel penanda dalam Stack menunjukkan elemen teratas Stack sekarang. Top Of Stack akan selalu bergerak hingga mencapai Max Of Stack sehingga menyebabkan Stack penuh. 2.5 Fungsi Is Full Untuk memeriksa apakah stack sudah penuh? Cukup dengan cara memeriksa Top Of Stack, jika sudah sama dengan MAX_STACK-1 maka dapat dinyatakan bahwa stack yang ada sudah penuh, tetapi jika masih lebih kecil dari MAX_STACK-1 maka dapat dinyatakan bahwa stack belum penuh. 2.6 Fungsi Is Push Untuk memasukkan elemen ke stack, selalu menjadi elemen teratas stack. Tambah satu (increment) nilai Top Of Stack terlebih dahulu setiap kali ada penambahan elemen stack, asalkan stack masih belum punah, kemudian isikan nilai baru ke stack berdasarkan index Top Of Stack setelah ditambah satu. 2.7 Fungsi Pop Untuk mengambil elemen teratas dari stack, ambil dahulu nilai elemen teratas stack dengan mengakses Top Of Stack, tumpukan nilai yang akan diambil terlebih dahulu, baru di decrement (dikurangi) nilai Top Of Stack sehingga jumlah elemen stack berkurang. 2.8 Fungsi Print Untuk menampilkan semua elemen – elemen stack. Dengan cara looping semua nilai array secara terbalik. Karena kita harus mengakses dari indeks array tertinggi terlebih dahulu baru ke indeks yang paling kecil. 2.9 Algoritma Pop Stack : 1. Jika berupa operan, maka masukkan ke stack hasil 2. Jika berupa operator, maka : II-4 a. Pop nilai pertama dari stack hasil b. Pop nilai kedua dari stack hasil c. Lakukan operasi sesuai dengan operator yang didapat 2.10 Notasi Aritmetik (Prefix, Postfix, Prefix) Notasi aritmetika biasa ditulis dalam notasi Infix, missal A+B+C. Notasi infix mudah dimengerti ooleh manusia, hanya saja dalam notasi infix perlu diperhatikan prioritas pengerjaan karena berhubungan dengan hirarki operator pada computer. Prioritas pengerjaannya adalah : 1. Tanda kurung : ( … ) 2. Eksponensial atau pangkat : ^ 3. Perkalian, pembagian : *, / 4. Penjumlahan, pengurangan : +, Prefix adalah keadaan dimana symbol operator diletakkan sebelum dua operand. Postfix adalah keadaan dimana symbol operator diletakkan sesudah dua operand. 2.11 Aturan Pengerjaan 1. Baca soal dari depan ke belakang. 2. Jika soal berupa operand, maka masukkan ke postfix. 3. Jika berupa operator, maka : a) Jika stack masih kosong, push ke stack. b) Jika derajat operator soal > derajat operator top of stack.  Push operator soal ke stack c) Selama derajat operator soal <= derajat operator top of stack.  Pop top of stack dan masukkan kedalam postfix II-5  Setelah semua dilakukan, push operator soal ke stack d) Jika sudah semua soal dibaca, pop semua isi stack dan push ke postfix sesuai dengan urutannya. 2.12 Pengertian Queue Queue atau antrian merupakan struktur data linear dimana penambahan komponen dilakukan ujung, sementara pengurangan dilakukan diujung lain. Kaidah utama dalam konsep queue adalah FIFO yang merupakan singkatan dari First In First Out, artinya adalah data yang pertama kali dimasukkan atau disimpan, maka data tersebut adalah yang pertama kali akan diakses atau dikeluarkan. Sebuah queue di dalam program komputer dideklarasikan sebagai sebuah tipe bentukan baru. Sebuah struktur data dari sebuah queue setidaknya harus mengandung dua tiga variabel, yakni variabel head yang akan berguna sebagai penanda bagian depan antrian, variable tail yang akan berguna sebagai penanda bagian belakang antrian dan array dari yang akan menyimpan data-data yang dimasukkan ke dalam queue tersebut. 2.13 Operasi Pada Queue Operasi Enqueue, digunakan untuk memasukkan sebuah data atau nilai ke dalam queue. Pada proses enqueue, tail -lah yang berjalan seiring masuknya data baru ke dalam antrian, sedangkan head akan tetap pada posisi ke-1. Operasi Dequeue, digunakan untuk menghapuskan sebuah data atau nilai yang paling awal masuk ke dalam queue. Operasi ini menaikkan nilai head satu level. Operasi Is Full, Untuk mengecek apakah Antrian sudah penuh atau belum Dengan cara mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1 adalah batas elemen array pada C, berarti sudah penuh. II-6 Operasi Is Empty, Untuk memeriksa apakah Antrian kosong atau belum Dengan cara memeriksa nilai Tail, jika Tail = -1 maka empty. Kita tidak memeriksa Head, karena Head adalah tanda untuk kepala antrian (elemen pertama dalam antrian) yang tidak akan berubah-ubah Pergerakan pada Antrian terjadi dengan penambahan elemen Antrian kebelakang, yaitu menggunakan nilai Tail. Operasi Clear, Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan Head = -1, Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus arraynya, namun hanya mengeser indeks pengaksesan-nya ke nilai -1 sehingga elemen - elemen antrian tidak lagi terbaca. 2.14 Implementasi Queue dengan Linear Array Untuk setiap struktur data queue yang diimplementasikan dengan array, posisi front (depan) back (belakang) akan selalu ada. Dua hal yang menarik perhatian adalah queue bergerak dari indeks kecil menuju indeks yang besar dan diperlukan dua buah penunjuk (Head dan Tail). Pada struktur antrian linier terdapat dua pintu yaitu head dan tail. Dimana head ditempatkan pada awal array (index 0) dan tail ditempatkan pada max -1, sehingga dalam pemrograman dibutuhkan 2 variabel head dan tail. 2.15 Implementasi Queue dengan Circular Array Circular array adalah suatu array yang dibuat seakan-akan merupakan sebuah lingkaran dengan titik awal (head) dan titik akhir (tail) saling bersebelahan jika array tersebut masih kosong. Posisi head dan tail pada gambar diatas adalah bebas asalkan saling bersebelahan. Dengan circular array, meskipun posisi terakhir telah dipakai, elemen baru tetap dapat ditambahkan pada posisi pertama jika posisi pertama dalam keadaan kosong. Jika akhir = MAX dan awal = 1, nilai head dan Tail mencapai maksimum, maka akan dikembalikan ke posisi awal. Operasi- II-7 operasi yang terdapat pada circular array tidak jauh berbeda dengan operasi pada linear array. Aturan – aturan dalam queue yang menggunakan circular array adalah 1. Proses penghapusan dilakukan dengan cara nilai depan (front) ditambah 1 : depan += 1 2. Proses penambahan elemen sama dengan linear array yaitu nilai belakang ditambah 1 : belakang += 1 3. Jika depan = maks dan ada elemen yang akan dihapus, maka nilai depan = 1 4. Jika belakang = maks dan depan tidak 1, maka jika ada elemen yang akan ditambahkan, nilai belakang = 1 5. Jika hanya tinggal 1 elemen di queue (depan = belakang), dan akan dihapus maka depan diisi 0 dan belakang diisi dengan 0 (queue kosong) 2.15.1 Inisialisasi Queue Inisialisasi queue adalah proses pemberian nilai 0 untuk field depan dan belakang dari queue dan juga pemberian nilai maks ke maks_queue yang menunjukan banyaknya maksimal data dalam queue. Karena dalam bahasa C++ elemen sebuah array dimulai dengan 0 maka proses inisialisasi nilai depan dan belakang bukan 0 tetapi -1 sehingga ketika ada proses penambahan elemen (enqueue) akan bernilai 0 sehingga elemen tersebut akan disimpan dalam elemen antrian pada posisi 0. 2.15.2 Fungsi Dalam Queue Circular Array Terdapat fungsi – fungsi yang mirip antara Queue Circular dan Queue Linear. II-8 1. Fungsi Is Empty 2. Fungsi Is Full 3. Fungsi Enqueue 4. Fungsi Dequeue II.2 Langkah-langkah Praktikum 1. Script ditulis dengan menggunakan Dev C++ 2. Script dicompile dengan menggunakan Dev C++ 3. Aplikasi dijalankan dengan menggunakan Dev C++ II.3 Tugas Praktikum ke-1 : Program Implementasi Stack 1. Listing Program : #include <iostream> #define MAXSTACK 100 using namespace std; typedef int itemType; typedef struct { int item[MAXSTACK]; int jml; } Stack; void init(Stack *s) { s->jml=0; }; int kosong(Stack *s) { return (s->jml==0); } int penuh(Stack *s) { return (s->jml==MAXSTACK); } void isi(itemType x, Stack *s) { if(penuh(s)) { cout<<" Maaf data sudah penuh"<<endl; cout<<"-------------------------------------------------"<<endl; } II-9 else { s->item[s->jml]=x; ++(s->jml); } } void ambil(Stack *s, itemType *x) { if(kosong(s)) { cout<<" Maaf data masih kosong"<<endl; cout<<"-------------------------------------------------"<<endl; } else { --(s->jml); *x=s->item[s->jml]; s->item[s->jml]=0; cout<<" Data "<<*x<<" berhasil diambil"<<endl; cout<<"-------------------------------------------------"<<endl; } } void tampil(Stack *s) { if(kosong(s)) { cout<<" Maaf data masih kosong"<<endl; cout<<"-------------------------------------------------"<<endl; } else cout<<endl; for(int i=s->jml-1;i>=0;i--) { cout<<"Data "<<s->item[i]<<endl; } } void hapus(Stack *s) { s->jml=0; cout<<" Semua data berhasil dihapus"<<endl; cout<<"-------------------------------------------------"<<endl; } int main() { int pil; Stack tumpukan; itemType data; init(&tumpukan); do { cout<<"Selamat datang di Aplikasi stack"<<endl; cout<<"1. PUSH(Memasukan)"<<endl; II-10 cout<<"2. POP(Mengangkat/Memanggil)"<<endl; cout<<"3. Display(Menampilkan)"<<endl; cout<<"4. Delete(Hapus)"<<endl; cout<<"5. Exit"<<endl; cout<<"Masukkan pilihan : ";cin>>pil; cout<<"-------------------------------------------------"<<endl; switch(pil) { case 1: cout<<"Masukkan data : ";cin>>data; cout<<"-------------------------------------------------"<<endl; isi(data,&tumpukan); break; case 2: ambil(&tumpukan,&data); break; case 3: tampil(&tumpukan); break; case 4: hapus(&tumpukan); break; } } while(pil!=5); cout<<" Terima Kasih"<<endl; cout<<"-------------------------------------------------"<<endl; return 0; } 2. Tampilan Program : Gambar 2.1 Program Implementasi Stack II-11 3. Analisa Program : Pertama user akan menginputkan pilihan, kemudian masuk ke dalam percabangan switch. Setiap pilihan telah diisi dengan fungsi telah di atur di luar fungsi main. Ketika mengeluarkan data yang dikeluarkan adalah dari yang terakhir di inputkan oleh user nantinya. II.4 Tugas praktikum ke-2: Program Implementasi Queue 1. Listing Program : #include <iostream> #define max 8 using namespace std; typedef struct{ int data[max]; int head; int tail; }Queue; Queue antrian; void init(){ antrian.head = -1; antrian.tail = -1; } int kosong(){ if(antrian.tail==-1){ return 1; //data kosong } else{ return 0; //data berisi } } int penuh(){ if(antrian.tail==max-1){ return 1; //data penuh } else{ return 0; //data berisi } } void masuk(){ int data; cout <<"Masukkan bilangan = "; cin >>data; if(penuh()==0){ antrian.tail++; antrian.data[antrian.tail]=data; cout<<"\n"<<antrian.data[antrian.tail]<<" masuk "; } else{ II-12 cout <<"Data penuh"; } } int keluar(){ int i; if(kosong()==1){ cout<<"Kosong cuy"; } else{ int x=antrian.data[antrian.head+1]; for(i=antrian.head;i<antrian.tail;i++){ antrian.data[i]=antrian.data[i+1]; } antrian.tail--; cout <<x <<" berhasil dikeluarkan "; return x; } } void clear(){ init(); cout <<"Data telah dikosongkan"; } void tampil(){ if(kosong()==0){ for(int i=antrian.head+1;i<=antrian.tail;i++){ cout <<antrian.data[i]<<" "; } } else{ cout <<"Data masih kosong"; } } int main(){ int pil; init(); cout<<"*-------------------------------*"<<endl; cout<<"* Q u e u e ( A N T R I A N ) *"<<endl; cout<<"*-------------------------------*"<<endl; do{ cout<<"\n"; cout<<"\n********************************"; cout<<"\n1. Masukkan Data"; cout<<"\n2. Keluarkan Data"; cout<<"\n3. Kosongkan Data"; cout<<"\n4. Cetak Data"; cout<<"\n\nSilahkan Masukan Pilihan Anda ";cin>>pil; cout<<"\n"; switch (pil){ case 1: masuk(); break; case 2: keluar(); : II-13 break; case 3: clear(); break; case 4: tampil(); break; default : cout<<"\n Maaf, Tidak ada dalam pilihan"; } } while(pil>=1 && pil<= 4); return 0; } 2. Tampilan Program : Gambar 2.2 Program Implementasi Queue 3. Analisa Program : Data – data yang dimasukkan oleh user dapat di tampilkan dengan memilih pilihan nomor 4. Jika user memilih mengeluarkan data, maka data di indeks ke dua akan bergeser ke indeks pertama begitupun data yang berada pada indeks ke-2 dan seterusnya akan bergeser ke indeks sebelumnya. II-14 II.5 Tugas Rumah ke-1 : Program Membalikkan Nama mengguakan Stack 1. Listing Program : #include <iostream> #include <cstdlib> #include <cstring> using namespace std; int main(){ char masukkan[30]; int panjang; cout<<"Masukkan kalimat : ";gets (masukkan); cout<<endl; cout<<"Kalimat awal : "<<masukkan; panjang = strlen(masukkan); cout<<"\nDibalik jadi : "; for(int a=panjang; a>=1 ;a--){ char stack = masukkan[a-1]; cout<<stack; } } 2. Tampilan Program : Gambar 2.3 Program Membalikkan Nama Menggunakan Stack 3. Analisa Program : Inputan pada masukkan kalimat adalah menggunakan tipe data char. Agar dapat menginputkan dengan spasi maka harus menggunakan library cstdlib. Strlen digunakan untuk mengetahui berapa jumlah karakter inputan user tadi, kemudian digunakan untuk menampilkan karakter dari yang terakhir sampai ke awal. II-15 II.6 Tugas Rumah ke-2 : Program Antrian Bank 1. Listing Program : #include <iostream> #include <windows.h> using namespace std; struct antri{ int data; }; antri ant[15]; struct identitas{ char nama[20]; }; identitas id[15]; int main(){ int cek=0, y=0; char pil; do { cout<<"\n|| PROGRAM BANK ||"<<endl<<endl; cout<<"1. Masukan Antrian"<<endl; cout<<"2. Proses Antrian"<<endl; cout<<"3. Keluar"<<endl; cout<<endl; cout<<"Masukkan pilihan = "; cin>>pil; cout<<endl; if(pil!='1' && pil !='2' && pil !='3' ){ system("cls"); cout<<"PILIHAN 1 - 3 WOYYY !!!!"<<endl; } else{ if(pil=='1'){ if(cek==15 && y==15){ cout<<"Maaf Antrian Penuh :)"; } cout<<endl; system("cls"); cout<<"Nama\t: "; cin>>id[cek].nama; cout<<endl; cek++; system("cls"); cout<<"Antrian Anda\t:\n\n"; for(int z=0;z<cek;z++){ cout<<"Nomor\t\t: "<<z+1; cout<<endl; cout<<"Nama\t\t: "<<id[z].nama<<endl; cout<<endl<<endl; } cout<<endl<<endl; system("PAUSE"); system("cls"); } else{ II-16 if(pil=='2'){ if(cek==0) cout<<"MASIH KOSONG ASTAGHFIRULLAHH !!!"; else{ for(int v=0;v<cek;v++){ ant[v].data=ant[v+1].data; } cek--; system("cls"); cout<<"\tProses\n\n"; cout<<"Nama\t\t: "<<id[0].nama<<endl<<endl; cout<<"Antrian dengan "<<id[0].nama<<" berhasil di proses"; cout<<endl; { int b; for(b=0;b<cek;b++) id[b]=id[b+1]; b--; } } cout<<endl; system("PAUSE"); system("cls"); } } } }while(pil!='3'); } 2. Tampilan Program : Gambar 2.4 Program Antrian Bank nama II-17 3. Analisa Program : Program Antrian Bank diatas merupakan contoh penerapan queue. Setelah memilih pilihan 1, maka user akan memasukkan data nama dan antrian akan didapatkan secara otomatis. Proses antrian yang dimaksut adalah antrian akan di keluarkan dari antrian yang pertama diinputkan. II.7 Kesimpulan 1. Konsep dari Stack adalah LIFO (Last In First Out) yaitu data yang terakhir dimasukkan adalah data yang pertama keluar dan data yang pertama dimasukkan adalah data yang terakhir keluar. 2. Konsep dari Queue adalah FIFO (First In First Out) yaitu data yang pertama dimasukkan lah yang akan keluar pertama dan data yang terakhir di masukkan akan di keluarkan terakhir juga. 3. Pada Stack sebutan untuk memasukkan data adalah Push dan sebutan untuk mengeluarkan data adalah Pop. Pada Queue sebutan untuk memasukkan data adalah Enqueue dan sebutan untuk mengeluarkan data adalah Dequeue. Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf III-1 BAB III SORTING Jumlah Pertemuan : 2 x 60 menit Tujuan Praktikum : 1. Praktikan dapat memahami pengertian dari Sorting 2. Praktikan mengetahui dan memahami cara kerja dari system sorting 3. Praktikan dapat mengoprasikan atau menerapkan metode sorting Alat / bahan : 1. Perangkat komputer 2. Perangkat lunak: Dev C++ 3. Modul Struktur Data 2019 III.1 Landasan Teori 3.1 Pengertian Sorting dalam arti bahasaa adalah pengelompokan sebuah data yang tersusun secara acak yang kemudian di urutkan secara ascending (urutan naik) maupun discending (urutan turun). Pengurutan data dalam struktur data sangat penting terutama untuk data yang bertipe data numerik ataupun karakter. Metode sorting terdiri dari : 1. Bubble Sort 2. Exchange Sort 3. Insertion Sort 4. Selection Sort 5. Quicksort Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf III-2 3.2 Bubble Sort Bubble adalah metode dalam sorting yang paling mudah logikanya. Diberi nama “Bubble” karena proses pengurutannya berangsur angsur bergerak/berpindah ke posisi yang tepat, seperti gelembung yang keluar dari dalam gelas bersoda. Cara kerja metode ini adalah dengan cara membandingkan elemen sekarang dengan elemen berikutnya. Metode ini seolah – olah menggeser satu elemen dari kanan kekiri atau sebaliknya, tergantung jenis pengurutannya. 3.3 Exchange Sort Exchange adalah metode dalam sorting dimana dikatakan sangat mirip dengan metode sorting Bubble Sort. Namun, Exchange Sort membandingkan suatu elemen dengan elemen – elemen lainnya dalam array tersebut dan melakukan pertukaran elemen jika perlu. Jadi ada elemen yang selalu menjadi elemen pusat (pivot). Sedangkan Bubble Sort akan membandingkan elemen pertama/terakhir dengan elemen sebelumnya/sesudahnya, kemudian elemen tersebut itu akan menjadi pusa (pivot) untuk dibandingkan dengan elemen sebelumnya/sesudahnya lagi, begitu seterusnya. Disitulah dimana letak perbedaan Exchange dan Bubble Sort terletak. 3.4 Insertion Sort Insertion adalah metode dalam sorting dimana logikanya hampir mirip seperti mengurutkan sebuah kartu. Dimana kartu tersebut di urutkan selembar demi selembar. Dalam Insertion pengurutan dimulai dari elemen-2 sampai elemen terakhir, jika ditemukan yang lebih kecil, maka akan ditempatkan pada posisi yang seharusnya. III-3 3.5 Selection Sort Selection adalah metode dalam sorting pengurutan dengan cara elemen terkecil atau terbesar, sesuai permintaan. untuk kemudian dibandingkan & ditukarkan dengan elemen data awal seterusnya sampai dengan seluruh elemen,sehingga akan menghasilkan pola data yang telah di sort. Prinsip Kerja Selection Sort : 1. Pengecekan dimulai data ke-1 sampai dengan data ke-n (missal I & pos) 2. Bandingkan data pos dengan data i+1 (missal j) 3. Jika data pos tidak sesuai dengan kondisi maka pos = j dan j akan selalu bertambah (j++) sampai melewati n. 4. Lakukan langkah 2 dan 3 untuk bilangan berikutya sampai didapatkan urutan yang optimal. 5. Mengecek apakah i != pos jika ya, maka data akan ditukar 6. Lakukan Proses 1 sampai 5 sampai di dapatkan proses ke n-1 3.6 Quick Sort Quicksort adalah metode dalam sorting yang mana adalah pengurutan membandingkan suatu elemen yang disebut pivot ( memilih index tengah dari array ) dengan elemen yang lain dan menyusunnya sedemikian rupa sehingga elemen‐elemen lainnya yang lebih kecil daripada pivot tersebut terletak disebelah kirinya dan elemenelemen lain yang lebih besar daripada pivot terletak disebelah kanannya. Dengan demikian telah terbentuk dua sublist, lalu pada sublist kiri dan sublist kanan anggap sebuah list baru dan kerjakan proses yang sama seperti sebelumnya. Demikian seterusnya sampai tidak terdapat sublist lagi. III-4 Algoritma Quick Sort : 1. Mengecek apakah A [ i ] < tengah - Jika ya, i++ ; Ke langkah 1 - Jika tidak, i = i ; Ke langkah 2 2. Mengecek apak A [ j ] > tengah - Jika ya, j-- ; Ke langkah 2 - Jika tidak, j = j ; Ke langkah 3 3. Mengecek apakah i <= j - Jika ya, tukar A [ i ] dengan A [ j ] i++, j-- ; Ke langkah 4 - Jika tidak, Ke langkah 4 4. Mengecek apakah i > j - Jika ya, Ke langkah 5 - Jika tidak, Ke langkah 1 5. Mengecek apakah L < j - Jika ya, panggil fungsi Quicksort (L , j) - Jika tidak, Ke langkah 6 6. Mengecek apakah i < R - Jika ya, panggil Quicksort (i , R) - Jika tidak, selesai III.2 Langkah-langkah Praktikum 1. Script ditulis dengan menggunakan Dev C++ 2. Script dicompile dengan menggunakan Dev C++ 3. Aplikasi dijalankan dengan menggunakan Dev C++ III-5 III.3 Tugas Praktikum ke-1 : Sorting menggunakan Bubble Sort 1. Listing Program : #include <iostream> using namespace std; main(){ int NumList [5]={3,4,1,8,12}; int temp; cout<<"Data sebelum diurutkan : "; for (int d=0;d < 5;d++){ cout<<" "<<NumList[d]; } cout<<endl<<endl; for(int i=0;i<=3;i++){ cout<< "Proses "<< i+1<< " = "; for(int x=0;x<=3;x++){ if(NumList[x]>=NumList[x+1]){ temp=NumList[x]; NumList[x]=NumList[x+1]; NumList[x+1]=temp; } } for(int y=0;y<5;y++){ cout<<" "<<NumList[y]; } cout<<endl; } cout<<endl; cout<<"Data setelah diurutkan : "; for (int d=0;d < 5;d++){ cout<<" "<<NumList[d]; } } 2. Tampilan Program : Gambar 3.1 Program Sorting menggunakan Bubble Sort III-6 3. Analisa Program : Program diatas adalah contoh sorting menggunakan metode Bubble Sort. Pada proses 1, data pertama (3), lebih besar dari data ke dua (1), maka terjadi pertukaran tempat sehingga data menjadi 1, 3. Begitupun pada proses 2, 3 dan 4. Proses dari Bubble sort adalah banyaknya data – 1. III.4 Tugas Praktikum ke-2 : Sorting menggunakan Exchange Sort 1. Listing Program : #include<iostream> using namespace std; main(){ int data[6]={84,69,76,86,94,91}; int tanda; cout<<"Data Awal : "; for(int a=0;a< 6;a++){ cout<<data[a]<<" "; } cout<<endl<<endl; for(int b=0;b< 5;b++){ cout<<"Proses "<< b+1 << " = "; for(int a=b;a<5;a++){ if(data[b]<data[a+1]){ data[b]=data[b]; } else{ tanda=data[b]; data[b]=data[a+1]; data[b+1]=tanda; } } for(int a=0;a< 6 ;a++){ cout<<data[a]<<" "; } cout<<endl; } } 2. Tampilan Program : Gambar 3.2 Program Sorting menggunakan Exchange Sort III-7 3. Analisa Program : Pertama – tama mendeklarasikan variabel data dengan index array 6 dan di isi dengan data 84, 69, 76, 86, 94, 91. For pertama dimaksudkan untuk menampilkan data dari index array. For kedua adalah For bersarang, digunakan untuk melakukan sorting data nya. III.5 Tugas Praktikum ke-3 : Sorting menggunakan Insertion Sort 1. Listing Program : #include <iostream> using namespace std; main(){ int data[5] = { 20, 34,12,5,60 }; //menampilkan data awal cout<<"Data sebelum di sorting :"; for(int i=0;i<5;i++){ cout<<data[i]<<" "; } cout<<endl; //proses insertion sort int temp,i,j; for(i=1;i<5;i++){ temp = data[i]; for(j = i-1; j >= 0 ; j--){ if ( temp <= data[j]){ data[j+1] = data[j]; data[j] = temp; temp = data[j]; } } cout<<"Proses "<< i << " = "; for(int x=0;x<5;x++){ cout<<data[x]<<" "; } cout<<endl; } } 2. Tampilan Program : Gambar 3.3 Program Sorting menggunakan Insertion Sort III-8 3. Analisa Program : Program diatas adalah program sorting menggunakan metode Insertion Sort. Sorting seperti gabungan dari Bubble Sort dan Exchange Sort. Proses pengurutan dimulai dari indeks ke-2 yaitu data 34 akan ditukar dengan data 20. Pertukaran akan dilakukan jika memang perlu dan seterusnya hingga data yang paling akhir III.6 Tugas Praktikum ke-4 : Sorting menggunakan Selection Sort 1. Listing Program : #include <iostream> using namespace std; main(){ int data[6]={32,75,69,58,21,40}; int i,pos,j,temp; i=0; pos=0; j=1; cout<<"Data Awal : "; for(int x=0;x<=5;x++){ cout<<data[x]<<" "; } cout<<endl; for(int z=0;z<=4;z++){ i=z; pos=z; j=z + 1; while (j < 6){ if(data[j]<data[pos]){ pos = j; j = j+1; } else{ pos = pos; j = j+1; } } if(pos!=i){ temp=data[pos]; data[pos]=data[i]; data[i]=temp; } cout<<"Proses "<<z+1<<" = "; for(int x=0;x<=5;x++){ cout<<data[x]<<" "; } cout<<endl; } } III-9 2. Tampilan Program : Gambar 3.4 Program Sorting menggunakan Selection Sort 3. Analisa Program : Program diatas adalah program sorting dengan menggunakan metode Selection Sort. For pertama digunakan untuk menampilkan data pada index array, kemudian for kedua digunakan untuk melakukan proses sorting nya III.7 Tugas Praktikum ke-5 : Sorting menggunakan Quick Sort 1. Listing Program : #include <iostream> using namespace std; int data[5] = { 23, 13, 45, 89,50 }; void QuickSort(int L, int R){ //the best sort i've ever had :) int i, j; int mid; i = L; j = R; mid = data[(L+R) / 2]; do{ while(data[i] < mid) i++; //selama nilai Data[i] lebih kecil daripada nilai Mid maka i bertambah 1 while (data[j] > mid) j--; //selama nilai Data[j] lebih besar daripada nilai Mid makan j berkurang 1 if (i <= j){ //jika I <= J maka data ditukar.. int t; t = data[j]; data[j] = data[i]; data[i] = t; i++; III-10 j--; cout<<"Quicksort ( "<<L<<", "<<R<<" ) = "; for(int i=0;i<5;i++){ cout<<data[i]<<" "; } cout<<endl; } } while (i < j); //melakukan perulangan selama I lebih kecil daripada J if (L < j) QuickSort(L, j); if (i < R) QuickSort(i, R); } main(){ cout<<" Proses Quick Sort"<<endl; cout<<"------------------------------------- "<<endl; cout<<"Data awal : "; for(int i=0;i<5;i++){ cout<<data[i]<<" "; } cout<<endl; QuickSort(0,4); } 2. Tampilan Program : Gambar 3.5 Program Sorting menggunakan Quick Sort 3. Analisa Program : Program diatas adalah program sorting menggunakan metode Quick Sort. Variabel data merupakan variabel array berisi data 23, 13,45,89, 50. Proses pertukaran data terjadi pada perulangan do-while selama I < j III-11 III.8 Tugas Rumah ke-1 : Program mengurutkan Data Aslab 1. Listing Program : #include <iostream> using namespace std; int main(){ string nama[40]; int nim[20]; int banyak_aslab,tukar_nim; string tukar_nama; cout<<"\tLab. RPL ITN Malang"<<endl; cout<<"Masukkan Data Aslab RPL"<<endl; cout<<"Banyak Aslab : ";cin>>banyak_aslab; cout<<"==============================="<<endl; for(int a=0; a<banyak_aslab; a++){ cout<<"Data Aslab ke-"<<a+1<<endl; cout<<"NIM\t: ";cin>>nim[a]; cout<<"NAMA\t: ";cin>>nama[a]; cout<<"---------------------"<<endl; } for(int x=0; x<banyak_aslab; x++){ for(int y=0; y<banyak_aslab; y++){ if(nim[y] > nim[y+1]){ tukar_nim = nim[y]; nim[y] = nim[y+1]; nim[y+1] = tukar_nim; tukar_nama = nama[y]; nama[y] = nama[y+1]; nama[y+1] = tukar_nama; } else{ nim[y] = nim[y]; } } } cout<<endl; cout<<"Data setelah diurutkan :"<<endl; for(int n=0; n<banyak_aslab; n++){ cout<<nim[n]<<" "<<nama[n]<<endl; } } III-12 2. Tampilan Program : Gambar 3.6 Program mengurutkan Data Aslab 3. Analisa Program : Program diatas merupakan Sorting dengan menggunakan metode Bubble Sort. Nama menggunakan variabel “nama” dengan tipe data string dan NIM menggunakan variabel “nim” dengan tipe data integer. Dengan menambahkan variabel “tukar_nim” dan “tukar_nama”, data dapat ditukar dengan memanfaatkan variabel tersebut yang cara kerjanya adalah data di simpan pada variabel tersebut kemudian di letakkan pada variabel nim dan nama yang diininkan user III-13 III.9 Tugas Rumah ke-2 : Program Sorting menggunakan Quick Sort 1. Listing Program : #include <iostream> using namespace std; int data[6] = {53,30,82,3,20,44}; void QuickSort(int L,int R){ int x,y; int mid; x = L; y = R; mid = data[(L + R)/2]; do{ while (data[x] < mid){ x++; } while (data[y] > mid){ y--; } if(x <= y){ int z; z = data[y]; data[y] = data[x]; data[x] = z; x++; y--; cout<<"QuickSort ("<<L<<", "<<R<<") = "; for(int x=0; x<6; x++){ cout<<data[x]<<" "; } cout<<endl; } } while(x < y); if(L < y){ QuickSort(L,y); } if(x < R){ QuickSort(x,R); } } main(){ cout<<" Proses Quick Sort"<<endl; cout<<endl<<endl; cout<<"Data awal : "; for(int b=0; b<6; b++){ cout<<data[b]<<" "; } cout<<endl; QuickSort(0,5); } III-14 2. Tampilan Program : Gambar 3.7 Program Sorting menggunakan Quick Sort 3. Analisa Program : Program diatas adalah menggunakan metode sorting QuickSort. QuickSort menggunakan variabel untuk index kiri (L), index kanan (R) dan mid ((L+R)/2). Proses pengurutan / pertukaran data adalah pada perulangan do-while nya. Tetapi hanya selama x < y do akan tetap dijalankan III.10 Kesimpulan 1. Sorting dalam C++ terdiri dari 5 macam sort yaitu Bubble Sort, Exchange Sort, Insertion Sort, Selection Sort dan Quick Sort. 2. Sorting adalah pengelompokan sejumlah data yang tersusun secara acak kemudian diurutkan secara Ascending maupun Descending 3. Selection Sort adalah metode dalam sorting pengurutan dengan cara elemen terkecil atau terbesar, sesuai permintaan. Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf IV-1 BAB IV SEARCHING Jumlah Pertemuan : 2 x 60 menit Tujuan Praktikum : 1. Praktikan dapat memahami pengertian dari Searching 2. Agar Praktika mengetahui dan memahami cara kerja dari system Searching 3. Praktikan dapat mengoprasikan atau menerapkan metode Searching Alat / bahan : 1. Perangkat komputer 2. Perangkat lunak: Dev C++ 3. Modul Struktur Data 2019 IV.1 Landasan Teori 4.1 Pengertian Algoritma pencarian (searching algorithm) adalah algoritma yang menerima sebuah argumen kunci dan dengan langkah-langkah tertentu akan mencari rekaman dengan kunci tersebut. Setelah proses pencarian dilaksanakan, akan diperoleh salah satu dari dua kemungkinan, yaitu data yang dicari berhasil ditemukan (successful) atau data yang kita cari tersebut tidak berhasil ditemukan (unsuccessful). Ada beberapa macam teknik pencarian seperti pencarian sekuensial dan pencarian biner. Perbedaan dari dua teknik ini terletak pada keadaan data. Pencarian sekuensial digunakan apabila data dalam keadaan acak atau tidak terurut (contoh: sequential search). Sebaliknya, pencarian biner digunakan pada data yang sudah dalam keadaan urut (contoh: Binary serach dan interpolation search). Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf IV-2 4.2 Sequential Searching (Pencarian Berurutan) Pencarian berurutan sering disebut pencarian linear merupakan metode pencarian yang paling sederhana. Pencarian berurutan menggunakan prinsip sebagai berikut : data yang ada akan dibandingkan satu per satu secara berurutan dengan data yang dicari sampai data tersebut ditemukan atau tidak ditemukan. Pada dasarnya, pencarian ini hanya melakukan pengulangan dari 1 sampai dengan jumlah data. Pada setiap pengulangan, setiap data akan dibandingkan dengan yang dicari. Apabila sama, berarti data telah ditemukan, sebaliknya apabila sampai akhir pengulangan tidak ada data yang sama, berarti data tidak ditemukan. Pada kasus yang paling buruk, apabila terdapat n data maka harus dilakukan pencarian sebanyak n kali pula. Algoritma pencarian Berurutan dapat dituliskan sebagai berikut : 1. i ← 0 2. Jika (data[i] = x) maka data ditemukan, melanjutkan ke langkah 3 3. Selama (i ≤ n) kerjakan langkah 4 4. i = j + 1, melanjutkan ke langkah ke 5 5. Kembali ke langkah 2 i = Posisi Data x = Data yang dicari n = Jumlah data yang tersedia 4.3 Binary Search Salah satu syarat agar pencarian biner dapat dilakukan adalah data yang tersedia sudah dalam keadaan urut. Dengan kata lain, apabila data belum dalam keadaan urut, pencarian biner tidak dapat dilakukan. Dalam kehidupan sehari-hari, sebenarnya kita juga sering menggunakan pencarian biner. Misalnya saat ingin mencari suatu kata dalam kamus, Algoritma dari pencarian biner dapat dijelaskan sebagai berikut : IV-3 Inisialisasi awal : Kiri = 0, Kanan = n (index terakhir dari array), flag = 0 1. Mengecek apakah (kiri <= kanan && flag 0) - Jika ya, Ke langkah 2 - Jika tidak, Ke langkah 6 2. Menghitung nilai tengah = (kiri + kanan) / 2 3. Mengecek apakah cari == data [ tengah ] - Jika ya, flag = 1. Ke langkah 6 - Jika tidak, Ke langkah 4 4. Mengecek apakah cari < data [ tengah ] - Jika ya, Kanan = tengah – 1. Ke langkah 1 - Jika tidak ke langkah 5 5. Mengecek apakah cari > data [ tengah ] - Jika ya, Kiri = tengah + 1. Ke langkah 1 - Jika tidak, Ke langkah 1 6. Mengecek apakah flag == 1 - Jika ya, data di temukan - Jika tidak, data tidak ditemukan 4.4 Interpolation Search Teknik ini dilakukan pada data yang sudah terurut berdasarkan kunci tertentu. Teknik searching ini dilakukan dengan perkiraan letak data. Contoh ilustrasi : jika kita hendak mencari suatu kata dalam buku telepon, misal yang berawalan dengan huruf J, maka kita tidak akan mencarinya dari awal buku, tetapi kita langsung membukanya pada 1/3 atau 1/4 dari tebal buku tersebut. IV-4 Algoritma Interpolation Search : 1. Mengecek apakah ( cari >= data[low] && cari <= data[high]) - Jika ya, Ke langkah 2 - Jika tidak, Ke langkah 6 2. Mencari nilai posisi = cari – data[low] / data[high] – data[low] x (high – low) + low, Pos = Pembulatan kebawah dari posisi 3. Mengecek apakah (data[pos] == cari) - Jika ya, Flag = 1. Ke langkah 6 - Jika tidak, Ke langkah 4 4. Mengecek apakah (data[pos] > cari) - Jika ya, High = pos – 1. Ke langkah 1 - Jika tidak, Ke langkah 5 5. Mengecek apakah (data[pos] < cari) - Jika ya, low = pos + 1. Ke langkah 1 - Jika tidak, Ke langkah 1 6. Mengecek apakah (flag == 1) - Jika ya, data ditemukan - Jika tidak, data tidak ditemukan IV.2 Langkah-langkah Praktikum 1. Script ditulis dengan menggunakan Dev C++ 2. Script dicompile dengan menggunakan Dev C++ 3. Aplikasi dijalankan dengan menggunakan Dev C++ IV-5 IV.3 Tugas Praktikum ke-1 : Program Implementasi Sequential Search 1. Listing Program : #include <iostream> using namespace std; main(){ // Sequential Search int data[8] = {1,5,34,56,-9,80,23,7}; int cari; int index; int flag = 0; cout<<"+=================================+\n"; cout<<"\tPROGRAM SEARCHING\n"; cout<<"+=================================+\n\n"; cout<<"Data : "; for(int a=0; a<8; a++){ cout<<data[a]<<" "; } cout<<endl<<endl; cout<<"Masukkan data yang ingin dicari : ";cin>>cari; cout<<endl; for(int x=0; x<8; x++){ if(data[x] == cari){ flag = 1; } } if(flag == 1){ cout<<"===================================\n"; cout<<"\tData Ditemukan\n"; cout<<"===================================\n"; } else{ cout<<"===================================\n"; cout<<"\tData Tidak Ditemukan\n"; cout<<"===================================\n"; } } 2. Tampilan Program : Gambar 4.1 Program Implementasi Sequeantial Search IV-6 3. Analisa Program : Program diatas merupakan program searching dengan menggunakan metode Sequential Searching. Data cari akan dibandingkan dengan data di setiap index. Pertama dibandingkan dengan data 1, kemudian data 5 dan seterusnya hingga ke seluruh indeks. IV.4 Tugas Praktikum ke-2 : Program Implementasi Binary Search 1. Listing Program : #include <iostream> using namespace std; main(){ int data[10] = {11,24,38,46,58,64,78,88,89,95}; int cari, awal=0, akhir=9, tengah; int flag = 0; cout<<"+================================+ \n"; cout<<" PROGRAM SEARCHING \n"; cout<<"+================================+ \n\n"; cout<<"Data : "; for(int a=0; a<=9;a++){ cout<<data[a]<< " "; } cout<<"\n\nMasukkan data yang dicari : "; cin>>cari; while (awal <= akhir && flag == 0){ tengah = (awal + akhir)/2; if ( cari == data [ tengah ] ){ flag = 1; break; } else if (cari < data[tengah]){ akhir= tengah - 1; } else if (cari > data[tengah] ){ awal = tengah + 1; } } if ( flag == 1 ){ cout<<"\nData ditemukan "<<endl; } else{ cout<<"\nData tidak ditemukan "<<endl; } } IV-7 2. Tampilan Program : Gambar 4.2 Program Implementasi Binary Search 3. Analisa Program : Program diatas adalah program searching menggunakan metode Binary Search. Dapat dilakukan hanya jika data telah terirut seperti data diatas. Data cari = 30, maka yang dilakukan Searching hanya pada data sebelah kiri. IV.5 Tugas Praktikum ke-3 : Program Implementasi Interpolation Search 1. Listing Program : #include <iostream> #include <cmath> using namespace std; main(){ int data[8] = {10,12,36,44,50,57,70,72}; int low, high, cari, pos, tanda = 0; float pos1; int N = 8; low = 0; high = N - 1; cout << "Data : " << endl; for (int x = 0; x <= 7; x++){ cout << " " << data[x]; } cout<<endl; cout << "=================================" << endl; cout << "Masukkan Data Yang Ingin Dicari : "; cin >> cari; do{ IV-8 pos1 = ((cari-data[low])/(data[high]data[low]))*((high - low)+low); pos = floor(pos1); //pembulatan nilai kebawah if (data[pos] == cari){ tanda = 1; break; } if (data[pos] > cari){ high = pos - 1; } else if (data[pos] < cari ){ low = pos + 1; } } while (cari >= data[low] && cari <= data[high]); if (tanda == 1){ cout << ":: Data Ditemukan ::" << endl; } else{ cout << ":: Data Tidak Ditemukan :: " << endl; } } 2. Tampilan Program : Gambar 4.3 Program Implementasi Interpolation Search 3. Analisa Program : Program diatas merupakan program searching dengan menggunakan metode Interpolation Search. Variabel pos diatas digunakan untuk pembulatan kebawah. Kemudian pos akan dibandingkan dengan data cari (10), apabila data pos sama dengan 10. Maka tanda akan bernilai 1 IV-9 IV.6 Tugas Rumah ke-1 : Program Mencari Data Aslab 1. Listing Program : #include <iostream> using namespace std; struct data{ int nim[10]; string nama[10]; int hasil_nim; string hasil_nama; }; data aslab; main(){ int banyak_aslab; int cari; int flag = 0; cout<<"\tLab Rpl ITN Malang"<<endl; cout<<"Masukkan Data Aslab RPL"<<endl; cout<<"Banyak Aslab : ";cin>>banyak_aslab; cout<<"==================================="<<endl; for(int a=0; a<banyak_aslab; a++){ cout<<"Data Aslab ke-"<<a+1<<endl; cout<<"NIM\t: ";cin>>aslab.nim[a]; cout<<"NAMA\t: ";cin>>aslab.nama[a]; cout<<"----------------------\n"; } cout<<endl; cout<<"Masukkan NIM yang ingin dicari : "; cin>>cari; for(int n=0; n<banyak_aslab; n++){ if(aslab.nim[n] == cari){ flag = 1; aslab.hasil_nim = aslab.nim[n]; aslab.hasil_nama = aslab.nama[n]; } } if(flag == 1){ cout<<"=============================\n"; cout<<"\tData ditemukan"<<endl; cout<<"\t"<<aslab.hasil_nim<<" "<<aslab.hasil_nama; cout<<"\n=============================\n"; } else if(flag == 0){ cout<<"=====================================\n"; cout<<"\tData tidak ditemukan"<<endl; cout<<"=====================================\n"; } } IV-10 2. Tampilan Program : Gambar 4.4 Program Mencari Data Aslab 3. Analisa Program : Program diatas merupakan Searching, dibuat dengan menggunakan metode Sequential Searching. Banyaknya aslab sifatnya dinamis, tergantung pada berapa user menginputkan. Dalam Sequential Searching, terdapat variabel flag untuk memberi tanda apakah data ditemukan atau tidak. Data tiap indeks akan dibandingkan dengan data yang dicari. Apabila data yang dicari ketemu, maka flag akan bernilai 1. IV-11 IV.7 Kesimpulan 1. Searching dalam C++ terbagi menjadi 3 metode yaitu Sequential Search, Binary Search dan Interpolation Search 2. Sequential Search adalah proses pencarian data dengan membandingkan data yang ada satu per satu secara berurutan dengan data yang dicari 3. Binary Search dan Interpolation Search adalah metode Searching yang bisa dilakukan hanya saat data telah diurutkan terlebih dahulu Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf V-1 BAB V LINKED LIST Jumlah Pertemuan : 2 x 60 menit Tujuan Praktikum : 1. Praktikan dapat memahami pengertian dari linked list 2. Praktikan dapat mengetahui dan memahami cara kerja dari system Linked List 3. Praktikan dapat mengoprasikan atau menerapkan metode Linked List Alat / bahan : 1. Perangkat komputer 2. Perangkat lunak: Dev C++ 3. Modul Struktur Data 2019 V.1 Landasan Teori 5.1 Pengertian Linked list adalah sekumpulan elemen dari data yang bertipe sama yang saling terurut dan terhubung dengan bantuan variabel pointer, yang setiap data didalamnya disebut node ( simpul ) menempati alokasi memorat secara dinamis dan biasanya berupa struct yang terdiri dari beberapa field. Linked list juga merupakan suatu cara untuk menyimpan data dengan struktur sehingga dapat secara otomatis menciptakan suatu tempat baru untuk menyimpan data yang diperlukan Perbandingan Array dengan Linked List Array Linked List Statis Dinamis Penambahan / Penghapusan data Penmbahan / Penghapusan data tidak terbatas terbatas Penghapusan mungkin Array tidak Penghapusan Linked List mudah Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf V-2 5.2 Single Linked List Single linked list merupakan linked list yang field pointer-nya hanya satu buah saja dan satu arah. Serta pada akhir node, pointernya menunjuk NULL. 5.2.1 Jenis Single Linked List 1. Single Linked list dengan head 2. Single Linked list dengan head dan tail 5.2.2 Deklarasi Single Linked List 1. Deklarasi Node Pendeklarasian Node pada single link list menggunakan struct dengan 2 buah field, yaitu field untuk menyimpan data dan field yang bertipe pointer dari untuk menyimpan alamat dari node selanjutnya. Setelah itu membuat variabel yang bernama node yang digunakan kunci untuk mengakses struct TNode. Struct Node{ int data; Node *next; }; 2. Pembuatan Node baru Node *baru; baru=new Node; baru->data=databaru; baru->next=NULL Penjelasan : Keyword new berguna untuk mempersiapkan sebuah node baru beserta alokasi memorinya, kemudian node tersebut diisi data dan pointer nextnya ditunjuk ke NULL. V-3 5.3 Double Linked List Double linked list adalah linked list yang filed pointernya 2 arah, ke node sebelum dan sesudahnya. Double linked list memiliki 3 buah field dalam 1 node yaitu, 1 untuk menyimpan data dan 2 untuk pointer ( next dan prev ). Pointer next menunjuk pada node setelahnya dan prev menunjuk pada node sebelumnya. 5.3.1 Jenis Double Linked List 1. Double Linked List menggunakan Head 2. Double Linked List menggunakan Head dan Tail 5.3.2 Deklarasi Double Linked List 1. Deklarasi Node struct Node{ int data; Node *next; Node *prev; } 2. Pembuatan Node baru Node *baru; baru=new Node; baru->data=databaru; baru->next=NULL; baru->prev=NULL V.2 Langkah-langkah Praktikum 1. Script ditulis dengan menggunakan Dev C++ 2. Script dicompile dengan menggunakan Dev C++ 3. Aplikasi dijalankan dengan menggunakan Dev C++ V-4 V.3 Tugas Praktikum ke-1 : Single Linked List 1. Listing Program : #include <iostream> using namespace std; struct Node{ int data; Node *next; }; Node *head; int cek(){ if(head==NULL){ return 0; } else{ return 1; } } void tambahdepan(int databaru){ Node *baru; baru=new Node; baru->data=databaru; baru->next=NULL; if (cek==0){ head=baru; head->next=NULL; } else{ baru->next=head; head=baru; } cout<<"Penambahan Data Berhasil \n"<<endl; } void tambahbelakang(int databaru){ Node *baru; Node *temp; baru=new Node; baru->data=databaru; baru->next=NULL; if(cek()==0){ head=baru; head->next=NULL; } else{ temp=head; while (temp->next!=NULL){ temp=temp->next; } temp->next=baru; } cout<<"Penambahan Data Berhasil \n"<<endl; V-5 } void hapusDepan(){ Node *hapus; int cap; if (cek()==1){ if(head->next != NULL){ hapus = head; cap = hapus->data; head = head->next; delete hapus; } else{ cap = head->data; head = NULL; } cout<<"Data "<<cap<<" terhapus\n\n"; } else cout<<"Masih kosong\n"; } void hapusBelakang(){ Node *hapus,*temp; int cap; if (cek()==1){ if(head->next != NULL){ temp = head; while(temp->next->next!=NULL){ temp = temp->next; } hapus = temp->next; cap = hapus->data; temp->next = NULL; delete hapus; } else{ cap = head->data; head = NULL; } cout<<"Data "<<cap<<" terhapus\n\n"; } else cout<<"Masih kosong\n"; } void tampil(){ Node *temp; temp=head; if (cek==0){ cout<<"Data Masih Kosong"; } else if(temp==NULL){ cout<<"Data Masih Kosong"<<endl; } else{ while(temp!=NULL){ cout<<temp->data<<" "; temp=temp->next; } } V-6 } main(){ int pilihan, data; do{ cout<<"Single Linked List dengan Head"<<endl; cout<<"1. Masukkan Data dari Depan"<<endl; cout<<"2. Masukkan Data dari Belakang"<<endl; cout<<"3. Hapus Data dari Depan"<<endl; cout<<"4. Hapus Data dari Belakang"<<endl; cout<<"5. Tampilkan Data"<<endl; cout<<"6. Keluar"<<endl; cout<<"Masukkan Pilihan Anda : "; cin>>pilihan; if (pilihan == 1 ){ cout<<"Masukkan Data = "; cin>>data; tambahdepan(data); } else if (pilihan == 2 ){ cout<<"Masukkan Data = "; cin>>data; tambahbelakang(data); } else if (pilihan == 3 ){ hapusDepan(); cout<<endl; } else if (pilihan == 4 ){ hapusBelakang(); cout<<endl; } else if (pilihan == 5 ){ tampil(); cout<<endl<<endl; } else if (pilihan == 6 ){ cout<<"Keluar dari program"; } else{ cout<<"Pilihan tidak tersedia... \n\n"; } } while(pilihan!=6); } V-7 2. Tampilan Program : Gambar 5.1 Program Single Linked List 3. Analisa Program : Fungsi cek digunakan untuk mengecek apakah head bernilai NULL atau tidak. Akan mereturnkan 0 jika head = NULL dan akan mereturnkan 1 jika head tidak NULL / ada isinya. Struct Node berisi elemen int data dan *next dengan tipe data Node. V.4 Tugas Praktikum ke-2 : Double Linked List Input Data 1. Listing Program : #include <iostream> using namespace std; struct Node { int data; Node *next; Node *prev; }; Node *head; V-8 int cek() { if(head == NULL) { return 0; } else { return 1; } } void tambahdepan(int databaru) { Node *baru; baru = new Node; baru->data = databaru; baru->next = NULL; baru->prev = NULL; if(cek()==0) { head=baru; head->next = NULL; head->prev = NULL; } else { baru->next = head; head->prev = baru; head = baru; } cout<<"Data ditambahkan \n"<<endl; } main() { int pilihan, data; do { cout<<"Double Linked List Dengan Head"<<endl; cout<<"1. Masukkan Data dari Depan"<<endl; cout<<"2. Keluar"<<endl; cout<<"Masukkan Pilihan Anda = "; cin>>pilihan; if (pilihan == 1) { cout<<"Masukkan Data = "; cin>>data; tambahdepan(data); } else if(pilihan ==2) { cout<<"keluar dari program..."; } else { cout<<"pilihan tidak tersedia... \n\n"; } } while(pilihan!=2); } V-9 2. Tampilan Program : Gambar 5.2 Program Double Linked List Input Data 3. Analisa Program Pertama – tama membuat sebuah fungsi cek yang digunakan untuk mengecek apakah head berisi data atau NULL. Kemudian membuat fungsi tambahdepan untuk memasukkan data. Pada fungsi main pilihan 1 berisi fungsi tambahdepan yang telah dibuat sebelumnya V.5 Tugas Rumah ke-1 : Menampilkan Hubungan Orang tua Anak 1. Listing Program : #include <iostream> using namespace std; struct Node{ string data; Node *next; }; Node *head; V-10 int cek(){ if(head==NULL){ return 0; } else{ return 1; } } void tambahdepan(string databaru){ Node *baru; baru=new Node; baru->data=databaru; baru->next=NULL; if (cek==0){ head=baru; head->next=NULL; } else{ baru->next=head; head=baru; } cout<<"Berhasil diinput\n"<<endl; } void tambahbelakang(string databaru){ Node *baru; Node *temp; baru=new Node; baru->data=databaru; baru->next=NULL; if(cek()==0){ head=baru; head->next=NULL; } else{ temp=head; while (temp->next!=NULL){ temp=temp->next; } temp->next=baru; } cout<<"Berhasil diinput\n"<<endl; } void hapusDepan(){ Node *hapus; string cap; if (cek()==1){ if(head->next != NULL){ hapus = head; cap = hapus->data; head = head->next; delete hapus; } else{ cap = head->data; head = NULL; V-11 } cout<<cap<<" terhapus\n\n"; } else cout<<"Masih kosong\n"; } void hapusBelakang(){ Node *hapus,*temp; string cap; if (cek()==1){ if(head->next != NULL){ temp = head; while(temp->next->next!=NULL){ temp = temp->next; } hapus = temp->next; cap = hapus->data; temp->next = NULL; delete hapus; } else{ cap = head->data; head = NULL; } cout<<cap<<" terhapus\n\n"; } else cout<<"Masih kosong\n"; } void tampil(){ Node *temp; temp=head; if (cek==0){ cout<<"Data Masih Kosong"; } else if(temp==NULL){ cout<<"Data Masih Kosong"<<endl; } else{ while(temp!=NULL){ cout<<temp->data<<"-->"; temp=temp->next; } } } main(){ int pilihan; string data; do{ cout<<"Program Hubungan Orang Tua Anak"<<endl; cout<<"1. Masukkan dari Depan"<<endl; cout<<"2. Masukkan dari Belakang"<<endl; cout<<"3. Hapus dari Depan"<<endl; cout<<"4. Hapus dari Belakang"<<endl; cout<<"5. Tampilkan"<<endl; cout<<"6. Keluar"<<endl; cout<<"Masukkan Pilihan Anda : "; cin>>pilihan; V-12 if (pilihan == 1 ){ cout<<"Masukkan Nama = "; cin>>data; tambahdepan(data); } else if (pilihan == 2 ){ cout<<"Masukkan Nama = "; cin>>data; tambahbelakang(data); } else if (pilihan == 3 ){ hapusDepan(); cout<<endl; } else if (pilihan == 4 ){ hapusBelakang(); cout<<endl; } else if (pilihan == 5 ){ tampil(); cout<<endl<<endl; } else if (pilihan == 6 ){ cout<<"Keluar dari program"; } else{ cout<<"Pilihan tidak tersedia... \n\n"; } } while(pilihan!=6); } 2. Tampilan Program : Gambar 5.3 Program Menampilkan Hubungan Orang tua Anak V-13 3. Analisa Program : Pertama tama membuat beberapa procedure dengan nama tambahdepan, tambahbelakang, hapusdepan, hapus belakang dan tampil. Procedure tambahdepan dipanggil saat user menginputkan 1, tambahbelakang dipanggil saat user menginputkan 2, hapusdepan saat menginputkan 3, hapusbelakang saat menginputkan 4 dan tampil saat menginputkan 5. V.6 Tugas Rumah ke-2 : Implementasi Double Linked List 1. Listing Program : #include <iostream> using namespace std; struct Node { int data; Node *next; Node *prev; }; Node *head; int cek() { if(head == NULL) { return 0; } else { return 1; } } void tambahdepan(int databaru) { Node *baru; baru = new Node; baru->data = databaru; baru->next = NULL; baru->prev = NULL; if(cek()==0) { head=baru; head->next = NULL; head->prev = NULL; } else { V-14 baru->next = head; head->prev = baru; head = baru; } cout<<"Data ditambahkan \n"<<endl; } void tambahbelakang (int databaru) { Node *baru,*temp; baru = new Node; baru->data = databaru; baru->next = NULL; baru->prev = NULL; if(cek()==0) { head=baru; head->next = NULL; head->prev = NULL; } else { temp=head; while(temp->next!=NULL) { temp=temp->next; } temp->next = baru; baru->prev = temp; } cout<<"Data ditambahkan \n" << endl; } void tampil() { Node *temp; temp = head; if(cek()==1) { while(temp!=NULL) { cout<<temp->data<< ends; temp=temp->next; } cout<<endl<<endl; } else cout<<"Tidak ada data \n" << endl; } void hapusdepan() { Node *hapus; int cap; if (cek()==1) { if(head->next != NULL) { hapus = head; cap = hapus->data; head = head->next; V-15 head->prev = NULL; delete hapus; } else { cap = head->data; head = NULL; } cout<<"Data "<<cap<<" terhapus" << endl; } else { cout<<"Tidak ada data \n" << endl; } } void hapusbelakang() { Node *hapus; int cap; if (cek()==1) { if(head->next != NULL) { hapus = head; while(hapus->next!=NULL) { hapus = hapus->next; } cap = hapus->data; hapus->prev->next = NULL; delete hapus; } else { cap = head->data; head = NULL; } cout<<"Data "<<cap<<" terhapus\n"; } else { cout<<"Tidak ada data \n"; } } main() { int pilihan, data; do { cout<<"Double Linked List Dengan Head"<<endl; cout<<"1. Masukkan Data dari Depan"<<endl; cout<<"2. Masukkan Data dari Belakang"<<endl; cout<<"3. Tampilkan Data"<<endl; cout<<"4. Hapus Data dari Depan"<<endl; cout<<"5. Hapus Data dari Belakang"<<endl; cout<<"6. Keluar"<<endl; cout<<"Masukkan Pilihan Anda = "; cin>>pilihan; V-16 if (pilihan == 1) { cout<<"Masukkan Data = "; cin>>data; tambahdepan(data); } else if(pilihan ==2) { cout<<"Masukkan Data = "; cin>>data; tambahbelakang(data); } else if(pilihan ==3) { tampil(); } else if(pilihan ==4) { hapusdepan(); cout<<endl; } else if(pilihan ==5) { hapusbelakang(); cout<<endl; } else if(pilihan ==6) { cout<<"keluar dari program..."; } else { cout<<"pilihan tidak tersedia... \n\n"; } } while(pilihan!=6); } 2. Tampilan Program : Gambar 5.4 Program Implementasi Double Linked List V-17 3. Analisa Program : Program diatas merupakan Double Linked List. Dalam struct Node terdapat elemen int data, *next dan *prev yang menggunakan tipe data Node. Di dalam fungsi main, dibuat menu pilihan menggunakan perulangan do-while yang setiap menunya sudah berisi procedure nya masing – masing. V.6 Kesimpulan 1. Linked List terbagi menjadi 2 yaitu Single Linked List, yang hanya memiliki data dan *next pada Node dan Double Linked List, yang memiliki *prev, data dan *next pada Node. 2. Linked List adalah sekumpulan elemen dari data yang bertipe sama yang saling terurut dan terhubung dengan bantuan variabel pointer 3. Linked List dengan Array merupakan 2 hal yang berbeda. Contoh perbedaannya adalah Array bersifat Statis sedangkan Linked List bersifat dinamis Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf VI-1 BAB VI TREE Jumlah Pertemuan : 2 x 60 menit Tujuan Praktikum : 1. Praktikan dapat memahami Pengertian dari Tree 2. Praktikan mengetahui dan memahami cara kerja dari system Tree 3. Praktikan dapat mengoprasikan atau menerapkan metode Tree Alat / bahan : 1. Perangkat komputer 2. Perangkat lunak: Dev C++ 3. Modul Struktur Data 2019 VI.1 Landasan Teori (Tree) 6.1 Pengertian Tree Tree merupakan salah satu bentuk struktur data tidak linear yang menggambarkan hubungan yng bersifat hirarkis (hubungan one to many) antara elemen – elemen. Tree bisa didefinisikan sebagai kumpulan node yang saling terhubung satu sama lain dalam suatu kesatuan yang membentuk layaknya struktur sebuah pohon. Struktur pohon adalah suatu cara mempresentasikan suatu struktur hirarki (one to many) secara grafis yang mirip sebuah pohon, walaupun pohon tersebut hanya tampak sebagai kumpulan node – node dari atas ke bawah. Suatu struktur data yang tidak linier yang menggambarkan hubungan yang hirarkis (one to many) dan tidak linier antara elemen – elemennya. Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf VI-2 6.2 Istilah Dalam Tree Istilah – istilah dalam Tree Predecesor Node yang berada diatas node tertentu Successor Node yang berada di bawah node tertentu Ancestor Seluruh node yang terletak sebelum node tertentu dan terletak pada jalur yang sama Descendant Seluruh node yang terletak setelah node tertentu dan terletak pada jalur yang sama Parent Predecessor satu level di atas suatu node Child Sucessor satu level di bawah suatu node Sibling Node – node yang memiliki parent yang sama Subtree Suatu node beserta descendantnya Size Banyaknya node dalam suatu tree Height Banyaknya tingkatan dama suatu tree Root Node khusus yang tidak memiliki predecessor Leaf Node – node dalam tree yang i=tidak memiliki successor Degree Banyaknya child dalam suatu node 6.3 Binary Tree Binary Tree adalah tree dengan syarat bahwa tiap node hanya boleh memiliki maksimal dua subtree dan kedua subtree tersebut harus terpisah. Sesuai dengan definisi tersebut tiap node dalam binary tree hanya boleh memiliki paling banyak dua child. VI-3 Jenis – jenis binary tree : a) Full Binary Tree Binary Tree yang tiap nodenya (kecuali leaf) memiliki dua child dan tiap subtree harus mempunyai panjang path yang sama. b) Complete Binary Tree Mirip dengan Full Binary Tree, namun tiap subtree boleh memiliki panjang path berbeda. Node kecuali leaf memiliki 0 atau 2 child. c) Skewed Binary Tree Yakni Binary Tree yang semua nodenya (kecuali leaf) hanya memiliki satu child. 6.4 Binary Search Tree Binary Search Tree adalah Binary Tree dengan sifat bahwa semua left child harus lebih kecil daripada right child dan parentnya, Juga semua right child harus lebih besar dari left child serta parentnya. Binary Search Tree dibuat untuk mengatasi kelemahan pada binary tree biasa, yaitu kesulitan dalam searching / pencarian node tertentu dalam binary tree. 6.5 Operasi – operasi pada Tree a) Create : Membentuk binary tree baru yang masih kosong b) Clear : Mengosongkan binary tree yang sudah ada c) Empty : Function untuk memeriksa apakah binary tree masih kosong d) Insert : Memasukkan sebuah node ke dalam tree. Ada tiga pilihan insert : sebagai root, left child atau right child. Khusus insert sebagai root, tree harus dalam keadaan kosong. VI-4 e) Find : Mencari root, parent, left child atau right child dari suatu node. (Tree tak boleh kosong) f) Update : Mengubah isi dari node yang ditunjuk oleh pointer current. (Tree tidak boleh kosong) g) Retrieve : Mengetahui isi dari node yang ditunjuk pointer current. (Tree tidak boleh kosong). h) DeleteSub : Menghapus sebuah subtree (node beserta seluruh descendantnya) yang ditunjuk current. Tree tak boleh kosong. Setelah itu pointer current akan berpindah ke parent dari node yang dihapus. i) Characteristic : Mengetahui karakteristik dari suatu tree, yakni : size, height, serta average lenghtnya. Tree tidak boleh kosong. j) Traverse : Mengunjungi seluruh node – node pada tree, masing – masing sekali. Hasilnya adalah urutan informasi secara linier yang tersimpan dalam tree VI.2 Langkah-Langkah Praktikum 1. Script ditulis dengan menggunakan Dev C++ 2. Script dicompile dengan menggunakan Dev C++ 3. Aplikasi dijalankan dengan menggunakan Dev C++ VI.3 Tugas Praktikum ke-1 : Tree 1. Listing Program : //header #include #include #include file <stdio.h> <conio.h> <stdlib.h> //pendeklarasian struct sebuah tree awal struct Node{ int data; Node *kiri; VI-5 Node *kanan; }; //fungsi untuk menambahkan node baru void tambah(Node **root, int databaru) { //jika root masih kosong if((*root) == NULL) { //pembuatan node baru Node *baru; //pengalokasian memori dari node yang telah dibuat baru = new Node; //inisialisasi awal node yang baru dibuat baru->data = databaru; baru->kiri = NULL; baru->kanan = NULL; (*root) = baru; (*root)->kiri = NULL; (*root)->kanan = NULL; printf("Data bertambah!"); } //jika data yang akan dimasukkan lebih kecil daripada elemen root, maka akan diletakkan di node sebelah kiri. else if(databaru<(*root)->data) tambah(&(*root)->kiri, databaru); //jika data yang akan dimasukkan lebih besar daripada elemen root, maka akan diletakkan di node sebelah kanan else if(databaru>(*root)->data) tambah(&(*root)->kanan, databaru); //jika saat dicek data yang akan dimasukkan memiliki nilai yang sama dengan data pada root else if(databaru == (*root)->data) printf("Data sudah ada!"); } //fungsi yang digunakan untuk mencetak tree secara preOrder void preOrder(Node *root) { if(root != NULL){ printf("%d ", root->data); preOrder(root->kiri); preOrder(root->kanan); } } //fungsi yang digunakan untuk mencetak tree secara inOrder void inOrder(Node *root) { if(root != NULL){ inOrder(root->kiri); printf("%d ", root->data); inOrder(root->kanan); } } //fungsi yang digunakan untuk mencetak tree secara postOrder void postOrder(Node *root) VI-6 { if(root != NULL){ postOrder(root->kiri); postOrder(root->kanan); printf("%d ", root->data); } } //fungsi utama int main() { //deklarasikan variabel int pil, data;// c; Node *pohon; //*t; pohon = NULL; //inisialisasi node pohon //perulangan do-while do { system("cls"); //bersihkan layar printf("\t#PROGRAM TREE C++#"); printf("\n\t=================="); printf("\nMENU"); printf("\n----\n"); printf("1. Tambah\n"); printf("2. Lihat pre-order\n"); printf("3. Lihat in-order\n"); printf("4. Lihat post-order\n"); printf("5. Exit\n"); printf("Pilihan : "); scanf("%d", &pil); switch(pil) { //jika pil bernilai 1 case 1 : printf("\nINPUT : "); printf("\n-------"); printf("\nData baru : "); scanf("%d", &data); //panggil fungsi untuk menambah node yang berisi data pada tree tambah(&pohon, data); break; //jika pil bernilai 2 case 2 : printf("\nOUTPUT PRE ORDER : "); printf("\n------------------\n"); if(pohon!=NULL) //panggil fungsi untuk mencetak secara preOrder preOrder(pohon); else printf("Masih kosong!"); break; //jika pil bernilai 3 case 3 : printf("\nOUTPUT IN ORDER : "); printf("\n------------------\n"); data VI-7 if(pohon!=NULL) //panggil fungsi untuk mencetak data secara inOrder inOrder(pohon); else printf("Masih kosong!"); break; //jika pil bernilai 4 case 4 : printf("\nOUTPUT POST ORDER : "); printf("\n------------------\n"); if(pohon!=NULL) //panggil fungsi untuk mencetak data secara postOrder postOrder(pohon); else printf("Masih kosong!"); break; } _getch(); }while(pil != 5); //akan diulang jika input tidak samadengan 5 return EXIT_FAILURE; } 2. Tampilan Program : Gambar 6.1 Program Tree 3. Analisa Program Pada Program Tree diatas dideklarasikan beberapa fungsi yakni fungsi tambah untuk melakukan penambahan node pada Tree. Fungsi pre order untuk mengunjungi node secara pre-Order sekaligus mencetak isi node yang telah dikunjungi dari kunjungan yang pertama. Fungsi inOrder VI-8 untuk mengunjungi node secara in-Order sekaligus mencetak isi node yang telah dikunjungi secara urut mulai dari kunjungan pertama. Fungsi postOrder untuk mengunjungi node secara post-Order VI.4 Tugas Rumah ke-1 : Program Implementasi Tree 1. Listing Program : #include <iostream> using namespace std; class BinarySearchTree{ private: struct tree_node{ tree_node* left; tree_node* right; int data; }; tree_node* root; public: BinarySearchTree(){ root = NULL; } bool void void void }; isEmpty() const { return root==NULL; } print_preorder(); preorder(tree_node*); insert(int); // Smaller elements go left // larger elements go right void BinarySearchTree::insert(int d){ tree_node* t = new tree_node; tree_node* parent; t->data = d; t->left = NULL; t->right = NULL; parent = NULL; // is this a new tree? if(isEmpty()) root = t; else{ //Note: ALL insertions are as leaf nodes tree_node* curr; curr = root; // Find the Node's parent while(curr){ parent = curr; if(t->data > curr->data) curr = curr->right; else curr = curr->left; } if(t->data < parent->data) VI-9 parent->left = t; else parent->right = t; }} void BinarySearchTree::print_preorder(){ preorder(root); } void BinarySearchTree::preorder(tree_node* p){ if(p != NULL){ cout<<" "<<p->data<<" "; if(p->left) preorder(p->left); if(p->right) preorder(p->right); } else return; } int main(){ BinarySearchTree b; int ch,tmp; while(1){ cout<<endl<<endl; cout<<" Binary Search Tree Operations "<<endl; cout<<" ----------------------------- "<<endl; cout<<" 1. Insertion/Creation "<<endl; cout<<" 2. Pre-Order Traversal "<<endl; cout<<" 3. Exit "<<endl; cout<<" Enter your choice : "; cin>>ch; switch(ch){ case 1 : cout<<" Enter Number to be inserted : "; cin>>tmp; b.insert(tmp); break; case 2 : cout<<endl; cout<<" Pre-Order Traversal "<<endl; cout<<" -------------------"<<endl; b.print_preorder(); break; case 3 : return 0; }}} VI-10 2. Tampilan Program : Gambar 6.2 Program Implementasi Tree 3. Analisa Program : Pada Program Tree diatas terdapat beberapa fungsi diantaranya adalah fungsi insert yang digunakan untuk memasukkan / membuat node pada Tree, dan fungsi preorder yang digunakan untuk menampilkan data – data yang telah diinputkan oleh user tadi. 4. Notasi Kurung ( 5 ( 3 ) ( 9 ( 8 , 10 ) ) ) VI-11 5. Notasi Tingkat 5 3 9 8 10 Gambar 6.3 Notasi Tingkat Program Implementasi Tree 6. Diagram Venn 5 9 3 8 10 Gambar 6.4 Diagram Venn Program Implementasi Tree VI-12 VI.5 Kesimpulan 1. Tree adalah Kumpulan node yang saling terhubung satu sama lain dalam suatu kesatuan yang membentuk layaknya struktur sebuah pohon. 2. Beberapa jenis Tree antara lain Binary Tree, Full Binary Tree, Complete Binary Tree dan Skewed Binary Tree 3. Binary Tree adalah Tree dengan syarat bahwa tiap node hanya boleh memiliki maksimal dua sub pohon dan edua sub pohon harus terpisah Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf VII-1 BAB VII KESIMPULAN 1. Pointer adalah sebuah variabel yang meyimpan alamat memory, untuk mendapatkan alamat dari sebuah variabel adalah dengan menggunakan operator &, sedangkan untuk memanggil data yang ada di alamat tersebut adalah menggunakan operator * 2. Konsep dari Stack adalah LIFO (Last In First Out) yaitu data yang terakhir dimasukkan adalah data yang pertama keluar dan data yang pertama dimasukkan adalah data yang terakhir keluar 3. Sorting dalam C++ terdiri dari 5 macam sort yaitu Bubble Sort, Exchange Sort, Insertion Sort, Selection Sort dan Quick Sort 4. Searching dalam C++ terbagi menjadi 3 metode yaitu Sequential Search, Binary Search dan Interpolation Search 5. Linked List terbagi menjadi 2 yaitu Single Linked List, yang hanya memiliki data dan *next pada Node dan Double Linked List, yang memiliki *prev, data dan *next pada Node. 6. Tree adalah Kumpulan node yang saling terhubung satu sama lain dalam suatu kesatuan yang membentuk layaknya struktur sebuah pohon Disetujui Aslab Muh. Fitra Rizki Tgl: Ttd / Paraf VII-2 DAFTAR PUSTAKA Modul Struktur Data, Lab. Rekayasa Perangkat Lunak. ITN Malang, 2019. Zan 2018, Pengertian Pointer (https://www.belajarcpp.com/tutorial/cpp/pointer/), diakses pada 30 Maret 2019 Rahmat Subekti 2016, Implementasi Stack di C++ (https://bekti.net/blog/implementasi-stack-di-cpp/), diakses pada 15 April 2019 Matheus Rumetna 2017, Contoh Program Sederhana Sorting ‘Straight Insertion Sort’ (https://matheusrumetna.com/2017/02/11/contoh-program-sederhana- sorting-straight-insertion-sort/), diakses pada 30 April 2019 Admin Sarjana 2019, Belajar C++ Part 6 Searching (http://www.sarjanapedia.com/2019/02/metode-searching-dalam-cpp.html), diakses pada 2 Mei 2019 Rachmat Santoso 2014, Tree pada C++ (http://www.nblognlife.com/2014/12/treepada-c-tree-awal.html), diakses pada 18 Mei 2019 Rachmat Santoso 2014, Single Linked List pada C++ (http://www.nblognlife.com/2014/12/single-linked-list-pada-c.html), diakses pada 18 Mei 2019 LABORATORIUM PEMROGRAMAN & RPL INSTITUT TEKNOLOGI NASIONAL Kampus II : Jl. Raya Karanglo Km. 2 Malang LEMBAR ASISTENSI PRAKTIKUM STRUKTUR DATA SEMESTER GENAP TAHUN AKADEMIK 2018/2019 Nama NIM Kelompok FOTO 3x4 : Febryan Alfaridzi : 1818057 : 25 (Menggunaka n Jas Almamater) Asistensi No. Tanggal Paraf Instruktur Konsep Hasil Akhir Pointer, Struct, Rekursif Stack, Queue Sorting Searching Linked List Tree Dosen 1 Program 2 Batas Akhir: Asisten, Malang, … Mei 2019 Dosen, Pembimbing, (Muh. Fitra Rizki) (Hani Zulfia Zahro’, S.Kom, M.Kom) NIP.P. 1031500480