BAB 1 KONSEP DASAR 1.1 Algoritma Algoritma + struktur data = program Algoritma adalah urutan langkah-langkah logis untuk menyelesaikan sebuah masalah yang disusun secara sistematis. Notasi untuk menuliskan algoritma disebut notasi algoritmik yang tidak dapat dijalankan oleh komputer. Agar dapat dijalankan oleh komputer maka program dalam notasi algoritmik harus ditranslasikan {diterjemah} kedalam notasi bahasa pemograman yang dipilih. Notasi algoritmik Instruksi Pemberian harga Bentuk umum nama-data nama-data nama-data nama –data konstanta ekspresi Masukan Input (nama-data) Keluaran output (nama-data) output (konstanta) output (ekspresi) If kondisi then aksi-1 else aksi-2 Pemilihan kondisi Pengulangan Contoh P Q P Q P Q input (N) input (harga) output (N) output („hello‟) output (X+Y) depend on (nama-data) aksi-1 aksi-2 Repeat N times Aksi Repeat 5 times Output („hello‟) Repeat Aksi Until kondisi-berhenti Repeat X Until X>5 While kondisi do Aksi While X <= 5 do X X+1 Itraversal [1...N] Aksi X traversal [1..5] Output („hello‟) X+1 1.2 Pengertian Struktur Data Struktur Data adalah membuat sebuah struktur penyimpanan data yang digunakan saat program dijalankan. 58 Struktur data berada pada level pemograman dimana digunakan untuk tempat penyimpanan data yang digunakan oleh program terkaikt dengan alokasinya dimemori (bukan storage atau hardisk). Struktur alokasi dimemori untuk menyimpan data yang sedang digunakan oleh Program inilah fokus dari struktur data. Ilustrasi dari struktur data dapat dilihat pada gambar berikut : Lingkup Struktur Data Dapat disimpan Data Menggunakan Data Memori Hardisk/ Storage Gambar 1 Ilustri Struktur data 1.2.1 Tujuan Struktur Data Struktur data bertujuan agar cara merepresentasikan data dalam membuat program dapat dilakukan secara efisien dalam pengolahan di memori dan pengolahan penyimpanan dari program ke storage juga lebih mudah dilakukan. Struktur data sebenarnya meliputi larik (array) dan record (rekaman) pada berkas beruntun (sequential file). 1.2.2 Langkah Pembuatan Struktur Data Pembuatan Struktur data dimulai dari : Langkah 1 : Analisis perancangan data apa yang harus dimanipulasi di memori agar program yang dibuat lebih efisien. Langkah 2 : Mengimplementasikan struktur data dalam bahasa pemograman. Langkah 3 : Menggunakan struktur data yang sudah dibuat untuk memanipulasi data di memori dalam sebuah program. Contoh ilustrasi langkah-langkah berikut : Ilustrasi Keterangan Misalkan ada sebuah data manusia yang terdiri dari : nama alamat TTL No_telp *nama ? ? ? ? *alamat *TTL (Tempat/ Tanggal lahir) *no_telp (nomor telepon) Dan diperlukan untuk menyimpan data manusia, maka dalam logika akan dipersiapkan tempat untuk menyimpan 59 nama faiz nama alamat jakarta alamat faiz jakarta faris medan TTL No_telp Palembang/07 444000 april 2007 TTL Palembang/07 april 2007 Palembang/03 agustus 2009 No_telp 444000 sebuah data manusia, maka dibuat tipe data bentukan untuk menyimpan data manusia. Misalkan dari data manusia yang ada diisi dengan data seorang manusia. Misalkan dari data manusia yang ada digunakan untuk menampung beberapa data manusia. 445000 Dari ilustrasi diatas dapat dilihat bahwa struktur data adalah cara menyediakan tempat yang baik dan tersusun secara terstruktur agar data yang disimpan dapat dibaca dengan lebih mudah. Struktur data dapat dikatagorikan dengan type, yaitu : 1. Tipe data dasar a. Integer, untuk mendefinisikan nama-data yang menyimpan harga berupa bilangan bulat. Contoh : X : integer Nilai angka : integer [0..100] b. Real, untuk mendefinisikan nama-data berupa bilangan pecahan yang mengandung pecahan desimal. Contoh : Harga : real Potongan : real c. Karakter, untuk mendefinisikan nama-data yang menyimpan harga berupa karakter yang tidak dapat diproses secara aritmatika. Contoh : Nilai huruf : charakter [„A‟....‟E‟] d. Logika, untuk mendefinisikan nama-data yang menyimpan harga benar-salah Contoh : Ketemu :boolean 2. Tipe data bentukkan Tipe data bentukkan adalah tipe yang didefinisikan sendiri oleh pemograman, yang disusun oleh satu atau lebih tipe dasar. Contoh: tipe data string, yang dibangun dari tipe dasar karakter 3. File 60 Sekumpulan rekaman yang disimpan dalam media penyimpanan mulai dari rekaman pertama sampai terakhir satu persatu, secara searah. 4. Tabel Tabel, untuk merepresentasikan sekumpulan informasi yang bertipe sama dan disimpan dengan urutan yang sesuai dengan definisi secara kontigu dalam memori komputer. Contoh : TabNilMhs : array [1....Nmhs] of real 1.2.3 Tiga tingkatan struktur data 1. Definisi fungsional Pendefinisian struktur data dan operator-operator yang berlakupada struktur data tersebut mendefinisi tipe data 2. Representasi logika Pendefinisian spesifikasi „type‟ dari struktur yang menyengkut nama tipe dan spesifikasi semua operator. 3. Representasikan fisik (implementasikan) Spesifikasi dari struktur data sesuai dengan implentasinya dalam memori komputer. 1.3 Pengenalan C++ Tahun 1969, laboratorium Bell AT&T di Muray Hill, New Jersey menggunakan bahasa assembly ini untuntuk mengembangkan sistem operasi UNIX. Maksudnya adalah untuk membuat sistem operasi yang bersifat “programmer_friendly”. Setelah UNIX berjalan Ken Thompson seorang pengembang sistem dilabotorium tersebut mengembangkan bahasa baru dengan nama bahasa B. Oleh karena bahasa B ini masih bersifat interpret dan lambat, maka pada tahun 1971, sistem operasi UNIX kemudian ditulis ulang dengan ulang dengan menggunakan bahasa C, yaitu bahasa pemograman yangdikembangkan oleh Dennis Ritchie, seorang pengembang sistem dilaboratorium yang sama.Pada tahun 1993, seorang doktor bernama Bjarne Stroustrup yang juga bekerja dilaboratorium yang sama menciptakan bahasa baru yaitu bahasa C++. Keistimewaan dari bahasa C++ adalah karena bahasa ini mendukung pemograman berarah objek atau yang lebih seringdikenal dengan istilah Object Oriented Programming (OOP). Konsep Kompilasi dan Eksekusi Program Preprocessor Mula-mula kode program akan dimasukkan kebagian preprosesor yaitu yang diawali dengan tanda # (pound) dan menghasilkan file yang akan dilewatkankebeberapa kompiler. Beberapa preprocessor tersebut diantaranya adalah sebagai berikut : #include #define #ifdef, dll Kode program (source code) preprosesor kompiler assembler 61 Kompiler C++ Kompiler akan menterjemahkan kode program yang telah dilewatkan oleh preprosesor ke dalam bahasa assembly. Assembler Assembler menerima keluaran dari kompiler C++ dan akan membuat sebuah kode objek. Jika dalam kode program kita tidak menggunakan fungsi-fungsi yang terdapat pada library lain, maka kode objek ini akan langsung dieksekusi menjadi file EXE. Link Editor Bagian ini dikerjakan jika kode program yang kita buat menggunakan fungsi-fungsi yang disimpan pada suatu library lain. Link editor akan mengkombinasikan kode objek dan library yang ada untuk menjadikan sebuah file EXE. Contoh program yang ditulis dalam bahasa C #include <iostream .h> Int main() { Int X; Cout<<”Masukkan sebuah bilangan bulat : ”; Cin>>X; Cout<<”Bilangan yang telah Anda masukkan adalah “<<X; Return 0; } Contoh hasil yang akan diberikan dari program diatas adalah sebagai berikut : Masukkan sebuah bilangan bulat :2 Bilangan yang telah anda masukkan adalah 2 62 PENGURUTAN (SORTING) 2.1 Definisi Pengurutan Pengurutan (sorting) adalah proses mengatur sekumpilan objek menurut urutan atau susunan tertentu. Pengurutan tersebut dapat menaik (Ascending) atau menurun (Decending). Data yang diurut dapat berupa data type data sederhana (kecuali boolean) atau type data terstruktur. Keuntungan dari data yang telah berurut dapat mempercepat pencarian, juga dapat harga maksimum dan minimum secara langsung. 2.2 Metode Pengurutan Metode pengurutan yang akan dibahas: 1. Pengurutan Gelembung (Bubble sort) 2. Pengurutan Maksimum/ Minimum (Maximum/ minimum sort) 3. Pengurutan Sisip (insertion Sort) 2.3 Pengurutan Gelembung (Bubble Sort) PENGURUTAN BILANGAN DENGAN METODE BUBBLE SORT Proses Pengurutan Bubble Sort adalah nama yang diberikan pada prosedur untuk mengatur sekelompok bilangan dengan urutan dari kecil ke besar. Untuk mengurutkan bilangan diperlukan variabel array yang digunakan untuk menampung semua bilangan yang akan diurutkan. Proses pengurutan dilakukan dengan membandingkan semua elemen array satu persatu. Contoh : 20 12 35 11 17 9 58 23 63 Dalam metode bubble sort, pengurutan demulai dengan membandingkan elemen pertama untuk mendapatkan angka terbesar. Lalu angka tersebut ditempatkan pada elemen terakhir. 64 IMPLEMENTASI DALAM BENTUK FLOWCHART 1 START J=J+1 2 I = 0 I=I+1 J = 0 N=0 INPUT BILLAR(I) BIL < BILLAR(I+1) BIL=0 N=N+1 1 TIDAK TEMP = BILLAR(I) BILLAR(I) = BILLAR(I+1) BILLAR = TEMP BILLAR(N) = BIL I=N-J 2 YA YA PRINT BILLAR(I) I=I+1 J=N-1 I=0 TIDAK I=N I=0 Bubble Sort tidak lain adalah pengulangan prosedur1 hingga bilangan – END bilangan yang ada tersusun menurut urutan dari yang kecil ke yang besar. Contoh Buble Sort 6 5 8 3 8 3 Pertama : 6 5 5 6 8 3 5 6 3 8 5 6 3 8 6 8 Pada akhir proses pertama ini, bilangan yang terbesar menempati tempat yang sesuai. Kedua : 5 6 3 8 5 6 3 8 5 3 6 8 5 3 Pada akhir proses kedua ini, bilangan terbesar kedua menempatkan tempat yang sesuai. Ketiga : 5 3 6 8 5 3 6 8 3 5 6 8 3 5 6 8 Bila proses ini dilanjutkan, tidak ada pertukaran tempat lagi bagi bilangan – bilangan tersebut, sebab bilangan tersebut telah selesai disusun. BAB 2 SENARAI (List) 2.1 Pengertian Senarai (List) List atau senarai adalah sebuah pemikiran / konsep struktur data yang sangat dasar pada pemograman agar lebih fleksibel, di mana setiap elemen akan ditambahkan saat dibutuhkan, tidak dialokasikan dengan tempat tertentu dari awal. List merupakan kumpulan elemen dengan struktur tertentu. Struktur dasar dari list dapat dilihat pada gambar 2 yang merupakan list dengan tiga buah elemen. Kepala (first) NULL Gambar 2 Senarai dengan Tigah Buah Elemen Kepala (first) NULL Gambar 3 Representasi Lain Senarai dengan Tiga Elemen Sebuah list akan terdiri dari elemen pertama yang disebut dengan kepala atau first, next adalah alamat dari elemen berikutnya. serta beberapa elemen atau bahkan tanpa elemen yang biasa disebut list kosong. Misalkan jika kita ingin membuat sebuah elemen data nilai mahasiswa yang terdiri dari nomor induk, nama, dan nilai maka representasinya dapat dilihat pada gambar 4: Nim 001 nama nilai faiz A next Petunjuk ke elemen berikutnya Gambar 4 Representasi Elemen 2.2 Tipe-tipe List 2.2.1 List Kosong List kosong hanya terdiri dari sebuah petunjuk elemen yang berisi NULL (kosong). List kosong tidak memiliki satu buah elemen pun sehingga hanya berupa petunjuk awal elemen yang berisi NULL (kosong). Gambar 6 Senarai Kosong Kepala (first) NULL Sehingga list kosong merupakan list yang belum memiliki elemen yang terkait pada first. Sehingga ketika first diakses belum ada bendanya. 2.2.2 List Tunggal List tunggal adalah sebuah list yang elemennya hanya menyimpan informasi elemen setelahnya (Next) sehingga jalannya pengaksesan list hanya dapat dilakukan secara maju. List tunggal memiliki beberapa jenis list yaitu list tunggal dengan first dan tail, list tunggal dengan kepala first, dan list tunggal berputar. Representasi list tunggal dengan kepala dan tail (ekor) memiliki dua buah petunjuk elemen yaitu elemen pertama (first) dan petunjuk elemen terakhir (tail), sehingga pada awal pengaksesan, elemen yang dapat diakses adalah elemen awal dan akhir. Ekor (tail) Kepala (first) NULL Gambar 5 senarai tunggal dengan dua petunujuk elemen Deklarasi list tunggal dengan kepala dan ekor : Type list : < First : elemen, Tail : elemen > Representasi list tunggal dengan kepala hanya dapat diakses elemen pertamanya saja karena petunjuk hanya berupa petunjuk elemen awal (first). Kepala (first) NULL Gambar 6 senarai tunggal dengan kepala Representasi list tunggal berputar elemen terkhir ditandai dengan elemen setelahnya sama dengan elemen pertama seperti sehingga penelususran list akan berhenti jika petunjuk bantu telah sampai pada elemen yang elemen setelahnya sama dengan elemen yang ditunjuk oleh penunjuk elemen awal (first) yang dalam bahasa algoritmik : While now.text <> L1.first do {proses penelusuran list} Now now.while (end while) Gambar 7 senarai berputar 2.2.3 List ganda List ganda adalah sebuah list yang elemennya menyimpan informasi elemen sebelumnya dan informasi elemen setelahnya sehingga penelusuran list dapat dilakukkan secara maju dan mundur. List ganda terdiri dari list ganda dengan kepala dan tail(ekor) dan list ganda dengan kepala dan list ganda berputar. Representasi list ganda dengan kepala dan ekor, memiliki dua petunjuk yang dapat diakses (tail). Kepala (first) Ekor (tail) NULL NULL Gambar 8 senarai ganda dengan dua petunjuk Representasi list ganda dengan kepala, hanya memiliki sebuah petunjuk elemen yaitu penunjuk pada elemen awal list (first). Kepala (first) NULL NULL Gambar 9 senarai ganda dengan kepala Representasi list ganda berputar, elemen terakhir list ganda berputar ditandai dengan elemen setelahnya adalah merupakan elemen pertama list yang ditunjuk awal list (first).Kepala (first) Gambar 10 senarai ganda berputar 2.3 Operasi pada List Operasi-operasi yang dilakukan pada list adalah penelusuran (traversal),pencarian sebuah elemen (search),penciptaan (create),penambahan elemen (insert) dan penghapusan elemen (delete), menggabung Dua Buah List (concat). 2.3.1 Penelusuran (traversal) Dibutuhkan untuk pemrosesan terhadap data/ informasi yang ada dielemen list, perlu dilakukan penelusaran list, yaitu “mengunjungi” setiap elemen list. Traversal1 (input L:list) {untuk menelusuri list} {L terdefinisi, mungkin kosong} {elemen list L “dikunjungi” & telah diproses} Addres{address untuk traversal, tipe terdefinisi} Procedure Proses(input P:address) Procedure Insisialisasi {aksi sebelum proses dilakukan} Procedure terminasi {aksi sesudah semua pemrosesan} Algoritma: Inisialisasi(P) P first (L) While (P=Nil) do Proses(P) P Next(P) terminasi Traversal2 (input L:list) {untuk menelusuri list dengan kasus kosong} {L terdefinisi, mungkin kosong} {elemen list L “dikunjungi” & telah diproses} Addres{address untuk traversal, tipe terdefinisi} Procedure Proses(input P:address) Procedure Insisialisasi {aksi sebelum proses dilakukan} Procedure terminasi {aksi sesudah semua pemrosesan} Algoritma: First (L) = Nil then Input („list kosong‟) Inisialisasi First (L) Input Proses (P) P Next (L) While (P=Nil) terminasi Traversal3 (input L:list) {untuk menelusuri list} {L terdefinisi, tidak kosong} {elemen list L “dikunjungi” & telah diproses} Address{address untuk traversal, tipe terdefinisi} Procedure Proses(input P:address) Procedure Insisialisasi {aksi sebelum proses dilakukan} Procedure terminasi {aksi sesudah semua pemrosesan} Algoritma: Inisialisasi(P) P first (L) Address(P) Next(P)=Nil Next(P) terminasi 2.3.2 Pencarian Elemen List (Search) Search ini sering dipakai untuk mengenali elemen list berdasarkan nilai informasi yang disimpan pada elemen yang dicari.Biasanya dengan alamat yang ditemukan, dilakukan suatu proses terhadap elemen list tersebut. searchNilai (input L:list, X:infoType, output P: address, found: boolean) {Found X terdefinisi} {P adalah alamat elemen dimana X ditemukan Nil jika tidak ditemukan} Found berharga true jika X ditemukan, Found berharga false jika X tidak ditemukan Kamus : Algoritma: Read(X) Search Nilai(L,X,Prec,found) If found then Insertafter(L,Prec,P) P first(L) found false while (P = Nil) and (not found) do if( X = info(p)) then found true else P Next(P) While p = Nil or found) Pencarian suatu elemen beralamat tertentu Search ini sering digunakan untuk memposisikan list pointer pada suatu elemen list. searchAlamat (input L:list, X:infoType, output P: address, found: boolean) {Found P terdefinisi} {Ada elemen list yang beralamat P, Found berharga true jika tidak Found berharga false} Kamus : Algoritma: {P first(L) found false while (Pt = Nil) and (not found) do if (X = info(p)) then found true else P Next(Pt) While Pt = Nil or found)} 2.3.4 Penciptaan List Penciptaan sebuah list berarti membuat sebuah list yang selanjutnya siap diproses ditambah data. Algoritma penciptaan sebuah list sebagai berikut : CreateList ( output L : List) {Bentuk list L yang kosong artinya first dari harga awal Nil} Kamus : Algoritma: Void createlist (list *L) { *L = Nil; } 2.3.5 Penyisipan sebuah List Penyisipan elemen dapat dilakukan sebagai elemen setelah sebuah elemen dengan alamat P atau elemen terakhir. Insert First Tambah sebuah elemen sebagai elemen pertama list,insert elemen pertama, list kosong : Kepala (first) Null Elemen baru Insert elemen pertama, list tidak kosong : Kepala (first) Null Elemen baru Gambar 12 InsertFirst Procedure insertfirst( input/output L : List, p: address) {IS: List L mungkin kosong, P sudah dialokasi, P = Nil, Next (P) = Nil} {FS: P adalah elemen pertama list first} Kamus : Algoritma: Next (P) first(L) First (L) P If First(L) = Nill then Next (P) First(L) Endif First(L) P Insert After Menyisipkan sebuah elemen beralamat P sebagai suksesor dari sebuah elemen list yang beralamat Prec. Kepala (first) Elemen baru Null Elemen baru Kepala (first) prec Null Procedure insertAfter(input/output L : List, input Prec,P: address) {IS: Prec adalah elemen list, prec = Nil, P sudah dialokasi, P=Nil, Next (P) =Nil} {FS: P menjadi suksesor Prec} Kamus : Algoritma: Void InsertAfter (List *L, address P) Next (P) Next (Prec) Next (Prec) P Insert Last Menyisipkan sebuah elemen beralamat P sebagai elemen terakhir sebuah list. Elemen baru Kepala(first) Null Procedure insertLast(input/output L : List, input P: address) {IS: List L mungkin kosong P sudah dialokasi,P = Nil, Next(P) = Nil} {FS: P adalah elemen terakhir list L} Kamus : Last: address {alamat elemen terakhir} Algoritma: If (first(L) = Nil)then Insertfirst (L,P) Else Last first (L) While (next (Last) = Nil) do Last Next(last) {endwhile, last adalah elemen terakhir} insertAfter (L,last,P) 2.3.6 Penghapusan Sebuah Elemen pada List (Delete) Penghapusan dapat dilakukan apabila elemen list tidak digunakan lagi. Penghapusan Elemen list di Awal Kepala (first) Kepala (first) Null Procedure DeleteFirst(input/output L : List, Output P: address) {IS: List L tidak kosong P minimal 1 elemen} {FS:Elemen pertama dihapus, P adalah alamat elemen pertama L sebelum penghapusan} Kamus : Algoritma: P first (L) First (L) Next(First(L)) Null Penghapusan Elemen List After/Tengah Kepala (first) Kepala (first) Null Null Procedure DeleteAfter(input/output L : List, Output P: address) {IS: List L tidak kosong Prec adalah elemen list, Next (prec) = Nil} {FS:Menghapus suksesor Prec, p adalah suksesor Prec sebelum penghapusan, next (Prec) yang baru adalah suksesor dari suksesor Prec sebelum penghapusan} Kamus : Algoritma: P first (L) Next (Prec) Next(Next(Prec)) Next (P) Nil Penghapusan Elemen di Akhir List Kepala (first) Kepala (first) Null Null Procedure DeleteLast(input/output L : List, Output P: address) {IS: List L tidak kosong, minimal ada satu elemen} {FS:Elemen terakhir dihapus, list mungkin jadi kosong, p adalah alamat elemen terakhir list sebelum penghapusan} Kamus : Last, PrecLast: address Null Algoritma: Last first (L) PrecLast Nil {pred dari L tidak terdefinisi} {menelusuri List sampai elemen terakhir} While (next (Last) = Nil) do PrecLast Last Last Next (Last) {endwhile, Next (last) = Nil} P Last if (Preclast = Nil) then { list dgn 1 elemen} First (L) Nil Else Next (PrecLast) Nil Menghapus elemen tertentu dengen alamat P Procedure DeleteP(input/output L : List, Output P: address) {IS: List L tidak kosong, P adalah elem list L} {FS:menghapus P dari list, P mungkin elemen pertama, tengah, atau akhir} Kamus : Prec : address Algoritma: if (P= first (L))then DeleteFirst (L,P) Else Prec First(L) While (next (Prec) = P) do Prec Next (Prec) {endwhile, Next (Prec) = P, hapus P} DeleteAfter (L, Prec, P) 2.3.7 Menggabungkan Dua Buah List (Concat) Jika ada dua buah list dimana list kedua disambungkan ke list pertama maka last (L1) menjadi predesedor First(L2) Procedure concat(input L1, L2 : List, output L3 :List) {IS: L1=L2, L1=L3, dan L2=L3, L1,L2 mungkin kosong} {FS:L3 adalah hasil konkatenasi L1 dgn L2, L2 diletakkan dibelakang L1} Kamus : Last1 : address {elemen terakhir list pertama Algoritma: CreatList(L3) if (First (L1) = Nil)then first (L3) first(L2) else first (L3) First (L1) last1 First (L1) {menelusuri list sampai elemen terakhir} While (next (Last1) = Nil) do Last1 Next(Last1) {endwhile, Next(last1) = nil) Next (last1) First (L2) BAB 3 REPRESENTASI FISIK LIST Representasi list adalah sekumpulan elemen bertipe sama yang terdiri dari 2 bagian : <Info:InfoType, Next: Address> dimana Infotype adalah tipe terdefinisi dan Next adalah “alamat” elemen berikutnya. List Representasi fisik adalah implementasi list dalam struktur data yang dapat ditangani oleh pemrosesan bahasa pemograman. Ada 2 cara untuk merepresentasikan list secara fisik yaitu berkait dan kontigu. Representasi berkait dapat diimplementasikan dalam 2 macam struktur fisik yaitu berkait dengan pointer dan berkait dengan tabel. Sedangkan representasi kontigu hanya dapat diimplementasikan dengan struktur yang secara fisik kontigu adalah tabel. 3.1 Representasi List berkait dengan Pointer Cara mengacu : Jika P adalah nama variabel yang bertipe pointer, maka P adalah alamat memori mesin dari elemen data yang ditunjuknya. Elemen data yang ditunjuknya boleh bertipe apa saja. Contoh : KAMUS: Type Elmt : integer P: pointer to Elmt {maka P akan bertipe integer} Type Mhs : <NIM: integer, nama: string, Nilai: integer[0..100]> PMhs pointer to Mhs {Maka PMhs akan bertipe Mhs PMhs . NIM akan bertipe integer} Procedure Allocate (output P: Pointer) {Memberikan sebuah elemen yang ditunjuk oleh P} Procedure Deallocate (input P: Pointer) {Mengembalikan alamat P ke sistem} Contoh untuk pengisian sebuah elemen data yang bertipe sebagai berikut : KAMUS: Type Mhs : <NIM: integer, nama: string, Nilai: integer[0..100]> PMhs pointer to Mhs Algoritmik: Allocate (PMhs) {baru disediakan memori pada saat ini} PMhs . NIM 9911050 PMhs . Nama „Leni‟ PMhs . Nilai 80 Pada saat sebuah elemen dihapus maka memori dapat dikembalikan ke sistem dengan prosedure Deallocate. Jadi Representasi fisik list linier berkait dengan pointer adalah : KAMUS: Type ElmtList : <Info: Infotype, Next: Address > Type Address: Pointer to ElmtList Type List: address {infoType adalah tipe terdefinisi} {deklarasi untuk variabel kerja} L: List {alamat elemen pertama list} P: Address { alamat untuk traversal} Maka ntuk mengacu elemen dengan alamat P adalah: First(L) dituliskan menjadi L Info(P) dituliskan menjadi P .Info Next(P) dituliskan menjadi P .Next 3.2 Representasi List berkait dengan Tabel Representasi berkait dengan tabel alokasi memorinya tidak dinamis. Alokasi tabel sesuai dengan batasan indeksnya. Representasi fisik dengan tabel digunakan jika maksimum elemen datanya dapat diprediksi. Dengan representasi ini kita dapat menelusuri alamat elemen melalui indeks tabel. Representasi fisik list berkaitan dengan tabel adalah: KAMUS: {Tabel memori list, global} Constant IndekxMin: integer = 1 Constant IndekxMax: integer = 100 Constant Nil: integer = 0 Type InfoType : ......{terdefinisi} Type ElmtList : <Info: InfoType, Next: Address> TabElmt: array [IndexMin...IndexMax] of ElmtList Type Address: Address { alamat pertama list siap dipakai} {deklarasi variable kerja} Type List: Address P: address Procedure IniTab {IS: sembarang} {FS: TabElmt{IndexMin..IndexMax] terinisialisasi untuk dipakai sebagai elemn list berkait elemen pertama yang dapat dipakai adalah FistAvail =1} {inisialisasi tabel yang akan dipakai sebagai memori list} Function Memfull boolean {true jika semua elemen tabel sudah dipakai, false jika tidak} Procedure AllocTab(output P: Address) {IS: FirstAvail mungkin kosong} {FS: Jika FirstAvail ntidak Nil maka P adalah FirstAvail dan FirstAvail yang baru adalah Next(firstavail) Jika firstAvail = Nil, P=Nil, tuliskan pesan {mengambil sebuah elemen siap pakai P} Procedure DeAllocTab (Input P: Address) {IS: FirstAvail mungkin kosong, P tidak Nil) {FS:firstAvail = P} {mengembalikan sebuah elemen P pada FirstAvail} Jika didefinisi : P: Address Maka untuk mengacu elemen dengan alamat P adalah: Info(P) dituliskan menjadi: TabElmtp. Info Next(P) dituliskan menjadi: TabElmtp. Next *Untuk Menginisialisasi Tabel Procedure IniTab {IS: sembarang} {FS: TabElmt[IndexMin...IndexMax] terinisialisasi untuk dipakai sebagai elemen list berkait elemen pertama yang dapat dipakai adalah FirstAvail = 1} {inisialisasi tabel yang akan dipakai sebagai memori List} Kamus : i: address Algoritma: I traversal{IndexMin..IndexMax-1} TabElmt1. Next i+1 TabElmtIndexMax . Next Nil FirstAvail IndexMin Fungsi MemFull digunakan mengecek apakah sebuah elemen tabel sudah dipakai Function MemFull Boolean {true jika semua elemen tabel sudah dipakai, false jika tidak} Kamus : Algoritma: (FirstAvail = Nil) Prosedur Allocate digunakan jika kita akan memesan tempat untuk list Procedure Allocate(output P: Address) {IS: FirstAvail mungkin kosong} {FS: Jika firstAvail tidak Nil maka P adalah FirstAvail dan FirstAvail yang baru adalah Next(FirstAvail) Jika FirstAvail = Nil, tulislah pesan „tidak tersedia lagi elemen siap Pakai‟ {mengambil sebuah elemen siap pakai P} Kamus : Algoritma: If (not memfull) then P FirstAvail FirstAvail TabElmfirstAvail . Next else output („ tidak tersedia lagi elemn siap pakai‟0 P Nil Jika elemen list tersebut tidak diperlukan lagi dan elemen tersebut sudah dihapus dari list maka “tempatnya” dikembalikan lagi ke tabel agar dapat digunakan untuk elemen list lainnya. Untuk Mengembalikan elemen list adalah: Procedure DeAllocTab (input P: Address) {IS: FirstAvail mungkin kosong, P tidak Nil} {FS: FirstAvail = P} {mengembalikan sebuah elemen p pada FirstAvail} Kamus : Algoritma: P FirstAvail TabElmfirstAvail . Next FirstAvail FirstAvail P Beberapa contoh keadaan tabel untuk elemen list FirstAvail FirstAvail FirstList Keadaan Awal FirstAvail Tabel terpakai 2 elemen FirstList 2 L2 1 L1 10 FirstAvail 4 9 L1 5 7 8 L2 2 1 Info Next 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 Info 1 2 3 4 5 6 7 8 9 10 Info Next Next 6 3.3 Representasi Fisik List secara Kontigu Dengan representasi fisik kontigu, struktur data yang dapat menyimpan adalah tabel. Karena hanya tabel yang punya struktur Kontigu. Setiap elemen tabel mengandung informasi info. Sedangkan informasi mengenai Next tidak perlu lagi diseimpan secarabeksplisit, karena secara implisit sudah tersirat dalam struktur data yang menjadi tempat penyimpanannya. Elemen terakhirt tidak dikenali dari Next, karena Next tidak disimpan secara eksplisit, satusatunya cara untuk mengetahui elemen terakhir adalah dari alamatnya : P = Nil, dimana N terakhir dengan harus diketahuinya alamat elemen terakhir, maka representasi list L bukan murni seperti diatas, tetapi harus mengandung First(L) dan Last(L). {list direpresentasi pada tabel secara kontigu} KAMUS: Constant IndekxMin: integer = 1 Constant IndekxMax: integer = 100 Constant Nil: integer = 0 Type InfoType : ......{elmtype : terdefinisi} Info : infotype : (tidak perlu mengandung next : karena dapat dikalkulasi) TabElmt: array [IndexMin...IndexMax] of info Type Address: integer[IndexMin...IndexMax,nil] {deklarasi variable kerja} N : address {nama elemen terakhir, karena field NEXT tidak ada secara eksplisit, maka satu-satunya jalan untuk mengenali elemen terakhir adalah dengan @-nya} Type List: Address First : list {deklarasi alamat} P : address {address untuk traversal} {maka first (L)..last(L) adalah indeks effektif elemen tabel anggota list {next (P) tidak terdefinisi utk P=N next (P) P P+1 Info (P) menjadi TabelmtListp.info} BAB 4 TUMPUKAN (STACK) 4.1 Pengertian Tumpukan (Stack) Tumpukan atau stack adalah salah satu konsep struktur data yang memiliki sistem kerja yang terakhir masuk adalah yang pertama keluar (LIFO = Last In First Out). Elemen atas tumpukan (Top of Stack) Tumpukan (stack) Sebuah stack hanya dapat ditambahkan dan dikurangi elemennya hanya dari sebuah sisi. Elemen paling atas dari sisi tersebut disebut elemen atas atau top of stack. Semua operasi pada sebuah stack diawali dari elemen atas ini, misalkan ingin mengambil elemen stack maka dilakukan satu persatu diawali dari elemen atas, dan jika ingin menambah elemen stack maka petunjuk elemen atas diganti menjadi elemen yang ditambahkan pada bagian atas stack. 4.2 Operasi pada Tumbukan 4.2.1 Operasi Push Operasi push pada stack adalah operasi menambahkan elemen baru pada sebuah stack. Elemen baru Top Top Elemen baru Tumpukan (stack) Procedure Push(input/output S : Stack, input P: address) {IS: Stack S mungkin kosong, P terdefinisi} {FS: P menjadi Top dari Stack S} Kamus : Algoritma: If StackEmpty(S) then Top(S) P else Next (P) Top(S) Top(S) P Tumpukan (stack) Procedure Push(input/output S : Stack, input E: Elmts) {IS: Stack S mungkin kosong, E terdefinisi, alokasi} {FS: Top(S) berisi E} Kamus : P : address Algoritma: Alokasi (P) Elmt (P) E If StackEmpty(S) then Top(S) P else Next (P) Top(S) Top(S) P 4.2.2 Operasi POP Operasi pop pada stack adalah operasi mengambil sebuah elemen dari sebuah stack. Top dikeluarkan Top Procedure Pop(input/output S : Stack, output P: address) {IS: Stack S terdefinisi, mungkin kosong} {FS: P adalah alamat elemen yang diambil} Kamus : Algoritma: P Top(S) If not StackEmpty(S) then Top(S) Next( Top(S)) Procedure Pop(input/output S : Stack, output E:ElmtS) {IS: Stack S terdefinisi, tidak kosong} {FS: P adalah alamat elemen yang diambil} Kamus : Algoritma: P Top(S); E.Info Info(P); E.Next Top(S) Next( Top(S)) Dealokasi (P) Nil 4.3 Stack Representasi Statis Stack dengan representasi statis biasanya diimplentasinya dengan menggunakan array. Sebuah array memiliki tempat yang dialokasikan diawal sehingga sebuah elemen yang dimasukan dalam sebuah array terbatas pada tempat yang ada pada array. Karena menggunakan array maka stack dengan representasi statis dapat mengalami kondisi elemen penuh. array elemen Elemen Elemen Elemen Elemen Elemen indeks 1 2 3 4 5 6 7 8 9 10 KAMUS UMUM Constant Nmax: integer = 100 Constant Nil: integer = 0 Type Address: integer [0..NMax] {alamat 0 untuk menyatakan stack kosong} Type Elmts:....{terdefinisi, hanya terdiri dari info} Type Stack: <TOP: Address, TabElmt: array{1...Nmax] of Elmts> S: Stack {cara penulisan ; TOP (S) dituliskan S.Top Info (P) dituliskan S.TsbElmtp.Elmts Next (P) dituliskan P P+1 Function StackEmpty (S: Stack) boolean {mengirimtrue jika stack kosong dan false jika stack kosong} Kamus : Algoritma: (S.TOP = Nil) Procedure CreateStack(Output S:Stack) {IS: sembarang} {FS:Stack S tercipta, Top = Nil} Algoritma : S.Top Nil Procedure Popkon(input/output S : Stack, input E:ElmtS) Procedure Pushkon(input/output S : Stack, {IS: Stack S terdefinisi, mungkin kosong} input E:ElmtS) {FS: jika stack S kosong, maka E= -99 {IS: Stack S dan E terdefinisi} Jikastack S tidak kosong maka Top = {FS: jika masih tersedia tempat maka E Top-1 E adalah elemen yang dipop}} menjadi elemen paling baru dari stack S, jika Kamus : tidak tersedia tempat lagi tampilkan pesan Algoritma: „overflow‟} If (StackEmpty(S)) then Kamus : Output(E=-99) Algoritma: Else If (S.Top < Nmax) then E S.TabElmts.Top S.Top S.Top + 1 S.Top S.Top – 1 S.tabelmtss.top E Else Output(„overflow‟) 4.4 Stack Representasi Dinamis Stack dengan representasi dinamis biasanya diimplementasikan dengan menggunakan pointer yang menunjukkan pada elemen-elemen yang dialokasikan pada memori. Kepala (first) NULL Gambar Representasi Tumpukkan dinamis Karena semua operasi pada sebuah stack diawali dengan elemen yang paling atas maka jika menggunakan representasi dinamis saat elemen ditambah akan menggunakan penambahan elemen pada awal stack (addfirst) dan saat pengambilan atau penghapusan elemen menggunakan penghapusan diawal stack (delfirst). KAMUS UMUM Type infotype :...{type terdefinisi, menyimpan informasi elemen stack} Type Address: pointer to ElmtStack Type ElmtStack: <Top: Address> S: Stack {cara penulisan : Top (S) dituliskan S.Top Info (P) dituliskan P . Info Next (P) dituliskan P . Next Primitif Alokasi : Allocate (P) Dealokasi : Dealocate (P)} Function StackEmpty (S: Stack) boolean {mengirimtrue jika stack kosong dan false jika stack kosong} Kamus : Algoritma: (S.TOP = Nil) Procedure CreateStack(Output S:Stack) {IS: sembarang} {FS:Stack S tercipta, Top = Nil} Kamus : Algoritma: S.TOP Nil Procedure Popkon(input/output S : Stack, input P: Address) {IS: Stack S terdefinisi, mungkin kosong} Procedure PushP (input/output S : Stack, {FS: jika stack kosong, tulis pesan “stack input P: Address) {IS: Stack S terdefinisi, mungkin kosong, P = kosong” Jika Stack tidak kosong P adalah alamat Nil} Top sebelum Pop, Stack mungkin menjadi {FS: jika masih tersedia tempat maka E menjadi elemen paling baru dari stack S, jika kosong}} Kamus : tidak tersedia tempat lagi tampilkan pesan Algoritma: „overflow‟} P S.Top Kamus : If not StackEmpy (S) then Algoritma: S.Top S.Top . Next If Not stackEmpty (S) then P .Next Latihan Soal x 3 y 5 createstack (s) S.Top push (s,x) push (s,4) pop (s,z) push (s,y) push (s,3) push (s,z) pop (s,x) push(s,2) push(s,x) while not EmptyStack (s) do pop (s,x) output(x) {endwhile} y 1 createStack (S) push (S,5) pop (S,X Z X+Y Pop (S,X) Push (S,3) Push(S,Z) Pop (S,X) Push(S,2) Push(S,X) while not EmptyStack (s) do pop (s,x) output(x) {endwhile} ANTRIAN (QUEUE) 4.1 Pengertian Antrian Antrian atau queue adalah salah satu konsep struktur data yang memiliki sistem kerja pertama masuk maka akan menjadi yang pertama keluar (FIFO = First In First Out) Last First masuk keluaran Antrian (Queue) Gambar representasi Antrian Pada sebuah antrian elemen hanya dapat ditambahkan melalui sisi belakang queue dan elemen hanya dapat diambil dari sisi bagian depan queue. Oleh karena itu, ada dua penunjuk elemen pada sebuah queue yaitu belakang atau last sebagai penunjuk elemen paling belakang dan depan atau first sebagai penunjuk elemen bagian depan. Kondisi antrian yang menjadi perhatian adalah: 1. Penuh Bila elemen pada antrian mencapai kapasitas maksimum antrian. Pada kondisi ini tidak mungkin dilakukan penambahan keantrian. Penambahan elemen menyebabkan kondisi kesalahan overflow. 2. Kosong Bila tak ada elemen pada antrian. Pada kondisi ini tidak mungkin dilakukan pengambilan elemen dari antrian. Pengambilan elemen menyebabkan kondisi kesalahan underflow. 4.5 Operasi pada Antrian Operasi yang dapat dilakukan pada antrian atau queue adalah memasukkan elemen dari sisi bagian belakang queue dan mengeluarkan elemen dari sisi depan queue. Last First masuk Last First keluaran Antrian (Queue) Antrian (Queue) Aturan Memasukkan Queue Last First Last First keluaran Antrian (Queue) Antrian (Queue) Antrian (queue) adalah list linier yang: 1. 2. 3. 4. Dikenali elemen pertama (Head) dan terakhirnya (Tail) Penyisipan elemen selalu dilakukan setelah elemen terakhir Penghapusan elemen selalu dilakukan pada elemen pertama Elemen yang satu dengan yang lain diakses melalui Next. Contoh: Antrian tersebut berisi 6 elemen yaitu A,B,C,D,E dan F. Elemen A terletak dibagian depan antrian, elemen F terletak dibelakang antrian. Depan/Front A B C D E F Belakang/Tail Memasukkan elemen G maka penambahan elemen dilakukan dibelakang Depan/Front A B C D E F G Belakang/Tail Jika ada elemen yang dihapus maka elemen A akan dihapus terlebih dahulu Depan/Front A B C D E F G Belakang/Tail Function QEmpty (Q: Queue) boolean {mengirim true jika antrian kosong dan false jika antrian kosong} Kamus : Algoritma: (Q.Head = Nil) and (Q.Tail = Nil) Procedure CreateStack(Output Q:queue) {IS: sembarang} {FS:terbentuk sebuah queue yang kosong} Kamus : Algoritma: Q.Head Nil Q.Tail Nil rocedure InsertQ (input/output Q : Queue, input P: Address) {IS: antrian Q terdefinisi, mungkin kosong P sudah dialokasi, P = Nil, Next (P) = Nil} {FS: P menjadi elemen Tail dari antrian Q} Kamus : Algoritma: Memeriksa antrian kosong Pembuatan queue kosong Penambahan sebuah elemen pada antrian If QEmpty (Q) then Head (Q) P Else Next (tail (Q)) P Tail (Q) P Procedure DeleteQ (input/output Q : Queue, output P: Address) {IS: Q terdefinisi, tidak kosong } {FS: P adalah alamat yang diambil, P = Nil, Next (P) = Nil, antrian mungkin jadi kosong} Kamus : Algoritma: P Head (Q) Head (Q) Next (Head(Q)) If Head (Q) = Nil then Tail (Q) Nil Else Next (P) nil Penghapusan sebuah elemen pada antrian Representasi Statis Queue dengan representasi statis biasanya diimplementasikannya dengan menggunakan array. Sebuah array memiliki tempat yang dialokasikan diawal sehingga sebuah elemen yang dimasukkan dalam sebuah array terbatas pada tempat yang ada pada array. Karena menggunakan array maka queue dengan representasi statis dapat mengalami kondisi elemen penuh. 8 7 6 5 4 3 2 1 first/Front Last/belakang Karena menggunakan array yang tidak dapat diubah strukturnya secara dinamis maka operasi mengeluarkan elemen dari queue dengan representasi statis perlu penanganan secara khusus yaitu menggeser semua elemen kedepan begitu ada elemen yang dikeluarkan dari queue, agar lebih jelas. 8 7 6 5 4 3 2 Last/belakang 8 7 6 first/Front 5 4 3 2 1 first/Front Last/belakang Procedure InsertQ (input/output Q : Queue, input ElmtQ: infotype) {IS: Q mungkin kosong, ElmtQ terdefinisi} FS: elemen Tail dari Q bernilai ElmtQ } {menyisipkan sebuah elemen ElmtQ sebagai Tail} Kamus : Algoritma: If QEmpty (Q) then Qtail 1 QHead 1 QTabElmtQQtail elmtQ Else If (Qtail < Nmax) then Qtail Qtail + 1 QTabElmtQQtail elmtQ Else Output („overflow‟) Head Head 50 75 100 150 1 2 3 4 5 Tail Nmax = 5 Head = 1 Tail = 4 Head 50 Tail 75 100 150 25 Nmax = 5, Inset (Q,25) 1 2 3 4 5 Head = 1 Tail = 5 X=25 Procedure DeleteQ (input/output Q : Queue, input ElmtQ: infotype) {IS: Q tidak kosong FS: elemen yang dihapus disimpan informasinya pada ElmtQ, ElmtQ digeser} {menyisipkan sebuah elemen ElmtQ sebagai Tail} Kamus : Algoritma: QEmpty Q.TabElmtQQ.Head If (Qtail = Qhead) then (ada lebih dari satu elemen, geser semua elemen sisa) I traversal [2..Qtail] QtabElmtQ1-1 QtabElmtQ1 Qtail Qtail -1 Else QTail Nol Q.Head Nol Head 50 75 100 150 200 1 2 3 4 5 Tail Head =1 Tail = 5 x = 200 Head 75 100 150 200 1 2 3 4 Delete Q(Q,x) 5 Tail Head = 2 Tail = 4 x=50 Procedure InsertQ (input/output Q : Queue, input ElmtQ: infotype) {IS: Q mungkin kosong, ElmtQ terdefinisi} FS: elemen Tail dari Q bernilai ElmtQ } {menyisipkan sebuah elemen ElmtQ sebagai Tail} Kamus : Algoritma: If QEmpty (Q) then Qtail 1 QHead 1 QTabElmtQQtail elmtQ Else If (Qtail < Nmax) then Qtail Qtail + 1 QTabElmtQQtail elmtQ Else If (Qhead > 1) then For ( i Qhead to Qtail do) QTabElmtQ[i-Qhead + 1] QtabElmtQ[i] End for Qtail Qtail – Qhead+1` Qhead 1 Qtail Qtail +1 QtabElmtQ[Qtail] Else Write (overflow) Endif ElmtQ Head = 3; tail =5 Nmax =5 Head 5 10 15 20 25 1 2 3 4 5 Tail Inser (Q,100) Head 15 20 25 100 1 2 3 4 Head = 1 5 Tail Tail = 4 Overflow? Tdk Procedure InsertQ (input/output Q : Queue, input ElmtQ: infotype) {IS: Q mungkin kosong, ElmtQ terdefinisi} FS: elemen Tail dari Q bernilai ElmtQ } {menyisipkan sebuah elemen ElmtQ sebagai Tail} Kamus : NewTail : Address Algoritma: If Qcount = Nmax then Output („overflow‟) Else Newtail Qhead + Qcount If Newtail > Nmax then Newtail Newtail – Nmax QTabElmtQQtail elmtQ Qcount Qcount + 1 Z Count = 2 Newtail Head = 7 X Head Y Z Count = 3 Head = 7, Tail Tail =1 Head x Y Z Head = 5,Tail = 1 Count = 5 Elmt =‟A‟, Nmax = 8 P Q 1 R 2 S 3 T U V W 4 5 6 7 T U V W 4 5 6 7 8 Insert (Q,Elmt) Head = 5, Tail = 2 Count = 6 P A 1 2 3 8 Procedure DeleteQ (input/output Q : Queue, input ElmtQ: infotype) {IS: Q tidak kosong} FS: element yang dihapus disimpaninformasinyapada elmtQ {elemen Q berkurang satu} Kamus : Algoritma: ElmtQ QTabElmtQQhead Qcount Qcount -1 if Qempty(Q) or Head = Nmax then Qhead 1 else QHead Qhead + 1 Head = 5, Tail = 2 Count = 6 P A 1 2 3 T U V W 4 5 6 7 U V W P 4 5 6 7 8 Delete(Q, T) Head = 5, Tail = 1 Count = 5 A 1 2 3 8 Representasi Dinamis Queue dengan representasi Dinamis biasanya diimplementasikan dengan menggunkan pointer yang menunjuk pada elemen-elemen yang dialokasikan pada memori. head Tail Karena semua operasi penambahan elemen pada sebuah queue ditambahkan pada akhir queue maka jika menggnakan representasi dinamis saat elemen ditambahkan akan menggunakan penambahan elemen pada akhir queue(addlast) dan saat pengambilan atau penghapusan elemen menggunakan penghapusan diawal queue (delfirst). Procedure insetQP (input/output Q : Queue, input P: Address) {IS: Q terdefinisi, mungkin kosong, P terdefinisi next(P) = nil} {FS:tail yang baru adalah P} Kamus : Algoritma: If EmptyQ(Q) then Qhead Qtail else Qtail Qtail . Next P P P P Procedure DeleteQP (input/output Q : Queue, input P: Address) {IS: Q tidak kosong {FS:P adalah elemen yang dihapus, Q mungkin kosong} Kamus : Algoritma: P Qhead QHead Qhead .Next P . Next Nil If (Qhead = Nil) then QTail = Nil Prioritas (Priority Qeue) Antrian dengan Antrian berprioritas ataun priority queue mengeluarkan elemen dari queue berdasarkan prioritas pada elemen itu, oleh karena itu elemen pada antrian berprioritas untuk menyimpan nilai prioritas pada setiap elemn. Untuk memasukkan elemen pada sebuah antrian erprioritas tidak harus melalui sisi belakang antrian disisipkan dan diurutkan berdasarkan prioritas elemen, sedangkan mengeluarkan elemne dari antrian berdasarkan prioritas elemen. Hal yang perlu diperhatikan saat memasukkan elen ke antrian berprioritas adalah sebagai berikut : 1. Elemen yang memiliki prioritas leih tinggi akan leih dahulu keluar dari queue 2. Jika ada dua elemen yang memiliki prioritas sama maka yang akan keluar terlebih dahulu dari antrian adalah yang terlebih dahulu masuk kedalam antrian. Operasi memasukkan elemen pada antrian berprioritas adalah sebagai berikut: Elemen baru 3 head 1 2 4 6 9 12 Tail 3 Tail head 1 2 4 6 9 12 Hasil : 1 2 head 3 4 6 9 12 Tail Procedure InsertPrioQ (input/output PrioQ : Queue, input P : address) {IS: Q terdefinisi, tidak kosong, Pterdefinisi} p FS: P menjadi elemen antrian sesuai dengan Prio(P) } {P disiisipkan dalam antrian sesuai dengan prioritasnyal} Kamus : Pt, Prec : Address Found : Boolean Algoritma: If Qempty(Q) then Qhead P Qtail P Else Found false Prec Nil Pt head(Q) While ( Pt = Nil) and (not found) do If Prio(Pt) > Prio (P) then Found True Else Prec Pt Pt Next(Pt) {Endwhile, Pt = Nil or found} If prec = nil then {sisip dielemen ke 1} Next (P) Pt head(Q) P else if found then {sisip ditengah} Next(P) Pt Next (tail(Q)) P Else{sisip dielemen ke 1} Next(Tail(Q)) P Tail(Q) P Tugas 3. Insert(Q,H) 1. Bagaimana keluaran dari potongan berikut: InitQ(Q) InsertQ(Q,5) 5 InsertQ(Q,6) InsertQ(Q,7) InsertQ(Q,8) DeleteQ(Q,X) DeleteQ(Q,Y) InsertQ(Q,X) InsertQ(Q,5) InsertQ(Q,Y+1) DeleteQ(Q,X) InsertQ(Q,Y) While no emptyQ(Q) do Delete(Q, X) Output (X) {endwhile} 2. a. Head = 1, Tail = 4 A A B C D D G 1 M 2 K algoritma 3 head = 3.,tail = 2.,Count =........ 4. Delete(Q, ElmtQ) dari data diatas E Setelah operasi InsertQ (Q,‟F‟) maka keadaan anrian menjadi 4 Head = .., Tail = ... Overflow? b.Head = 5, Tail = 3 A B C D E Setelah operasi Delete (Q,‟ElmtQ‟) maka keadaan anrian menjadi Head = ...., Tail = ....., elmt=...., overflow? Head = 3, Tail = 3 A B C D E Setelah operasi InsertQ (Q,‟F‟) maka keadaan anrian menjadi Head = .., Tail = ... Overflow? 1. Bagaimana keluaran dari potongan algoritma berikut: InitQ(Q) X 5 Y 7 InsertQ(Q,X) InsertQ(Q,8) InsertQ(Q,y) DeleteQ(Q,z) InsertQ(Q,2) InsertQ(Q,z) InsertQ(Q,6) If Z = 0 then While not emptyQ9Q) do DeleteQ(Q, X) Output (X) {endwhile} Else Output(„selesai‟) 2. a. Nmax=5, Head = 1, Tail = 4 10 20 30 40 50 Setelah operasi InsertQ (Q,‟60‟) maka keadaan anrian menjadi Head = .., Tail = .., X=... Overflow? b. Nmax=5, Head = 1, Tail = 4 10 20 30 40 50 Setelah operasi DeleteQ (Q,‟elmtQ‟) maka keadaan anrian menjadi Head = .., Tail = ..., ElmtQ=.... Overflow? 3. a. Nmax=5, Head = 5, Tail = 4 30 50 70 90 100 Setelah operasi InsertQ (Q,‟200‟) maka keadaan anrian menjadi Head = .., Tail = ..., X=....,Overflow? b. Nmax=5, Head =5, Tail = 3 30 50 70 90 100 Setelah operasi DeleteQ (Q,‟elmtQ‟) maka keadaan anrian menjadi Head = .., Tail = ...,ElmtQ=......,Overflow? 4. a. Head = 1, Tail = 4 10 20 30 40 50 Setelah operasi InsertQ (Q,‟60‟) maka keadaan anrian menjadi Head = .., Tail = .....,X=......,count=....., Overflow? b. Head = 1, Tail = 3 10 20 30 40 50 Setelah operasi DeleteQ (Q,‟elmtQ‟) maka keadaan anrian menjadi Head = .., Tail = .., elmtQ=......,count=........, Overflow? 5. a. Head = 3, Tail = 5 30 50 70 90 100 Setelah operasi InsertQ (Q,‟200‟) maka keadaan anrian menjadi Head = .., Tail = ..., X=......, count=......,Overflow? b. Head = 2, Tail =5 30 50 70 90 100 Setelah operasi DeleteQ (Q,‟elmtQ‟) maka keadaan anrian menjadi Head = .., Tail = ..., elmtQ=...., count=....,Overflow? 6. a. Head = 1, Tail = 4 10 30 60 70 90 Setelah operasi InsertQ (Q,‟40‟) maka keadaan anrian menjadi Head = .., Tail = ..,X=... b. Head = 1, Tail = 5 10 30 60 70 90 Setelah operasi DeleteQ (Q,‟60‟) maka keadaan anrian menjadi Head = .., Tail = ...,X=..... POHON (TREE) 5.1 Pengertian Pohon Pohon atau tree adalah salah satu bentuk konsep struktur data yang terdiri dari akar dan simpul-simpul yang berada dibawah akar. Misalnya pohon sisilah keluarga, struktur organisasi,dll. Pada gambar dibawah sebuah KOTAK dianggap sebagai SIMPUL (node atau vetex) sedangkan simpul yang paling atas yang berisi “Ketua Umum” dianggap sebagai AKAR (root). Bagian simpul “Wakil Ketua 1” kebawah disebut sebagai SUBPOHON (subtree) begitu juga dengan simpul “Wakil ketua 2” kebawah. 1 Ketua Umum A 2 Wakil Ketua 1 B Kepala Devisi Keuangan D Wakil ketua 2 C Kepala Divisi kekeluargaan E Kepala Divisi Produksi F 3 Kepala Divisi pemasaran G 4 Bendahara 2 h Bendahara 1 i Staf Administrasi j Pengembang K Staf Pemasaran L Anak(child) dan Orang tua (parent) Jika X adalah Simpul, maka akar tiap-tiap subpohon dari X disebut anak, dan X adalah orang tua setiap akar subpohon. Pada gambar diatas, B dan C adalah anak dari A, dan A adalah orang tua dari anak-anaknya itu. Begitu juga F,G adalah anak dari C, dan C adalah orang tua dari F,G Derajad (degree) Derajad adalah jumlah subpohon pada setiap simpul/ banyaknya tingkat simpul turunan dari suatu simpul tertentu, Misal : “Ketua Umum(A) memiliki derajad 2, Kepala Divisi kekeluargaan(E) memiliki derajad 1, dsb. Daun (Leaf) Simpul yang mempunyai derajat nol disebut daun. H,i,j,k,l adalah daun dari pohon pada gambar 1. Daun sering dinamakan simpul terminal atau yang tidak mempunyai subpohon. Dalam struktur pohon juga dukenal istilah kedalaman (depth). Simpul bukan terminal disebut simpul dalam (internal nodes). Lintasan (path) Lintasan dari simpul n1 ke simpul simpul nk adalah runtunan simpul n1, n2,..,nk sedemikian sehingga n1 adalah orang tua dari n(i+1) untuk 1>/ < k. Pohon pada gambar 1, lintasan dari A ke J adalah A,B,E,J. Lintasan dari B ke i adalah A,B,D,I. Panjang lintasan adalah jumlah sisi yang dilalui dalam suatu lintasan. Panjang lintasan dari A ke i adalah 3, Panjang lintasan dari C ke K adalah 2. A B E C F G D H I MENGGUNAKAN NOTASI KURUNG : (A ( B ( E, F ), C ( G ), D ( H, I ) ) 5.2 POHON BINER Pohon Biner atau binary tree adlah pohon yang setiap simpulnya memiliki simpul turunan atau sub pohon maksimal dua yang disebut sebagai pohon kiri (left subtree) dan subpohon kanan (right subtree). Jenis-jenis pohon iner sebagai berikut: Pohon biner lengkap (complete binary tree) yaitu pohon biner yang setiap simpulnya mempunyai dua buah simpul turunan. A B E Pohon biner condong kekiri (Left skewed binary tree) B C E F D I H G A Pohon biner condong kanan (right skewed binary tree) D i A Pohon biner sembarang B E C F G Contoh pohon dan representasinya dengan larik 30 14 21 70 8 15 12 10 11 27 Representasi dengan larik 1 2 3 4 5 6 info 30 14 70 21 8 12 kiri 2 4 6 8 0 0 kanan 3 5 7 0 0 0 7 8 9 10 15 10 11 27 9 0 0 0 10 0 0 0 5.2.1 Operasi pada Pohon Biner Operasi yang dapat dilakukan pada pohon biner antara lain kunjungan terhadap simpulsimpulnya. Jenis-jenis knjungan pada pohon biner antara lain preorder, inorder, postorder, dan levelorder. Kunjungan dengan orientasi LRO(Left to Riight Oriented) dimana kunjungan selalu dimulai dari supohon kiri baru kemudian supohon kanan. Juga ada RLO (Right to Left Oriented) dimana kunjungan selalu dimulai dari subpohon kanan baru kemudian kesubpohon kiri. PreOrder Kunjungan preorder merupakan kunjungan pada pohon biner yang dimulai dari akar kemudian kesubpohon kiri dikunjungi baru kesubpohon kanan dikunjungi. Maka : A – B – D – E – C – F – G - H A B D C E G F H Maka dengan kunjungan preorder akan menghasilkan urutan simpul yang dikunjungi A – B – D – E – C – F – G – H. InOrder Kunjungan inorder merupakan kunjungan pada pohon biner yang dimulai dari simpul-simpul turunan subpohon kiri, akar, baru kemudian simpul-simpul turunan pada supohon kanan, misalnya pada contoh diatas maka kunjungan inorder menghasilkan simpul yang dikunjungi D – B – E – A – F – C –H – G. PostOrder Kunjungan postorder merupakan kunjungan pada pohon biner yang dimulai dari simpulsimpul turunan subpohon kiri, baru kemudian simpul-simpul turunan pada subpohon kanan, kemudian akar, Misalnya pada contoh diatas maka dengan kunjungan postordermenghasilkan urutan simpul yang dikunjungi D – E – B –F – H – G – C –A. Menyalin dan Membandingkan Pohon Biner Menyalin pohon biner ke pohon biner lainnya dapat dilakukan dengan menggunakan salah satu operasi kunjungan sambil membuat simpul baru yang sama dengan simpul yang disalin sebagai simpul pohon biner hasil dari penyalinan pohon biner yang disalin. Egitu juga dengan membandingkan dua buah pohon biner, jika semua simpul yang dikunjungi sama maka dapat dikatakan bahwa dua buah pohon biner merupakan pohon biner yang sama. Contoh; * PreOrder : * + a / b c – d *e f (prefix) + - InOrder (infix) a * d / :a + b / c * d – e * f Postorder : a b c / + d e f * - * (postfix) b C f e Procedure PreOrder (input T : pohon_biner) {mengunjungi simpul pohon secara preorder IS: T mungkin kosong} {FS:semua simpul T sudah dikunjungi secara preorder} Kamus : Algoritma: If T = then Proses (Info(T)) PreOrder(kiri(T)) PreOrder(kanan(T)) Procedure InOrder (input T : pohon_biner) {mengunjungi simpul pohon secara InOrder IS: T mungkin kosong} {FS:semua simpul T sudah dikunjungi secara InOrder} Kamus : Algoritma: If T = then InOrder (Kiri(T)) Proses (Info(T)) InOrder(kanan(T)) Procedure PostOrder (input T : pohon_biner) {mengunjungi simpul pohon secara postOrder IS: T mungkin kosong} {FS:semua simpul T sudah dikunjungi secara postOrder} Kamus : Algoritma: If T = then PostOrder(kiri(T)) PostOrder(kanan(T)) Proses (Info(T)) Procedure cariX (input T : pohon_biner, x: infotype output ketemu : boolean) {mengunjungi apakah X terdapat didalam pohon} IS: T mungkin kosong, x adalah info yang dicari} {FS:ketemu=true jika X ditemukan, false jika tdk} Kamus : Algoritma: If T = then Ketemu false else if info(T) = X then ketemu true Mencari apakah X terdapat didalam pohon T else CariX(kiri(T), X, ketemu) CariX(kanan(T), X, ketemu) Pohon n-er Pengertian pohon n-er Pohon n-er adalah struktur pohon yang memiliki simpul turunan lebih dari dua. A B C E F D I H G K L M Pada sebuah pohon n-er juga dapat dilakukan kunjungan pada simpul-simpulnya seperti halnya pada pohon biner, misalkan jika pohon pada gambar diatas dikunjungi secara preorder akan menghasilkan urutan simpul A – B – E – F – C – G – D – H – I – J – K – L M. Jika dilakukan kunjungan secara post order akan menghasilkan urutan simpul E – F – B – G – C – H – I - K – L – M – J – D – A. CONTOH ; a*b – 3^x - * a ^ b 3 X GRAF(GRAFH) GRAF(GRAFH) adalah sebuah konsep struktur data yang terdiri dari kumpulan simpul (node) dan garis (arc). Sebuah garis harus diawali dan diakhiri dengan sebuah simpul. Misalnya garis a dinyatakan dengan a={A, B) diartikan bahwa garis a diawali dengan simpul A dan diakhiri dengan simpul B sedangkan simpul yang terhubung dengan sebuah garis e disebut dengan simpul tetanggga sehingga dapat dikatakan simpul A bertetangga dengan B E i simpul B.a b g A G D h d c F C f Pada sebuah Graf juga terdapat istilah yang disebut jalur (path) dimana jalur adalah kumpulan garis dan simpul yang berawal dari suatu simpul menuju simpul tertentu, misal P adalah sebuah jalur dari simpul A ke simpul G maka dapat dinyatakan bahwa P={A,B,E,G}. Sebah jalur yang memiliki simpul akhir sama dengan simpul awal disebut dengan jalur tetutup (closed path) sedangkan jalur yang terbentuk dari simpul-simpul yang berbeda disebut dengan jalur sederhanan (simple path) seperti halnya jalur dari simpul A ke simpul G. Sebuah graf dikatakan sebagai graf lengkap (complete graph) jika dari semua simpul yang ada dapat dibuat sebuah garis ke semua simpul yang lain. B e a d D A c b f C Sebuah graf disebut graf terhubung (connected graph) jika semua simpul yang ada terhubung dengan minimal satu simpul lain seperti pada gambar diatas tidak ada sebuah simpul yang berdiri sendiri. Sebuah graf pada garisnya memiliki arah disebut dengan graf berarah (directed graph) seperti gambar. Dimana pada graf berarah sebuah garis atau jalur harus ditulis sesuai dengan f arah yang ada pada graf. B a E d c g A i D e b F h C Implementasi Graf Representasi statis Sebuah graf dapat diimplementasikan dengan representasi statis dengan menggunakan array. Ada beberapa cara mengimplementasikan sebuah graf dengan menggunakan sebuah array: a. Matrik tetangga Matrik tetangga merupakan salah satu cara untuk merepresentasikan graf berarah dengan menggunakan array. Dimana angka 1 (satu) menyatakan bahwa simpul awal tidak mempunyai jalur ke simpul tujuan. Simpul-simpul yang memiliki jalur adalah sebagai berikut: A B C D E F SIMPUL AWAL A 0 1 O O O 0 B 0 0 0 1 1 0 C D 1 1 0 0 0 1 0 0 0 0 0 0 E 0 0 0 1 0 1 F 0 0 0 1 0 0 SIMPUL TUJUAN Simpul A memiliki jalur dan bertetangga dengan simpul B Simpul B memiliki jalur dan bertetangga dengan simpul D dan E Simpul C memiliki jalur dan bertetangga dengan simpul A Simpul D memiliki jalur dan bertetangga dengan simpul A dan C Simpul E memiliki jalur dan bertetangga dengan simpul D dan F Simpul F memiliki jalur dan bertetangga dengan simpul D Implementasi dengan bahasa algoritmik : Matgraph : array [1..6, 1..6] of integer (0, (0, (1, (1, (0, (0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0), 0), 0), 0), 1), 0) f E B a d c g A i D e b h F C Matrik Jalur Matrik jalur merupakan salah satu cara untuuk merepresentasikan graf berarah dengan menggunakan array. Dimana angka 1 (satu) menyatakan bahwa simpul awal tidak memiliki jalur ke simpul tujuan, dan angka 0 (nol) menyatakan bahwa simpul awal tidak memiliki jalur ke simpul tujuan. Bedanya dengan matrik tetangga, angka 1 menyatakan jika simpul awal bertetangga secara langsung dengan simpul tujuan, sedangkan matrik jalur, simpul awal tidak harus bertetangga secara langsung dengan simpul tujuan, asalkan ada jalur yang dari simpul awal ke simpul tujuan melewati simpul manapun maka dianggap bernilai 1. A B C D E F A 1 1 1 1 1 1 B 1 1 1 1 1 1 C D 1 1 1 1 1 1 1 1 1 1 1 1 E 1 1 1 1 1 1 F 1 1 1 1 1 1 Dari representasi diatas bahwa semua simpul dapat ditempuh dari simpul manapun. Implementasi dengan ahasa algoritmik: array [1..6, 1..6] of integer matgraph ={ (1, (1, (1, (1, (1, (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), 1), 1), 1), 1), 1) 3. Matrik Beban Matrik beban merupakan salah satu cara untuk merepresentasikan graf berrarah yang memiliki beban dengan menggunakan array. Matrik beban biasa digunakan untuk merepresentasikan graf berarah yang pada jalurnya terdapat nilai atau eban tempuh. Graf berarah yang memiliki beban biasanya digunakan untuk menggambarkan letakletak kota-kota besarta jarak tempuhnya. Representasi graf dengan menggunakan matrik beban: Dimana angka bukan nol menyatakan bahwa simpul awal memiliki jalur ke simpul tujuan dengan beban yang dituliskan pada matrik, dan angka 0 (nol) menyatakan bahwa simpul awal tidak memiliki jalur ke simpul tujuan. Pada dasarnya matrik beban sama dengan matrik tetangga hanya berbeda penanda adanya jalur, angka 1 (satu) pada matrik tetangga dan nilai beban pada matrik beban. 7 B 3 E 3 8 4 A 4 D 3 3 C A B C D E F A 0 3 O O O 0 B 0 0 0 3 7 0 C D 3 8 0 0 0 3 0 0 0 0 0 0 E 0 0 0 4 0 4 F 0 0 0 2 0 0 MATRIK BEBAN Matgraph : array [1..6, 1..6] of integer Matgraf = { (0, (0, (3, (8, (0, (0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 4, 2, 0, 7, 0, 0, 0, 0, 0), 0), 0), 0), 4), 0) CONTOH SOAL Buatlah graf yang memggunakan matrik tetangga: 2 F SIMPUL AWAL A B C D E F A 0 1 O O O 0 B 0 0 0 1 1 0 C D 1 1 0 0 0 1 0 0 0 0 0 0 E 0 0 0 1 0 1 F 0 0 0 1 0 0 SIMPUL TUJUAN