Apa itu yang dimaksud dengan algoritma dan struktur data ti

BAB. I PENDAHULUAN A. Definisi Algoritma dan Struktur Data Ditinjau dari asal usul katanya kata Algoritma sendiri mempunyai sejarah tertentu. Orang hanya menemukan kata Algorism yang berarti proses menghitung dengan angka arab. Anda dikatakan Algorist jika anda menghitung menggunakan Angka Arab. Para ahli bahasa berusaha menemukan asal kata ini namun hasilnya kurang memuaskan. Akhirnya para ahli sejarah matematika menemukan asal kata tersebut yang berasal dari nama seorang ahli matematika dari Uzbekistan Abu Abdullah Muhammad Ibnu Musa Al-Khuwarizmi (770-840). Al Khuwarizmi dibaca orang barat menjadi Algorism. Perubahan kata dari Algorism menjadi Algorithm muncul karena kata Algorism sering dikelirukan dengan Arithmetic, sehingga akhiran sm berubah menjadi thm. Karena perhitungan dengan angka Arab sudah menjadi hal yang biasa. Maka lambat laun kata Algorithm berangsur-angsur dipakai sebagai metode perhitungan (komputasi) secara umum, sehingga kehilangan makna kata aslinya. Dalam Bahasa Indonesia, kata Algorithm diserap menjadi Algoritma. Kita bisa mendefinisikan algoritma sebagai berikut: Algoritma adalah logika, metode dan tahapan (urutan) sistematis yang digunakan untuk memecahkan suatu permasalahan. Dan kamus besar bahasa Indonesia (Balai Pustaka 1988) secara formal mendefinisikan algoritma sebagai berikut: Algoritma adalah urutan logis pengambilan putusan untuk pemecahan masalah. B. Hubungan Algoritma dan Struktur Data Struktur Data adalah cara pengaturan data agar bisa disimpan memory komputer secara efisien. Struktur data diperlukan dikarenakan kapasitas dari komputer memiliki keterbatasan baik untuk memory maupun untuk kecepatannya. Program adalah kumpulan instruksi komputer, sedangkan metode dan tahapan sistematis dalam program algoritma. Program ini ditulis dengan menggunakan bahasa pemrograman. Jadi bisa kita sebut bahwa program adalah suatu implementasi bahasa pemrograman. Beberapa pakar memberi formula bahwa: program = struktur data + algoritma. Bagaimanapun juga struktur data dan algoritma berhubungan sangat erat pada sebuah program. Algoritma yang baik tanpa pemilihan struktur data yang tepat akan membuat program menjadi kurang baik, semikian juga sebaliknya. Menilai Sebuah Algoritma ketika manusia berusaha memecahkan masalah, metode atau teknik yang digunakan untuk memecahkan masalah kemungkinan bisa lebih dari satu. Dan kita memilih mana yang terbaik diantara teknik-teknik itu. Hal ini sama juga dengan algoritma, yang memungkinkan suatu permasalahan dipecahkan dengan metode dan logika yang berlainan. Lalu bagaimana mengukur mana algoritma yang terbaik? Beberapa persyaratan untuk menjadi algoritma yang baik adalah: a. Tingkat kepercayaannya tinggi ( realibility). Hasil yang diperoleh dari proses harus berakurasi tinggi dan benar. b. Pemrosesan yang efisien ( low cost). Proses harus diselesaikan secepat mungkin dan jumlah kalkulasi yang sependek mungkin. c. Bersifat general. Bukan sesuatu yang hanya untuk menyelesaikan satu kasus saja, tapi juga untuk kasus lain yang lebih general. d. Bisa dikembangkan (expandable). Haruslah sesuatu yang dapat kita kembangkan lebih jauh berdasarkan perubahan requirement yang ada. e. Mudah dimengerti. Siapapun yang melihat, dia akan bisa memahami algoritma anda. Sulit dimengertinya suatu program akan membuat sulit pengelolaan. f. Portabilitas yang tinggi (portability). Bisa dengan mudah diimplementasikan di berbagai platform komputer. Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 1

Meskipun setiap komputer berbeda teknologinya, tetapi secara umum semua komputer dapat melakukan operasi - operasi dasar dalam pemrograman seperti operasi pembacaaan data, operasi perbandingan, operasi aritmatika, dan sebagainya. Perkembangan teknologi komputer tidak mengubah operasi-operasi dasar itu. Yang berubah hanyalah kecepatan, biaya, atau tingkat ketelitian. Pada sisilainnya setiap program dalam bahasa tingkat tinggi selalu diterjemahkan ke dalam bahasa mesin (1-0) sebelum akhirnya dikerjakan oleh CPU. Setiap instruksi dalam bahasa mesin menyajikan operasi dasar yang sesuai, dan menghasilkan efek yang sama pada setiap komputer. Algoritma yang baik disertai dengan struktur data yang tepat mampu untuk menjadikan program yang baik. Pemilihan algoritma dan struktur data yang tepat harus mempertimbangkan skala data, CPU, memori, serta perlu pengetahuan algoritma dan struktur apa saja yang ada dan mungkin dipakai. Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 2

BAB. II REPRESENTASI STRUKTUR DATA Dalam struktur data metode digunakan untuk menyusun data dengan efisien yang memperhatikan unsur seperti : type data, koleksi objek, operasi dan sebagainya. Koleksi adalah type data yang berupa rangkaian atau kumpulan data ataupun obyek yang berindeks. Struktur data standard memiliki elemen dengan berbagai type. Koleksi Objek Generik adalah type dari elemen yang ditentukan sewaktu sebuah objek dibuat. sebuah koleksi objek dilakukan dalam tiga tingkatan : a. Definisi fungsional b. Representasi lojik c. Representasi (implementasi) fisik A. Definisi Fungsional Definisi fungsional adalah pendefinisan nama struktur data dan operator-operator yang berlaku pada struktur data tersebut. Membahas tentang nama type dan semua operasi yang dilakukan terhadap type. Secara umum, operasi fungsional terdiri dari : 1. Pembuatan/penciptaan (konstruktor) 2. Penambahan (add, insert) 3. Penghapusan (delete) 4. Perubahan (update) 5. Penggabungan 6. Operasi-operasi lain Selain itu, ada operasi fungsional yang bersifat informasi, misalnya: 1. Selektor 2. Predikat-predikat khusus terhadap type 3. Membership (untuk koleksi objek) Pada tingkatan ini, definisi type sama dengan definisi yang pernah dipelajari pada Dasar pemrograman, dalam notasi Fungsional. B. Representasi Lojik Representasi lojik adalah spesifikasi type dari struktur, yang menyangkut nama type dan spesifikasi semua operator, namun dalam definisi type ini, alamat masih belum ditentukan secara pasti. Representasi lojik tidak tergantung pada memori komputer. Struktur ini memudahkan pemrogram untuk merancang data dan algoritma, serta tidak bergantung pada mesin apapun. Pada konsteks prosedural, pada definisi ini, didefinisikan dengan lebih jelas, operator fungsional menjadi fungsi atau prosedur, dengan spesifikasi parameter yang lebih jelas. Selain itu, dapat pula didefinisikan primitif lain yang secara khusus erat hubungannya dengan prosedural yaitu traversal atau search. C. Representasi (Implementasi) Fisik Representasi fisik adalah spesifikasi dari struktur data sesuai dengan implementasinya dalam memori komputer. Pada dasarnya, hanya ada dua macam implementasi fisik : kontigu atau berkait. Representasi fisik kontigu adalah sekumpulan data yang penempatannya dalam memori setiap elemen ditaruh secara berturutan posisi alamatnya dengan elemen lain. Karena itu untuk mencapai satuan elemen berikutnya, cukup melalui suksesor alamat yang sedang "current". Supaya suksesor tetap terdefinisi, maka tempat yang dialokasikan untuk struktur ini sudah ditetapkan sebelumnya, supaya data tidak "kemana-mana". Dikatakan bahwa struktur ini adalah struktur yang statis, karena alokasi memori dilakukan sekaligus untuk seluruh koleksi. Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 3

Representasi fisik berkait adalah sekumpulan data yang penempatannya pada memori komputer dapat terpencar-pencar, namun dapat ditelusuri berkat adanya informasi berupa alamat, yang menghubungkan elemen yang satu dengan yang lain. Karena alamat untuk mencapai elemen yang lain ada secara eksplisit, maka alamat yang bakal dipakai dapat saja dialokasikan pada waktunya atau sudah ditetapkan dari awal. Jika alokasi alamat baru diadakan pada waktu diperlukan dan juga dapat dikembalikan, maka memori yang dipakai bisa membesar dan mengecil sesuai dengan kebutuhan. Dikatakan bahwa struktur ini adalah struktur yang dinamis. Sebuah representasi lojik yang sama dapat diimplementasikan dalam satu atau beberapa struktur fisik. Jadi satu representasi lojik dapat mempunyai banyak kemungkinan implementasi fisik. Justru pemilihan struktur fisik yang tepat yang akan menentukan performansi (pemakaian memori dan kecepatan proses) dari program. Perancangan struktur data yang tepat merupakan bagian yang penting pada diktat ini, di samping pemilihan skema program yang sesuai terhadap struktur yang didefinisikan, sesuai dengan skema yang pernah dipelajari pada buku bagian I. Hal ini akan dipelajari melalui kasuskasus yang ditulis pada bagian akhir buku ini. Ilustrasi struktur data yang umum dipakai untuk setiap struktur tersebut adalah : Gambar 2.1. Beberapa Bentuk Penyusunan Data dalam Struktur Data Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 4

D. Abstract Data Type (ADT) ADT adalah definisi TYPE dan sekumpulan PRIMITIF (operasi dasar) terhadap TYPE tersebut. Selain itu, dalam sebuah ADT yang lengkap, disertakan pula definisi invarian dari TYPE dan aksioma yang berlaku. ADT merupakan definisi statik. Definisi type dari sebuah ADT dapat mengandung sebuah definisi ADT lain. Misalnya: 1. ADT Waktu yang terdiri dari ADT JAM dan ADT DATE 2. GARIS yang terdiri dari dua buah POINT 3. SEGI4 yang terdiri dari pasangan dua buah POINT (Top, Left) dan (Bottom,Right) Type diterjemahkan menjadi type terdefinisi dalam bahasa yang bersangkutan, misalnya menjadi record dalam bahasa Ada/Pascal atau struct dalam bahasa C. Primitif, dalam konteks prosedural, diterjemahkan menjadi fungsi atau prosedur. Primitif dikelompokkan menjadi : 1. Konstruktor/Kreator, pembentuk nilai type. Semua objek (variabel) ber type tersebut harus melalui konstruktor. Biasanya namanya diawali Make. 2. Selektor, untuk mengakses komponen type (biasanya namanya diawali dengan Get) 3. Prosedur pengubah nilai komponen (biasanya namanya diawali Get) 4. Validator komponen type, yang dipakai untuk mentest apakah dapat membentuk type sesuai dengan batasan 5. Destruktor/Dealokator, yaitu untuk menghancurkan nilai objek (sekal igus memori penyimpannya) 6. Baca/Tulis, untuk interface dengan input/output device 7. Operator relational, terhadap type tersebut untuk mendefinisikan lebih besar, lebih kecil, sama dengan, dsb 8. Aritmatika terhadap type tersebut, karena biasanya aritmatika dalam bahasa pemrograman hanya terdefinisi untuk bilangan numerik 9. Konversi dari type tersebut ke type dasar dan sebaliknya ADT biasanya diimplementasi menjadi dua buah modul, yaitu: 1. Definisi/Spesifikasi Type dan primitif. 2. Spesifikasi type sesuai dengan bahasa yang bersangkutan. 3. Spesifikasi dari primitif sesuai dengan kaidah dalam konteks prosedural, yaitu: 4. Fungsi : nama, domain, range dan prekondisi jika ada 5. Prosedur : Initial State, Final State dan Proses yang dilakukan 6. Body/realisasi dari primitif, berupa kode program dalam bahasa yang bersangkutan. Realisasi fungsi dan prosedur harus sedapat mungkin memanfaatkan selektor dan konstruktor. Supaya ADT dapat di-test secara tuntas, maka dalam kuliah ini setiap kali membuat sebuah ADT, harus disertai dengan sebuah program utama yang dibuat khusus untuk men-test ADT tersebut, yang minimal mengandung pemakaian (call) terhadap setiap fungsi dan prosedur dengan mencakup semua kasus parameter. Program utama yang khusus dibuat untuk test ini disebut sebagai driver. Urutan pemanggilan harus diatur sehingga fungsi/prosedur yang memakai fungsi/prosedur lain harus sudah ditest dan direalisasi terlebih dulu. Realisasi ADT dalam beberapa bahasa. Gambar 2.1. Realisasi ADT Dalam Beberapa Bahasa Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 5

Dalam modul ADT tidak terkandung definisi variabel. Modul ADT biasanya dimanfaatkan oleh modul lain, yang akan mendeklarasikan variabel bertype ADT tersebut dalam modulnya. Jadi ADT bertindak sebagai Supplier (penyedia type dan primitif), sedangkan modul pengguna berperan sebagai Client (pengguna) dari ADT tersebut. Biasanya ada sebuah pengguna yang khusus yang disebut sebagai main program (program utama) yang memanfaatkan langsung type tersebut Contoh dari ADT diberikan dalam bahasa Algoritmik, yaitu : 1. ADT JAM. Contoh tersebut sekaligus memberikan gambaran mengapa bahasa Algoritmik masih dibutuhkan, karena bersifat umum dan tidak tergantung pada pernik-pernik dalam bahasa pemrograman, sehingga dapat dipakai sebagai bahasa dalam membuat spesifikasi umum. 2. ADT POINT. Merupakan standard dalam pemrograman, dan akan selalu dipakai sampai dengan pemrograman berorientasi Objek 3. ADT GARIS. Memberikan gambaran sebuah ADT yang memanfaatkan ADT yang pernah dibuat (yaitu ADT POINT), dan sebuah ADT yang mempunyai konstraint/invariant (persyaratan tertentu). 4. ADT SEGIEMPAT dengan posisi sejajar sumbu X dan Y, didefinisikan sebagai dua buah POINT (TopLeft dan BottomRight) E. Berbagai Bentuk Type Data Pada umumnya dalam setiap bahasa pemrograman berorientasi obyek terdapat tiga level type data, yaitu: (1) Type data primitif, (2) Type data abstrak (Obyek), (3) Type data Collection 1. Type Data Primitif Type data Primitif mulai dikenal pada bahasa pemrograman prosedural seperti: Pascal, C, atau Basic. Dimana type data ini memiliki ukuran memori yang tetap dan pasti, diantaranya: 1. Integer : byte (8 byte), short (16 b), int (32 b), long (64 b) 2. Floating point: float (32 byte), double(64 b), decimal(128 b), bigdecimal(256 b) 3. Booleans: boolean(1 bit) 4. Characters: char(1 byte) 5. String : (koleksi dari char) Contoh pengujian untuk type data primitif adalah sebagai berikut ini : Gambar 2.2. Penerapan Type Data Primitif Untuk Angka Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 6

Dari listing program dan pengujiannya didapatkan bahwasanya ukuran memori untuk integer int(32 byte), sehingga apabila ditambahkan melebihi kapasitasnya akan berhenti pada nilai 2147483647 yang merupakan 2 32 1 yang mewakili nilai maksimal dari 32 byte. Contoh program lainnya untuk operasional karakter dan string pada type data primitif: Gambar 2.3. Penerapan Type Data Primitif Untuk Karakter / Huruf Dari listing program Gambar 2.3 ditunjukkan hasil bahwasanya tipe data char hanya bisa diberikan satu karakter, sedangkan String merupakan set kumpulan dari karakter yang berindeks. Operasional tipe data primitif terbatas pada jenis tipe datanya, sehingga diperlukan konversi atau Casting untuk merubahnya apabila dibutuhkan penggabungan operasional pada tipe data. Tabel 1. Berbagai Type Data Primitif 2. Type Data Objek Tipe data Obyek mulai digunakan pada pemrograman prosedural pascalv ataupun C dengan penggunaan tipe data abstrak dan pointer, yaitu record, struct untuk tipe data kelompok serta pointer untuk penciptaan tipe data dinamis. Pada perkembangannya bahasa pemrograman berorientasi obyek menggunakannya untuk tipe data Obyek dimulai pada bahasa pemrograman LISP dan kemudian disusul Java. Tipe data ini dapat merepresentasikan kelompok tipe data dengan beragam tipe primitif yang bisa diciptakan secara dinamis: Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 7

Gambar 2.4. Penerapan Type Data Objek dengan Pascal Sedangkan pada Java yang sepenuhnya berbasis obyek dengan menggunakan Class dimana obyek tidak hanya atribut variabel tetapi juga methode. Contoh penggunaan tipe data abstrak dalam bahasa pemrograman Java: Gambar 2.5. Penerapan Type Data Objek dengan Java Dari hasil listing Gambar 2.5 didapatkan bahwasanya tipe data abstrak dapat diberikan masukan baik berupa angka Integer ataupun String sehingga bersifat dinamis. Karena itu tipe data abstrak memiliki ukuran memori yang dinamis atau adaptif sesuai dengan masukan yang diberikan. 3. Type Data Collection Koleksi adalah tipe data yang berupa rangkaian atau kumpulan data ataupun obyek yang berindeks. Terdapat tiga tipe dasar koleksi di Java yaitu: 1. Array, koleksi statis dengan ukuran tetap dan hanya bisa mengelompokkan tipe data yang sama. 2. List, koleksi dinamis dengan ukuran adaptif dan bisa mengelompokkan tipe data yang sama ataupun berbeda 3. Map, koleksi dinamis dengan ukuran adaptif dan bisa mengelompokkan tipe data yang sama ataupun berbeda dengan menggunakan pasangan <key, value>. Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 8

Gambar 2.6. Penerapan Array Gambar 2.7. Penerapan Koleksi List dan Map Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 9

F. Standar Evaluasi Algoritma Pada dasarnya untuk menghasilkan algoritma yang baik dalam membuat program diukur berdasarkan kecepatan waktu disaat program tesebut dijalankan serta jauh dari masalah seperti bug program. Namun untuk menjalankan program yang sesuai dengan waktu tersebut diperlukan komputer yang canggih serta kualitas programmer dalam membuat program tersebut. Evaluasi algoritma merupakan cara untuk menentukan apakah program sudah sesuai dengan standar-standar algoritma dalam pembuatannya. Untuk itu evaluasi menggunakan complexity ( Big Oh Notation ). Complexity adalah waktu yang diperlukan untuk menjalankan sebuah algoritma pada sebuah komputer virtual, yang direpresentasikan secara kasar sebagai fungsi dari n (n adalah banyaknya input data) dimana Karakteristik dari complexity tidak dipengaruhi oleh hardware computer maupun kemampuan programming O : representasi worst-case complexity O (n 2 ) : Complexity algoritma berbanding lurus terhadap n 2 (n adalah banyaknya input data) Karakteristik dari worst case complexity Dua operasi yang berturutan dengan complexity masing-masing dalam fungsi f dan g, maka complexity total adalah yang terbesar antara f dan g Bila sebuah operasi dengan complexity O(f(n)) dijalankan pada O(g(n)) kali, maka complexity total operasi tersebut adalah f x g Big Oh notation merepresentasikan evaluasi algoritma terhadap input data sebanyak n dimana nilai yang berada dalam tanda kurung () adalah 1, log n, n, n 2, n pangkat bilangan bulat yang lain Notasi ini mengabaikan koefisien berupa konstanta seperti 2, 100, 0.1, atau berupa variabel a Contoh: O(2n) ditulis sebagai O(n), karena 2 diabaikan Contoh penggunaan notasi Big Oh Evaluasi : Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 10

BAB. III METODE STRUKTUR DATA ARRAY Dalam Struktur Data diperlukan meotde-metode untuk menyusun data sesuai dengan keadaan yang terbaik bagi program dalam mengeksekusinya dengan cara paling cepat dan efektif dalam pemanfaatan memori komputer. Berikut ini, ada beberapa metode yang digunakan dalam Struktur Data yaitu : 1. Metode Pengurutan Data Array A. Bubble sort B. Stack (Push & POP) LIFO (Last In First Out) C. Queue (Enqueue & Dequeue) FIFO (First In First Out) D. Implementasi Linier List (sisipan) E. Implementasi Stack (Reverse Polish Notation/RPN)/Posfix Notation F. Implementasi Queue (Linier and Circular) 2. Metode Struktur Data Linked List A. Simple Linked List B. Double Linked List C. Circular Linked D. Multi List Structure 3. Metode Struktur Data Tree A. Tree Structure B. Binary Tree (Red Black Tree, AVL Tree C. Tree Transfersal D. Implementasi Tree 4. Metode Pencarian Data (Searching) A. Linier Search B. Binary Search C. Binary Search Tree A. Bubble sort Bubble sort digunakan untuk mengurutkan data dari yang terbesar hingga terkecil melalui proses iterasi atau tahap-tahap. Jika terdapat banyaknya data (n) maka data diurutkan dengan cara iterasi seperti berikut ini : 7 4 5 8 10... n Data ke-1 2 3 4 5 n 1. Step ke-1 : Periksalah nilai dua elemen mulai urutan ke-n sampai urutan ke-1, jika nilai kiri < dari nilai kanan maka tukarkan kedua data tersebut. 2. Step ke-2 : Periksalah nilai dua elemen mulai urutan ke-n sampai urutan ke-2, jika nilai kiri < dari nilai kanan maka tukarkan kedua data tersebut. 3. Step ke-n-1 : Periksalah nilai dua elemen mulai urutan ke-n sampai urutan ke-n-1, jika nilai kiri < dari nilai kanan maka tukarkan kedua data tersebut. Maka penyelesaiannya sebagai berikut ini : 7 4 5 8 10 Iterasi ke-1 : 10 7 4 5 8 Iterasi ke-2 : 10 8 7 4 5 Iterasi ke-3 : 10 8 7 4 5 Iterasi ke-4 : 10 8 7 5 4 Dari iterasi di atas terdapat tiga iterasi yang bisa dilakukan. Dengan nilai 10 (terbesar) berada pada tempat paling kiri dan nilai 4 (terkecil) berada pada tempat paling kanan Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 11

Gambar 2.8. Penerapan Bubble Sort Dalam Bahasa Pemrograman C Evaluasi : Urutkanlah deret angka berikut ini dengan bubble sort dan tentukan berapa banyak step / iterasi yang diperlukannya serta tuliskan langkah disetiap stepnya : 1. 15 23 40 17 2 1 3 2. 20 45 13 14 2 17 18 9 3. 3 2 4 5 10 12 6 7 9 Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 12

B. Stack (Push and POP) Definisi Stack adalah struktur data dalam bentuk tumpukan dimana penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling atas. Untuk penambahan dilakukan dengan menumpuk elemen pada atasnya sedangkan untuk menghapus dilakukan pada elemen yang paling diatas terlebih dahulu, teknik ini dinamakan : LIFO (Last In First Out) Pada operasi PUSH : Menambahkan elemen pada sebuah Stack caranya seperti gambar berikut ini : Gambar 3.1. Oprasi Stack : Menambah Elemen (PUSH) Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 13

Untuk operasi POP : Menghapus elemen pada sebuah Stack caranya seperti gambar berikut ini : Gambar 3.2. Oprasi Stack : Menghapus Elemen (POP) Stack Overflow : Menambahkan data pada sebuah Stack yang telah penuh Stack Underflow : Menghapus data pada sebuah Stack yang sudahb kosong Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 14

C. Queue (Enqueue and Dequeue) Definisi Queue adalah struktur data dalam bentuk antrian dimana penambahan dan penghapusan elemen dilakukan pada elemen list yang terletak di paling ujung pertama data. Untuk penambahan dilakukan dibelakang elemen pertama masuk sedangkan untuk menghapus dilakukan pada elemen yang paling pertama masuk terlebih dahulu, teknik ini dinamakan : FIFO (First In First Out) Pada operasi Enqueue : Menambahkan elemen pada sebuah queue caranya seperti gambar berikut ini : Gambar 3.3. Operasi Queue : Menambahkan Elemen (ENQUEUE) Untuk operasi berikut ini : DEQUEUE : Menghapus elemen pada sebuah queue caranya seperti gambar Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 15

Gambar 3.4. Operasi Queue : Menghapus Elemen (DEQUEUE) Evaluasi : 1. Gambarkan kondisi stack setelah dilakukan operasi berikut ini : push (10); push (2); pop (); push (20); pop (20); push (5); 20 2 10 10 2 10 5 2 10 2. push (30); push (35); push (40); pop (35); push (5); push (7); pop (30); 3. enqueue (12); enqueue (15); enqueue (20); push (17); push (24); enqueue (56); dequeue (20); pop (17); D. Implementasi Linier List Linier List adalah sekumpulan elemen bertype sama yang mempunyai keterurutan tertentu yang setiap elemennya terdiri dari 2 bagian. Sebuah linier list dikenali : 1. Elemen pertamanya, biasanya melalui alamat, elemen pertama disebut : First 2. Alamat elemen berikutnya ( suksesor ), jika kita mengetahui alamat sebuah elemen, yang dapat diakses melalui field NEXT 3. Setiap elemen mempunyai alamat, yaitu tempat elemen disimpan dapat diacu. Untuk mengacu sebuah elemen, alamat harus terdefenisi. Dengan alamat tersebut Informasi yang tersimpan pada elemen list dapat diakses. 4. Pada sebuah Linear List, penyisipan dan penghapusan elemen dapat dijalankan di sembarang posisi 5. Penambahan dan penghapusan elemen pada stack/queue dilakukan di posisi terdepan atau posisi terbelakang saja Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 16

Gambar 3.5. Posisi Menambahkan dan Menghapus pada Stack dan Queue Untuk dapat menambahkan data dengan linier list maka diperlukan penyisipan data seperti berikut ini : Gambar 3.6. Penyisipan Data Baru dengan Linier List E. Implementasi Stack (Reverse Polish Notation) / Postfix Notation Penambahan dan penghapusan pada Stack dilakukan pada elemen paling atasnya (Top). Terdapat 4 operasi utama dalam implementasi stack : 1. Init : Inisialisasi Stack (mengosongkan stack) 2. Push : Menambahkan data pada stack 3. Pop : Menghapus data dari stack 4. Empty : Memeriksa apakah stack sudah kosong atau belum Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 17

Gambar 3.7. Penambahan dan Penghapusan Elemen Menggunakan Stack Reverse Polish Notation (RPN) adalah operasi dengan merubah posisi operator berada dibelakang dari datanya. Nama lain : postfix notation Implementasi RPN memakai stack 1. Jika angka, tambahkan pada stack 2. Jika operator, turunkan ( POP) dua buah data dari stack, lakukan perhitungan, dan tambahkan (PUSH) hasilnya pada stack 3. Cara penulisannya diperlihatkan seperti gambar berikut ini Gambar 3.8. Cara Penulisan RPN Berikut contoh penggunaan RPN dalam mengolah data : Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 18

Gambar 3.9. Penerapan RPN dengan Stack Evaluasi : Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 19

F. Implementasi Queue / Linier and Circular Untuk implementasi Queue, harus merubah posisi dua buah pointer, yaitu pointer yang menunjuk FRONT dan pointer yang menunjuk ke REAR. Ada dua cara untuk implementasi queue yaitu dengan linier dan circular. 1. Cara linier Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR a. Saat data ditambahkan ke queue, naikkan posisi pointer REAR Gambar 3.10. Tampilan Front dan Rear Pada Implementasi Queue Ditambahkan b. Saat data dihapus dari queue, naikkan posisi pointer FRONT Gambar 3.11. Tampilan Front dan Rear Pada Implementasi Queue Dihapus Pada saat FRONT=REAR maka queue telah dikosongka. Ada 2 permasalahan yang terdapat dengan cara linier ini adalah : Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 20

1. Front dari rear selalu bertambah secara motononik, sehingga memerlukan array dengan ukuran tak terhingga 2. Pointer selalu bergerak ke kanan sehingga tak pernah untuk kembali 2. Cara Circular (Ring Buffer) Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama. Untuk menambahkan data ke queue nilai rear dinaikkan satu. Sedangkan untuk menghapus data dari queue nilai front dinaikkan satu. Queue dinyatakan kosong pada saat front==rear a. Saat data ditambahkan ke queue pada Ring, naikkan posisi REAR satu data Gambar 3.12. Menambahkan Data dengan Ring Buffer a. Saat data dihapuskan ke queue pada Ring, naikkan posisi FRONT satu data Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 21

Gambar 3.13. Mengurangkan Data dengan Ring Buffer Pada saat rear = front maka queue dinyatakan kosong atau terisi penuh Gambar 3.14. RING = FRONT Untuk FRONT = REAR agar data tidak pernah full sehingga data tidak akan saling tindih maka diperlukan FLAG untuk membatasinya. Gambar 3.15. RING = FRONT dengan FLAG Evaluasi : 1. Mengapa cara penyusunan elemen pada Queue Sering disebut tersusun FIFO? 2. Penghapusan elemen pada Queue selalu dilakukan pada elemen yang paling depan, bagaimana jika terpaksa harus menghapus elemen yang paling belakang? Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 22

BAB IV METODE STRUKTUR DATA LINKED LIST Selain dengan menggunakan array, queue juga dapat dibuat dengan menggunakan linked list. Alasan penggunaan linked list adalah sebagai berikut ini : 1. Mudah untuk menambahkan dan menghapus elemen (pada array tidak mungkin menambahkan elemen, karena banyaknya elemen sudah ditentukan dari awal) 2. Panjang list bisa diubah dengan bebas (panjang array fixed) 3. Mudah untuk menyambungkan beberapa list, maupun memutuskannya (array tidak bisa) 4. Memungkinkan user mendesain struktur data yang kompleks A. Array vs Linked List Elemen (disebut dengan CELL, atau SEL dalam bahasa Indonesia) yang mungkin terletak terpisah-pisah di memory, disambungkan dengan pointer. Tiap sel berisi dua informasi : nilai dan pointer ke sel berikutnya. Berikut ini perbandingan antara array dengan linked list : B. Null Pointer Gambar 4.1. Perbandingan Antara Array dengan Linked List 1. Nilai yang dimiliki sebuah pointer adalah address pada memory dimana data tersimpan Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 23

2. Pointer yang tidak menunjuk ke address manapun disebut dengan NULL pointer. Maksudnya, satu kondisi khusus dimana pointer itu belum diset dengan sebuah address tertentu 3. Pada stdio.h biasanya didefinisikan dengan nilai 0 4. Saat fungsi fopen,malloc dieksekusi, jika terdapat error, maka nilai yang dikembalikan adalah NULL 5. Null disimbolkan dengan kotak bergaris seperti ini : C. Akses Sekuensial Akses Sekuensial berisi sel-sel dimana sel tersebut terdiri atas (value + pointer ke sel berikutnya). Akses hanya bisa dilakukan searah saja, dari ujung depan ke arah belakang. Akses berlawanan arah tidak dapat dilakukan. Cara menampilkan isi seluruh list : Gambar 4.2. Akses Sekuensial Linked List Cara menampilkan isi sel tertentu adalah sebagai beikut ini : 1. Pada array (misalnya nama array: a), isi sel tertentu dapat ditampilkan dengan cara a[nomer urut sel keberapa]. Misalnya a[5] akan menampilkan isi sel ke-6. Hal ini karena satu sel dengan sel yang lain terletak pada posisi yang berurutan di memory. 2. Pada linked list, kita tidak tahu secara langsung, sel itu terletak dimana dalam memory. Akses harus dilakukan satu persatu, urut mulai dari sel terdepan 3. Contohnya seperti gambar berikut ini : Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 24

Gambar 4.3. Cara Menampilkan Isi Sel Tertentu Pada Linked List D. Operasi Pada Linked List Untuk menambahkan data pada linked list sebagai berikut ini : 1. Menambahkan sel baru yang terletak setelah sebuah sel tertentu 2. Menambahkan sel baru pada posisi terdepan sebuah linked list Untuk menghapus data pada linked list sebagai berikut ini : 1. Menghapus sebuah sel yang terletak setelah sebuah sel tertentu 2. Menghapus sel pada posisi terdepan sebuah linked list 3. Syarat-syarat pada perbatasan Untuk menambahkan sel baru sebagai berikut ini : 1. Membuat sel yang akan ditambahkan (memakai malloc) 2. Mengeset value pada sel itu 3. Mengeset pointer next yang menunjukkan koneksi antara satu sel dengan yang lain 1. Penambahan Sel Baru Catatan penting : pada linked list penambahan sel baru hanya dapat dilakukan pada posisi sesudah sel tertentu, tetapi tidak dapat ditambahkan pada posisi sebelum sel tersebut. Gambar 4.4. Contoh Penambahan Sel Baru Pada Linked List 2. Penambahan Sel Baru Setelah Sel yang Ditunjuk Pointer X 1. Sediakan pointer p yang menunjuk ke sebuah sel struct CELL *p; 2. Buatlah sebuah sel baru dengan malloc() (alokasi memory) yang dimulai dengan address yang ditunjukkan oleh pointer p 3. Set-lah value pada sel p 4. Modifikasi pointer p->next = x->next; x->next = p; Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 25

Gambar 4.5. Contoh Penambahan Sel Baru yang Ditunjuk Pointer X 3. Penambahan Sel Baru Pada Posisi Terdepan Sebuah Linked List (Cara 1) Cara menambahkan sel baru pada posisi terdepan sebuah linked list berbeda dengan cara menambahkan sel ke tengah list tersebut. Penambahan tersebut memakai pointer header yang menunjukkan posisi terdepan sebuah linked-list. 1. Sediakan pointer p yang menunjuk ke sebuah sel struct CELL *p; 2. Buatlah sebuah sel baru dengan malloc() (alokasi memory) yang dimulai dengan address yang ditunjukkan oleh pointer p 3. Set-lah value pada sel p 4. Substitusikan address pada header ke bagian next pada p p->next = header; 5. Updatelah nilai header dengan address p header = p; Gambar 4.6. Contoh Penambahan Sel Baru Pada Posisi Terdepan Sebuah Linked List 4. Penambahan Sel Baru Pada Posisi Terdepan Sebuah Linked List (Cara 2) Memakai cara yang sama dengan list (1) dengan menambahkan elemen pada tengah-tengah sebuah list. Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 26

1. Header tidak didefinisikan sebagai sebuah pointer, melainkan sebuah sel struct CELL header; 2. Tempatkan next pada header agar menunjuk ke posisi terdepan pada list,dan header dianggap sebagai sel ke-0 3. Masukkan elemen p pada posisi sesudah elemen ke-0 4. Selanjutnya sama dengan proses penambahan sel baru pada penjelasan sebelumnya (modifikasi next) Gambar 4.7. Contoh Penambahan Sel Baru Pada Posisi Terdepan Sebuah Linked List (Cara 2) 5. Menghapus Sebuah Sel Pada Linked List Catatan penting Pada linked list, kita bisa menghapus sebuah sel yang terletak pada posisi sesesudah sel tertentu. Tetapi kita tidak Sesudah sel tertentu tetapi kita tidak dapat menghapus sebuah sel yang ditunjuk oleh pointer itu sendiri. Adapun cara untuk menghapus sel tersebut adalah : 1. Periksa pointer NULL 2. Mengubah pointer next (skip 1 sel) 3. Mengeluarkan isi sel yang dihapus (optional) 4. Bebaskan memory yang dialokasikan memakai fungsi free() Gambar 4.7. Menghapus Sel Pada Linked List 6. Menghapus Sebuah Sel Sesudah Sel X 1. siapkan pointer yang akan menunjuk ke sel yang akan dihapus struct CELL *p; 2. Periksalah apakah sel yang dihapus itu NULL atau tidak if(x->next == NULL) fatal_error( sel tidak dapat dihapus karena tidak ada sel lagi sesudahnya ); Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 27

3. Set-lah agar pointer p menunjuk ke sel yang ingin dihapus p = x->next; 4. Sesuaikan next dari sel sel x (skip p) x->next = p->next; 5. Print-lah isi sel yang ditunjuk oleh pointer p 6. Bebaskan memory yang ditunjuk oleh pointer p free(p); Gambar 4.8. Menghapus Sel Sesudah Sel X 7. Menghapus Sel Pada Posisi Terdepan Sebuah Linked List (Cara 1) 1. Siapkan pointer p struct CELL *header, *p; 2. Periksa apakah header NULL atau tidak if(header == NULL) fatal_error( List kosong, sehingga penghapusan sel tidak dapat dilakukan ); 3. Set-lah address elemen terdepan ke p p = header; 4. Update-lah pointer header header = p->next; 5. Tampilkan isi sel yang ditunjuk oleh p (optional) 6. Bebaskan memory yang ditunjuk oleh pointer p Gambar 4.9. Menghapus Sel Pada Posisi Terdepan Sebuah Linked List 8. Menghapus Sel Pada Posisi Terdepan Sebuah Linked List (Cara 2) 1. Header dideklarasikan sebagai sebuah sel. p dideklarasikan sebagai pointer yang menunjuk ke sel yang ingin dihapus struct CELL header, *p; 2. Substitusikan address header ke pointer x x=&header Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 28

3. Selanjutnya pergunakan cara yang sama dengan cara menghapus sel yang berada di tengahtengah sebuah list. Yaitu menghapus sel yang terletak sesudah sel yang ditunjuk oleh pointer x. Gambar 4.10. Menghapus Sel Pada Posisi Terdepan Sebuah Linked List (Cara 2) KESIMPULAN : a. Linked list terdiri dari komponen-komponen berikut : value dan pointer ke sel berikutnya b. Data yang tersimpan (value) pada linked -list diakses dengan cara sekuensial. Untuk melihat value dari suatu sel yang berada di tengah list, kita harus mengikuti alur list, mulai dari sel pertama dan seterusnya sampai bertemu dengan sel yang value-nya ingin ditampilkan c. Penambahan sel, penghapusan sel dapat dilakukan dengan cara mengubah pointer d. Ada dua cara operasi penambahan dan penghapusan sel yang terdepan. Yang lebih mudah adalah dengan memakai header bukan sebagai pointer, melainkan sebagai sel ke-0 e. Syarat syarat berlaku untuk linked list yaitu : i. Bagaimana menghandle sel terdepan dan terbelakang ii. Proses saat list kosong iii. Program linkedlist.c (Angka diurutkan, nilainya semakin tinggi) iv. Sel yang jadi pusat operasi (pointer p) v. Pointer yang menunjuk ke address sel sebelumnya (pointer q) Gambar 4.11. Linked List dan Syarat syarat Berlakunya Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 29

EVALUASI : Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 30

BAB V METODE STRUKTUR DATA TREE A. Definisi Tree Struktur data yang menunjukkan hubungan bertingkat (memiliki hierarkhi) seperti direktori folder pada eksplorer windows. Sebuah pohon adalah himpunan terbatas tidak kosong, dengan elemen yang dibedakan sebagai berikut : 1. Sebuah elemen yang dibedakan dari yang lain yang disebut sebagai AKAR (root) dari pohon 2. Elemen yang lain (jika masih ada) dibagi -bagi menjadi beberapa sub himpunan yang disjoint dan masing-masing sub himpunan tersebut adalah pohon yang disebut sebagai sub pohon dari pohon tersebut. Beberapa Istilah dari tree sebagaimana berikut : 1. Hutan : Hutan adalah sequence (list) dari pohon 2. Simpul (Node) : Simpul adalah elemen dari pohon yang memungkinkan akses pada sub pohon dimana simpul tersebut berfungsi sebagai Akar 3. Cabang : Cabang adalah hubungan antara Akar dengan sub pohon 4. Ayah : Akar dari sebuah pohon adalah Ayah dari sub pohon 5. Anak : Anak dari sebuah pohon adalah Sub pohon 6. Saudara : Saudara adalah simpul-simpul yang mempunyai Ayah yang sama 7. Daun : Daun adalah simpul terminal dari pohon. Semua simpul selain Daun adalah simpul bukan terminal 8. Jalan (Path) : Jalan adalah suatu urutan tertentu dari Cabang 9. Derajat : Derajat sebuah pohon adalah banyaknya anak dari dari pohon tersebut. Jika sebuah simpul berderajat N disebut pohon N-aire i. Disebut pohon 1-aire/uner ii. Disebut pohon 2-aire/biner 10.Tingkat (Level) : Level pohon adalah panjangnya jalan dari Akar sampai dengan simpul yang bersangkutan. Panjang dari jalan adalah banyaknya simpul yang dikandung pada jalan tersebut. Akar mempunyai tingkat sama dengan 1. Dua buah simpul disebut sebagai Sepupu jika mempunyai tingkat yang sama dalam sebuah pohon. 11.Kedalaman (Tinggi) : Kedalaman (Tinggi) dari pohon adalah nilai maksimum dari tingkat simpul yang ada pada pohon tersebut. Kedalaman adalah panjang maksimum jalan dari Akar menuju ke sebuah daun 12.Lebar : Lebar sebuah Pohon adalah maksimum banyaknya simpul yang ada pada suatu Tingkat (Level) Gambar 5. 1. Nama dan Penggunaan Komponen Pada Tree Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 31

B. Hubungan Antar Komponen Tree Gambar 5. 2. Hubungan Antar Komponen Sebuah tree didefinisikan sebagai struktur y ang dibentuk secara recursive oleh kedua rule berikut: 1. Sebuah node adalah sebuah tree. Node satu-satunya pada tree ini berfungsi sebagai root maupun leaf. 2. Dari k buah tree T1 ~ T k, dan masing-masing memiliki root n1 ~ nk jika node n1 ~ nk, akan diperoleh sebuah tree baru T yang memiliki root n, dalam kondisi ini, tree T1~Tk menjadi sub tree dari tree T. Root dari sub tree n1~nk adalah anak dari node n. Gambar 5. 3. Definisi Tree Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 32

Ordered Tree 1. Antar sibling terdapat urutan usia Node yang paling kiri berusia paling tua (sulung), sedangkan node yang paling kanan berusia paling muda (bungsu) 2. Posisi node diatur atas urutan tertentu Unordered tree Antar sibling tidak terdapat urutan tertentu Unordered Tree 1. Antar sibling tidak terdapat urutan tertentu C. Binary Tree dan Implementasinya Definisi Binary Tree : 1. Sebuah tree yang kosong juga merupakan sebuah binary tree 2. Binary tree harus memenuhi salah satu syarat berikut a. Tidak memiliki anak b. Memiliki subtree di sebelah kiri (left subtree) c. Memiliki subtree di sebelah kanan (right subtree) d. Memiliki baik left subtree maupun right subtree Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 33

Gambar 5. 4. Penulisan Binary Tree Gambar 5. 5. Implementasi Binary Tree EVALUASI : Gambar 5. 6. Contoh Data Implementasi Binary Tree Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 34

BAB VI METODE STRUKTUR DATA SEARCHING A. Linier Search Linier Search memiliki cara kerja seperti berikut ini : Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 35

Dapat dijelaskan bahwa untuk searching dengan linier search akan dicari terlebih dahulu dimana key dari data tersebut, disini key berperan sebagai identitas / ID yang menentukan dimana letak data tersebut. Ketika akan mencari data dengan nilai 22 maka yang dicari sebenarnya adalah ID dari 22 tersebut yaitu pada tabel ke-6 atau i=6. Complexity Seacrh adalah dengan tabel rumus seperti berikut B. Binary Search Karakteristik dari Binary Search Tree adalah : 1. Complete binary Search tree : Binary tree yang untuk semua leaf memiliki jarak (panjang/tinggi) sama terhadap root 2. Banyaknya node pada complete binary tree adalah 2 n 1 3. Complete binary tree dalam arti yang lebih luas, adalah jika selisih jarak terpanjang (root ke leaf) dan jarak terpendek kurang dari atau sama dengan 1 (contoh gambar a) 4. Panjang dari root ke leaf, dengan banyak node n adalah log 2 n + 1 5. Computational complexity proses searching pada complete binary search tree O (log n) 6. Kondisi terburuk: gambar (b) dengan proses searching O(n) Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 36

Gambar 6.1. Karakteristik Binary Tree Cara Kerja Binary Search : Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 37

Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 38

Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 39

Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 40

1. Fungsi Malloc () Malloc merupakan fungsi standart untuk mengalokasinkan memori Prototipe dari fungsi malloc adalah : void malloc (int jml_byte); Banyaknya byte yang akan dipesan dinyatakan sebagai parameter fungsi. Untuk return value dari fungsi ini adalah sebuah pointer yang tak bertipe ( pointer to void) yang menunjuk ke buffer(tempat penyimpanan sementara) yang dialokasikan. Pointer harus dikonversi pada tipe data yang sesuai ( dengan menggunakan type cast) agar bisa mengakses data yang disimpan dalam buffer. Kegunaan dari malloc adalah mengembalikan pointer kesejumlah n byte ruang memori yang belum di inisialisasi. Apabila tidak terpenuhi akan mengembalikan ke nilai NULL. Contoh dari malloc() : int *x; x = (int*) malloc (3 * sizeof(int)); if(x==null) { printf( Error di malloc\n ); exit(0); } else { printf( Lakukan operasi memori dinamis ); } Sintak tersebut artinya kita mengalokasikan ruang memori sebanyak 12 byte (berasal dari 3 x 4 ) untuk menyimpan tipe data int dan mencatat ruang tersebut kedalam pointer x ( *x). Nilai 4 berasal dari ukuran tipe data int yang dituliskan dengan sizeof(int). Ukuran dari type data int adalah 4 byte. Jadi apabila kita ingin mengalokasikan ruang memori untuk tipe data double berukuran 8 byte, kita dapat menuliskan : double *x; P = (double*) malloc (8) ; 2. Fungsi calloc() Prototipe dari fungsi calloc() : void *calloc (size_t n, size_t size); Fungsi calloc() akan mengembalikan pointer ke sebuah array yang terdiri dari n elemen data dengan size (ukuran) yang telah ditentukan sebelumnya. Apabila tidak terpenuhi akan mengembalikan ke nilai NULL. Berbeda dengan fungsi malloc() yang tidak melakukan inisialisasi, pada fungsi calloc() ini ruang yang dialokasikan akan diisialisasi dengan 0. Contoh sintak: int *Q ; P= (int*) calloc (50, sizeof(int)); Jadi sintak tersebut mengalokasikan 200 byte ruang memori (yang berasal dari 50 x 4). Jadi terdapat 50 elemen array yang masing-masing elemen memiliki ukuran 4 byte. 3. Fungsi realloc() Kegunaan dari fungsi dari ralloc adalah mengalokasikan ulang memori yang telah digunakan dalam fungsi malloc () dan calloc (). Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 41

sintak : void *realloc(void *p, size_t size); Fungsi realloc hanya digunakan jika alokasi memori yang diigunakan pada fungsi malloc () dan fungsi calloc () kurang beras. Fungsi dari realloc () adalah mengembalikan pointer keruang baru yang ditambahkan, atau mengembalikan nilai NULL apabila permintaan ruang tersebut tidak terpenuhi. Contoh : int *x; x = (int *) calloc (10, sizeof (int)) ; /* memesan ruang baru 40 byte*/ realloc((int*) x, 80 ); /* memesan ruang sebanyak 40 byte lagi */ 4. Fungsi free () Fungsi dari free adalah untuk membebaskan memori yang telah dipakai dalam fungsi malloc(), calloc(). sintak : void *free (void *memblock) fungsi ini untuk menghindari adanya pemborosan memori atau terjadi kebocoran memori ( memori leak ) maka harus melakukan dealokasi terhadap ruang-ruang memori yang sebelumnya dialokasikan. contoh : int *x ; x=(int *) malloc (sizeof(int)); free(x); Jika kita menggunakan bahsa C++ fungsi standar yang dipakai untuk new contoh: nilai=new int; mengalokasikan memori adalah hasil pengalokasikan diatas ialah suatu alamat yang menunjukkan byte pertama dari memori yang dialokasikan diheap.jika alokasi gagal bisa dikarenakan tidak mencukupinya memori pada heap sehingga akan mengembailkan nilai NULL. Jika kita ingin mendealokasikan memori fungsi standar yang dipakai dalam bahasa C++ yaitu delete sama dengan free dalam bahasa C contoh : delete [ ] pmhs; Thomson Mary, M.Kom - Dosen STKIP PGRI Sumatera Barat 42