OPERATOR C++

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Indra Yatini B, Flowchart, Algoritma, dan Pemrograman Menggunakan Bahasa C++ Builder ,

Graha Ilmu, Yogyakarta, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 06

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

MODUL PERKULIAHAN

Pemrograman Algoritma

Struktur Data

Modul Standar untuk digunakan dalam Perkuliahan di Universitas Mercu Buana

Fakultas

Progra Studi

Tatap Muka

Kode MK

Disusu Oleh

Il u Ko puter

Teh ik I for atika

07 Tim Dosen

A stra t

Ko pete si

 Array satu di e si da  Mampu membuat program untuk Array dua di e si

menginisialisasi array satu dimensi dan array dua dimensi.

 Mampu membuat program untuk mengisi elemen array satu dimensi dan array dua dimensi menggunakan struktur perulangan.

ARRAY

Array adalah himpunan elemen (variabel) dengan tipe data yang sama dan disimpan secara berurutan dalam memori yang ditandai dengan memberikan indeks pada suatu nama variabel.

1. Array Berdimensi Satu

Gambaran sebuah Array ditunjukkan pada contoh di bawah ini, dimana kita dapat menyimpan 5 nilai dengan tipe float tanpa harus mendeklarasikan 5 identifier variabel yang berbeda. Perhatikan contoh di bawah ini :

Elemen-elemen Array

Nama Array Gambar 1. Gambaran Sebuah Array

Bagian kosong di atas merepresentasikan elemen array, dalam kasus ini adalah nilai integer. Angka 0 – 4 merupakan indeks dan selalu dimulai dari 0. Seperti penggunaan variabel pada umumnya, array harus dideklarasikan terlebih dahulu, dengan format sebagai berikut :

Type name [elements]; Maka contoh array di atas dideklarasikan sebagai berikut : Float Suhu [5] ;

Inisialisasi Array

Ketika mendeklarasikan array lokal (didalam fungsi), jika tidak diberikan nilai maka isi dari array tidak akan ditentukan (undetermined) sampai nilai diberikan. Jika mendeklarasikan array global array (di luar semua fungsi) maka isi dari array akan diinisialisasikan sebagai 0 :

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Suhu

Atau dideklarasikan dengan memberikan nilai array yang dituliskan dalam kurung kurawal :

Float Suhu [5] = { 28.5, 28, 29, 30.5, 27}

Maka elemen array akan berisi :

Suhu

Nilai array dapat di akses secara individual, dengan format : name [index]

Maka dari contoh sebelumnya nama yang digunakan untuk mengakses masing-masing elemen :

Suhu[4] Suhu

Misalkan akan disimpan nilai 75 pada elemen ke tiga, maka instruksinya : Suhu[2] = 28;

Dan jika nilai elemen ke tiga tadi akan diberikan ke variabel a, maka dapat dituliskan :

a = Suhu[2];

contoh 1: Buatlah program untuk menampilkan data suatu suhu

//contoh Array #include <vcl.h> #pragma hdrstop #include<iostream.h> #include<conio.h> void contoh()

{ float Suhu[5]= {27.5, 28, 29, 30.5, 27}; for (int i=0; i<5; i++)

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

Hasil Eksekusi :

Contoh 2: Buat program nilai dan jumlahkan nilai tersebut, kemudian hitung jumlahnya dan nilai rata-

rata dari 5 buah bilangan yang dimasukkan #include <vcl.h>

#pragma hdrstop #include<iostream.h> #include<conio.h> void main()

{ int daf_nilai[5]; int i,jum; float rata; for (i=1; i<=5; i++) {

cout<<"Masukkan nilai tes ke-" <<i<< " : "; cin>>daf_nilai[i];

} jum = 0 ; for (i=1;i<=5;i++)

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

getch(); }

Hasil eksekusi :

2. Array Multidimensi

Array multidimensi dapat dianggap sebagai “array dari array”. Contoh array 2 dimensi dapat dibayangkan sebagai table berdimensi 2 yang tersusun dari elemen- elemennya, semua bertipe sama.

Contoh : suhu

Array suhu menyatakan array dua dimensi berukuran 3 x 5 elemen bertipe integer. Cara mendeklarasikan dalam bahasa C ++ adalah ;

Int suhu [3] [5]; Sedangkan cara untuk menunjuk pada salah satu elemennya bisa dilakukan dengan

menyebutkan nama array diikuti dengan alamat sel menurut baris dan kolomnya, misalnya :

Suhu [0] [3] atau suhu [2] [1]

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Array multidimensi tidak hanya terbatas pada array dimensi 2 saja tetapi dapat berupa array dimensi 3 dan seterusnya.

3. Array Sebagai Parameter

Suatu saat kita mungkin perlu untuk menjadikan array sebagai parameter sebuah fungsi. Dalam C/C++ tidak memungkinkan untuk mengirimkan nilai seluruh blok memori sebagai parameter fungsi, tetapi kita dapat mengirimkan alamat awalnya.

Agar sebuah fungsi dapat menerima array sebagai parameter, cara yang dilakukan adalah menentukan tipe dan nama array (tanpa menentukan banyak elemen) dalam parameter fungsi saat fungsi dideklarasikan. Contoh :

Void coba_array (int array1[])

Prosedur acak akan menerima sebuah parameter bertipe integer dengan nama p_array, untuk mengirimkan sebuah array yang dideklarasikan sebagai :

Int array [40];

Cukup memanggil fungsi dengan statement :

Coba_array (array);

Contoh :

#include <vcl.h> #pragma hdrstop #include<iostream.h> #include<conio.h> void array (int data[], int panjang)

{ for (int n=0; n<panjang; n++) cout<< data[n] << " "; cout<<endl;

} void main() {

int array1[]={5,10,15}; int array2[]={2,4,6,8,10}; array(array1,3); array(array2,5); getchar();

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Hasil Eksekusi :

Seperti kita lihat pada program di atas, parameter pertama (int data[ ]) menerima sebarang array yang tipenya int, berapapun panjangnya. Untuk itu perlu ditambahkan parameter yang kedua untuk memberitahu panjang array yang dikirim. Nilai ini kemudian dapat dipakai pada statement perulangan for untuk menampilkan elemen array sesuai banyaknya. Dalam deklarasi fungsi juga diperbolehkan untuk memasukkan array multidimensi. Format untuk menyertakan array berbeda dengan format parameter array dimensi satu. Contoh deklarasi parameter array dimensi 3:

Void coba_array ( int array1[ ] [3] [4] )

Perhatikan kurung siku pertama [ ] dibiarkan kosong sementara yang lainnya harus ditentukan. Hal ini karena compiler dalam fungsi harus dapat menentukan berapa besar array pada dimensi tambahan.

Untuk bisa mengetahui lebih jelas tentang sifat-sifat array sebagai parameter sebuah fungsi kita perlu memahami lebih lanjut tentang operasi pointer.

Latihan :

Buat program C++ untuk menampilkan 5 nama Mahasiswa yang diinput melalui keyboard. #include <vcl.h>

#pragma hdrstop #include<iostream.h> #include<conio.h> void data_mahasiswa()

{ string nama [5]; int indeks; for (indeks=1; indeks <=5; indeks++) { cout<<"Masukkan nama mahasiswa ke-"<<indeks<<" : "; cin >> nama[indeks];

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

} clrscr(); cout <<" Daftar Nama Mahasiswa " << endl; cout <<"--------------------- " << endl; cout <<"No | Nama Mahasiswa " << endl; cout <<"--------------------- " << endl; for (indeks=1; indeks <=5; indeks++) { cout << indeks << '\t' << nama[indeks]<<endl; }

} void main() {

clrscr(); data_mahasiswa(); getch();

Jika kita input nama berikut :

Hasil eksekusinya adalah :

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Soal : Dari program latihan di atas kembangkan sehingga dapat menyimpan ‘Umur’ dan ‘Jenis

Kelamin’ dari mahasiswa. Untuk umur adalah yang berumur di atas 20 tahun saja. Kemudian tambahkan program tersebut untuk menghitung rata-rata umur dari semua mahasiswa yang dimasukkan.

Programnya : #include <vcl.h>

#pragma hdrstop #include<iostream.h> #include<conio.h> void data_mahasiswa()

{ string nama [5]; int umur [5]; char jenis[5]; int indeks; int x; float jumlah, rata; for (indeks=1; indeks <=5; indeks++) { cout<<"Masukkan nama mahasiswa ke-"<<indeks<<" : "; cin >> nama[indeks]; cout<<"Masukkan umur mahasiswa ke-"<<indeks<<" : "; cin >> umur[indeks]; cout<<"Masukkan jenis mahasiswa ke-"<<indeks<<" : "; cin >> jenis[indeks]; } clrscr(); cout <<" Daftar Nama Mahasiswa " << endl; cout <<"-------------------------- " << endl; cout <<"No | Nama | Umur | Jenis " << endl; cout <<"-------------------------- " << endl; x=umur[0]; for (indeks=1; indeks <=5; indeks++) if (umur[indeks] > x)

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

for (indeks=1; indeks <=5; indeks++) jumlah = jumlah + umur[indeks]; rata = jumlah/indeks; cout<<endl; cout<<"umur yang paling tua = "<<x<<endl; cout<<endl; cout<<"Jumlah Umur = "<<jumlah<<endl; cout<<"Rata-rata = "<<rata<<endl;

} void main() {

clrscr(); data_mahasiswa(); getch();

Jika diinput dari keyboard data berikut :

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Hasil Eksekusinya adalah :

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Indra Yatini B, Flowchart, Algoritma, dan Pemrograman Menggunakan Bahasa C++ Builder ,

Graha Ilmu, Yogyakarta, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 07

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

MODUL PERKULIAHAN

Pemrograman Algoritma

Struktur Data

Modul Standar untuk digunakan dalam Perkuliahan di Universitas Mercu Buana

Fakultas

Progra Studi

Tatap Muka

Kode MK

Disusu Oleh

Il u Ko puter

I for atika

09 Tim Dosen

A stra t

Ko pete si

 Poi ter  Ma pu e ggu aka poi ter u tuk  Li ked List

e galokasika e ori secara di a is.  Ma pu e jelaska ko sep li ked‐list.  Ma pu

e gi ple e tasika li ked‐ list dala sebuah progra sa pai

de ga e a bah ode‐ ode baru da list traversal.

POINTER dan LINKED LIST

I. POINTER

Pointer adalah tipe data yang digunakan untuk menunjuk ke suatu data. Suatu variabel yang bertipe pointer (variabel pointer) tidak berisi data, melainkan berisi alamat suatu data. Di dalam komputer setiap lokasi data mempunyai alamat yang khas. Gambar berikut contoh suatu pointer yang menunjuk ke suatu data.

Pointer Variabel X

X Data

Berisi

alamat

variabel

Gambar 1. Gambaran Pointer

Berdasarkan kondisi di atas, dimungkinkan untuk mengakses data pada variabel X melalui Pointer.

Pointer biasa digunakan sehubungan dengan pembentukan variabel dinamis. Variabel Dinamis adalah variabel yang bisa dialokasikan di dalam memori atau dihapus dari memori ketika program dieksekusi. Hal seperti ini banyak dipakai pada struktur data seperti linked list dan pohon biner.

1.1. MENDEKLARASIKAN VARIABEL POINTER

Bentuk deklarasi variabel pointer :

tipe *variabel;

Contoh : double *p; p adalah variabel pointer yang menunjuk ke data bertipe double.

menyatakan pointer

double *p;

variabel pointer yang menunjuk

ke data bertipe double

tipe data yang ditunjuk oleh variabel pointer p

Gambar 2. Penentuan tipe Pointer

Contoh lain :

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

string judul; string pengarang; int jumlah;

} struct RekamanBuku *novel;

Pada contoh ini, novel adalah variabel pointer yang menunjuk ke tipe struktur RekamanBuku. Gambarannya seperti berikut :

novel judul

pengarang

jumlah

yang ditunjuk oleh novel bertipe RekamanBuku

gambar 3. Variabel pointer yang menunjuk ke struktur

Supaya suatu variabel pointer menunjuk ke suatu variabel data, penugasan seperti berikut diperlukan :

Variabel_pointer = &variabel_data

 Simbol & berarti alamat.  Pernyataan di atas berarti bahwa : variabel_pointer diisi dengan alamat

variabel_data.

1.2. MENGAKSES DATA VIA POINTER

Untuk melihat cara pengaksesan data melalui pointer, cobalah kode novel.cpp berikut : //kode program novel.cpp

#include <vcl.h> #pragma hdrstop #include <iostream> #include <conio.h> #include <string>

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

string judul; string pengarang; int jumlah;

}; int main() {

struct RekamanBuku *novel, buku; // Isi data buku

buku.judul = "Badai Pasti Berlalu"; buku.pengarang = "Marga T."; buku.jumlah = 2;

// Variabel pointer novel diatur menunjuk ke variabel buku novel = &buku;

// Mengakses data melalui variabel pointer novel cout << "Judul : " << novel->judul << endl; cout << "Pengarang : " << novel->pengarang << endl; cout << "Jumlah : " << novel->jumlah << endl; getch();

Hasil eksekusi program :

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

1.3. MENGGUNAKAN VARIABEL DINAMIS

Beberapa struktur data memanfaatkan variabel dinamis. Variabel dinamis adalah variabel yang bisa diciptakan ketika program dieksekusi. Menciptakan variabel dinamis butuh variabel pointer, kuncinya yaitu operator new. Misalnya terdapat variabel pointer novel yang bertipe pointer. Agar tercipta variabel dinamis yang akan ditunjuk oleh novel, perintahnya adalah :

Novel = new RekamanBuku;

Gambar berikut menunjukkan keadaan setelah pernyataan tersebut dieksekusi :

novel judul

pengarang

jumlah

tanda Tanya menyatakan nilainya belum ditentukan secara eksplisit

oleh pemrogram

Gambar 4. Keadaan setelah variabel dinamis diciptakan Kode program berikut ptrdata.cpp memberikan gambaran tentang penciptaan variabel

dinamis dan pengaksesannya. Anda bandingkan dengan kode yang serupa, tetapi tidak memakai variabel dinamis (yaitu pada program novel.cpp)

//program ptrdata.cpp #include <vcl.h> #pragma hdrstop #include <iostream> #include <conio.h> #include <string> using namespace std; struct RekamanBuku {

string judul; string pengarang; int jumlah;

}; int main() {

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

novel = new RekamanBuku; // Isi data melalui novel

novel->judul = "Meriam Benteng Navarone"; novel->pengarang = "Alistair McClean"; novel->jumlah = 4;

// Mengakses data melalui variabel pointer novel cout << "Judul : " << novel->judul << endl; cout << "Pengarang : " << novel->pengarang << endl; cout << "Jumlah : " << novel->jumlah << endl;

// Bebaskan memori untuk variabel dinamis delete novel; getch();

} Hasil eksekusi program :

1.4. MENGHAPUS VARIABEL DINAMIS

Bila suatu variabel dinamis tidak diperlukan lagi, memori yang digunakannya bisa dihapus. Perintah yang diperlukan untuk keperluan tersebut berupa prosedur delete. Perintahnya adalah :

Deletevariabel_pointer;

Dengan cara tersebut, memori yang ditunjuk oleh variabel_pointer dihapus.

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Keadaan awal :

novel

Setelah delete novel :

novel

Memori untuk data ini dibebaskan atau didealokasikan

Gambar 5. Gambaran penghapusan variabel dinamis Contoh penggunaan delete terdapat pada program ptrdata.cpp, yaitu diletakkan setelah

variabel dinamis tidak diperlukan lagi.

1.5. POINTER dan ARRAY DINAMIS

Array juga dapat dipesan secara dinamis melalui new. Contoh kode program

dinamis.cpp

//kode program dinamis.cpp #include <vcl.h> #pragma hdrstop #include <iostream> #include <conio.h> #include <string> using namespace std; struct RekamanBuku {

string judul; string pengarang; int jumlah;

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

struct RekamanBuku *novel; // Buat variabel dinamis berupa array dan atur agar ditunjuk oleh novel

novel = new RekamanBuku[5]; // Isi data melalui novel

novel[0].judul = "Meriam Benteng Navarone"; novel[0].pengarang = "Alistair McClean"; novel[0].jumlah = 4;

novel[1].judul = "Octopussy"; novel[1].pengarang = "Ian Flemmings"; novel[1].jumlah = 2;

novel[2].judul = "Badai Pasti Berlalu"; novel[2].pengarang = "Marga T."; novel[2].jumlah = 2;

novel[3].judul = "Twilight"; novel[3].pengarang = "Stephenie Meyer"; novel[3].jumlah = 3;

novel[4].judul = "Harry Potter Deadly Hallows"; novel[4].pengarang = "JK Rowlings"; novel[4].jumlah = 4;

// Mengakses data melalui variabel pointer novel for (int j = 0; j < 5; j++) {

cout << "Judul : " << novel[j].judul << endl; cout << "Pengarang : " << novel[j].pengarang << endl; cout << "Jumlah : " << novel[j].jumlah << endl; cout << endl;

} // Bebaskan memori untuk variabel dinamis

delete [] novel; getch();

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Hasil eksekusi program :

Hal yang terpenting dalam menggunakan array dinamis adalah penyebutan jumlah elemen array dilakukan dengan menuliskan jumlah elemen dalam tanda [ ]. Pada program di atas :

novel = new RekamanBuku[5];

menyatakan bahwa jumlah elemen array yang diciptakan dan ditunjuk oleh novel sebanyak

5 buah. Gambaran setelah pernyataan di atas dijalankan dapat dilihat pada gambar berikut : novel

judul pengarang jumlah

novel[0]

novel[1]

novel[2]

novel[3]

novel[4]

Gambar 6. Pengalokasian Array Dinamis

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

II. KONSEP LINKED LIST

1. Mengenal Struktur Data Linked List

Linked List (Senarai Berantai) adalah jenis struktur data yang berisi kumpulan data yang disusun secara linear dengan setiap data disimpan dalam sebuah simpul dan antara satu simpul dengan simpul lain dihubungkan melalui pointer.

Struktur data ini mempunyai bentuk dasar dengan sifat data disisipkan ke dalam senarai melalui salah satu ujungnya. Gambar 7. Menunjukkan keadaan dalam linked list apabila secara berturut-turut nama Amir, Bakdi, Cintya dan Dhanu dimasukkan ke dalam linked list.

Contoh linked list : perta a

Dhanu Cintya Bakdi

Amir null

Gambar 7. Linked List

Perhatikan gambar di atas bahwa Amir sebagai data yang pertama kali dimasukkan akan berada pada salah satu ujung (ujung kanan). Sedangkan data yang terakhir kali dimasukkan yaitu Dhanu, justru berada dibagian kiri, yang ditunjuk oleh pointer pertama. Dengan kata lain, pointer pertama selalu menunjuk ke data yang terakhir kali dimasukkan. Berbeda dengan stack, penghapusan data dalam linked list bias dilakukan di mana saja.

Dalam terminologi linked list, setiap data diletakkan dalam sebuah simpul (node). Pada gambar di atas terdapat 4 buah simpul. Setiap simpul terdiri atas 2 bagian, yaitu bagian data dan bagian penunjuk ke simpul berikutnya. Pada contoh di atas bagian data hanya mengandung sebuah data, yaitu nama orang. Namun bagian data bisa saja mengandung beberapa data. Misalnya bagian data terdiri atas nomor mahasiswa dan nama mahasiswa seperti contoh berikut :

2010.01.001 Andi Sadewo

Berisi nomor mahasiswa Dan Nama mahasiswa

 Pointer yang digunakan untuk menunjuk ke simpul berikutnya.  Berisi NULL kalau tidak menunjuk

Ke simpul.

Gambar 8. Penjelasan simpul dalam linked list

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

2. Operasi Dasar Dalam Linked List (Senarai Berantai)

Operasi dasar pada Linked List berupa :  INSERT( ), menyatakan operasi untuk memasukkan data ke dalam linked list

pada posisi yang ditunjuk oleh pointer pertama. Operasi ini biasa dinyatakan dengan insert(S, d) atau biasa disingkat insert(d). S menyatakan linked list dan d menyatakan item data yang dimasukkan ke dalam linked list S.

 FIND( ), menyatakan operasi untuk mencari suatu data dalam linked list. Operasi

ini biasa dinyatakan dengan fungsi find(pendahulu, x). nilai baliknya berupa true

kalau data yang dicari (yaitu x) ada; atau false kalau data yang dicari tidak ada. Pada saat nilai balik bernilai true, pendahulu menunjuk simpul yang berada tepat sebelum simpul yang berisi data yang dicari.

 REMOVE( ), menyatakan operasi untuk menghilangkan sebuah simpul dari

linked list. Operasi ini biasa dinyatakan dengan remove(S, x) atau remove(x) saja.

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Daftar Pustaka

Abdul Kadir, Teori dan Aplikasi STRUKTUR DATA menggunakan C++ , CV. ANDI OFFSET, Yogyakarta, 2013.

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 08

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

MODUL PERKULIAHAN

Pemrograman Algoritma

Struktur Data

Modul Standar untuk digunakan dalam Perkuliahan di Universitas Mercu Buana

Fakultas

Progra Studi

Tatap Muka

Kode MK

Disusu Oleh

Il u Ko puter

I for atika

10 Tim Dosen

A stra t

Ko pete si

 List traversal secara rekursif  Ma pu e buat progra ya g secara  Pe yisipa ode di awal da di te gah

rekursif elakuka list traversal li ked‐list.

 Ma pu e buat progra ya g elakuka pe yisipa ode di awal da di te gah li ked‐list.

LIST TRAVERSAL

Traversal atau kunjungan simpul list sesuai urutan untuk memproses setiap simpul tepat satu kali. Algoritma traversal, menggunakan variabel penuding PTR untuk menuding simpul yang sedang di proses saat ini. Karena itu LINK(PTR) akan menuding simpul berikut dalam list. Statement PTR := LINK(PTR) akan menggerakkan penuding ke simpul berikutnya.

PTR

Gambar 1.

Algoritma Traversal secara rinci :

Mula-mula, kita awali dengan memberi nilai kepada PTR, sama dengan START. Kita proses INFO(PTR), yakni informasi pada simpul pertama dalam List. Selanjutnya PTR diperbaharui melalui statement PTR := LINK(PTR). Sekarang proses INFO(PTR), yakni informasi pada simpul kedua. Demikian seterusnya sampai nilai PTR = NULL, akhir dari traversal.

ALGORITMA

1. PTR := START.

2. Kerjakan Langkah 3 dan 4 dalam hal PTR <> NULL :

3. Proses INFO(PTR).

4. PTR := LINK(PTR).

5. EXIT. CARI (SEARCHING) DALAM LINKED LIST

1. Cari dalam list tidak terurut

2. Cari dalam list terurut

CARI DALAM LIST TIDAK TERURUT

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Melakukan Traversal Simpul list, sambil setiap kali memeriksa apakah informasi dalam simpul yang tengah dikunjungi tersebut sama dengan ITEM. Dalam algoritma ini diperlukan 2 buah pemeriksaan pada setiap putaran yaitu :

1. Memeriksa apakah telah sampai pada akhir dari list, yakni dengan memeriksa apakah PTR = NULL.

2. Memeriksa apakah ITEM telah ditemukan lokasinya, yakni dengan memeriksa apakah INFO(PTR) = ITEM

ALGORITMA SEARCH(INFO, LINK, START, ITEM, LOC)

1. PTR := START.

2. Kerjakan langkah 3 dalam hal PTR <> NULL :

3. Jika INFO(PTR) = ITEM, maka : LOC := PTR, exit. Bila tidak PTR := LINK(PTR).

4. LOC := NULL. (Pencarian gagal)

5. Exit.

CARI DALAM LIST TERURUT

Melakukan traversal simpul list, sambil setiap kali memeriksa apakah informasi dalam simpul yang tengah dikunjungi tersebut sama dengan ITEM. Karena terurutnya list, tidak perlu melakukan traversal sampai akhir dari list, walau ITEM tidak terdapat dalam list. Begitu INFO(PTR) > ITEM, hentikan proses pencarian. Dalam algoritma ini diperlukan 2 buah pemeriksaan pada setiap putaran yaitu :

1. Memeriksa apakah INFO(PTR) sudah lebih besar dari ITEM, berarti ITEM tidak terdapat dalam list, hentikan proses cari.

2. Memeriksa apakah ITEM telah ditemukan lokasinya, yakni dengan memeriksa apakah INFO(PTR) = ITEM.

ALGORITMA SRCHSL(INFO, LINK, START, ITEM, LOC)

1. PTR := START.

2. Kerjakan langkah 3 dalam hal PTR <> NULL :

3. Jika INFO(PTR) < ITEM, maka : PTR := LINK(PTR). Bila tidak jika ITEM = INFO(PTR), maka :

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

LOC := PTR, dan exit. (pencarian sukses) Bila tidak : LOC := NULL, and exit.

4. LOC := NULL.

5. Exit. Contoh :

// Contoh senarai berantai (linked list) #include <vcl.h> #pragma hdrstop #include <conio.h> #include <iostream> #include <string> using namespace std; class Simpul { public:

string kode; string nama; Simpul* berikut;

// Konstruktor Simpul(string xkode, string xnama) {

kode = xkode; nama = xnama; berikut = NULL;

} void display() {

cout << kode << " : " << nama << endl; } }; class SenaraiBerantai { private:

Simpul* pertama;

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

SenaraiBerantai() {

pertama = NULL; }

// Destruktor ~SenaraiBerantai() {

// Menghapus semua simpul Simpul* penunjukHapus; while (pertama != NULL) {

penunjukHapus = pertama; pertama = pertama->berikut; delete penunjukHapus;

// Memasukkan data ke senarai berantai Nilai balik tidak ada void insert(string kode, string nama) {

Simpul* ptrBaru; ptrBaru = new Simpul(kode, nama); ptrBaru->berikut = pertama; pertama = ptrBaru;

} // Mencari data Nilai balik berupa true kalau yang dicari ketemu

// Dalam hal ini, pendahulu merupakan simpul yang terletak di depan simpul yang dicari bool find(Simpul* &pendahulu, Simpul* &posisiData, string x) {

posisiData = pertama; pendahulu = NULL; bool ditemukan = false; while (posisiData != NULL) {

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

ditemukan = true; break; // Keluar dari while

} pendahulu = posisiData; posisiData = posisiData->berikut;

} return ditemukan;

} // Mencari data Nilai balik berupa NULL kalau yang dicari tidak ketemu

Simpul* find(string x) {

Simpul* pendahulu; Simpul* posisiData; bool ditemukan = find(pendahulu, posisiData, x); if (! ditemukan)

return NULL; else return posisiData; }

// Menghapus simpul yang berisi kode x // Nilai balik berupa : // - true kalau data berhasil dihapus // - false kalau data tidak ada bool remove(string x) {

Simpul* pendahulu; Simpul* posisiData; bool ditemukan = find(pendahulu, posisiData, x); if (! ditemukan) {

cout << "Data yang akan dihapus tidak ditemukan." << endl;

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

// Data yang dihapus ditunjuk oleh pertama pertama = pertama->berikut; delete posisiData;

} else {

// Data yang dihapus tidak ditunjuk oleh pertama pendahulu->berikut = posisiData->berikut; delete posisiData;

// Menampilkan data void display(void) {

cout << "Isi senarai berantai:" << endl; Simpul* penunjuk = pertama; while (penunjuk != NULL) {

penunjuk->display(); penunjuk = penunjuk->berikut;

} } }; int main() {

SenaraiBerantai senarai; // Masukkan 5 buah nama

senarai.insert("AMN", "Aminudin"); senarai.insert("ZAS", "Zaskia"); senarai.insert("RIN", "Rina Melati"); senarai.insert("FAR", "Farhan");

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

// Cari RIN string dicari = "RIN"; cout << endl; cout << "Pencarian " << dicari << endl; Simpul* posisiData = senarai.find(dicari); if (posisiData == NULL)

cout << dicari << " tidak ditemukan." << endl; else {

cout << "Hasil pencarian:" << endl; posisiData->display();

} // Cari FAR

dicari = "FAR"; cout << endl; cout << "Pencarian " << dicari << endl; posisiData = senarai.find(dicari); if (posisiData == NULL)

cout << dicari << " tidak ditemukan." << endl; else {

cout << "Hasil pencarian:" << endl; posisiData->display();

} getch();

Hasil Eksekusi Program :

2015 Pemrograman Algoritma Struktur Data Modul 09

8 tゥュ@dッウ・ョ

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

MODUL PERKULIAHAN

Pemrograman Algoritma

Struktur Data

Modul Standar untuk digunakan dalam Perkuliahan di Universitas Mercu Buana

Fakultas

Progra Studi

Tatap Muka

Kode MK

Disusu Oleh

Il u Ko puter

I for atika

11 Tim Dosen

A stra t

Ko pete si

 ADT Stack  Ma pu e jelaska ya g di aksud  I ple e tasi stack de ga array

de ga ADT stack

 I ple e tasi stack de ga li ked‐list  Ma pu e buat progra ya g

e gi ple e tasika stack de ga array

ADT STACK

I. STRUKTUR DATA TUMPUKAN

Stack (Tumpukan) adalah struktur data yang memungkinkan penyisipan dan pengambilan data dilakukan dari satu ujung yang disebut puncak. Sesuai namanya, struktur data ini digambarkan seperti keadaan tumpukan piring atau tumpukan buku. Cara yang paling mudah untuk meletakkan piring ke dalam tumpukan yakni dengan menaruhnya di bagian puncak. Begitu juga kalau Anda ingin mengambil piring. Piring diambil dari data yang berada di puncak tumpukan.

kosong

A Berisi 3

B Diambil 1

A dari puncak Gambar 1. Struktur Data Tumpukan

Tumpukan memiliki sifat Last In First Out (LIFO). Artinya, data yang terakhir kali dimasukkan/disisipkan akan menjadi data yang pertama kali keluar. Pada contoh di atas, yang berisi tumpukan A, B, dan C jelas terlihat bahwa C adalah data yang terakhir kali ditumpukkan. Jika terjadi operasi pengambilan data maka C adalah data yang akan keluar terlebih dulu.

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

II. OPERASI DASAR PADA TUMPUKAN

Operasi dasar pada tumpukan adalah PUSH dan POP. - PUSH adalah operasi untuk memasukkan data ke dalam tumpukan. Operasi ini

biasa dinyatakan dengan push(T,d). T menyatakan tumpukan dan d menyatakan item data yang disisipkan ke dalam tumpukan T.

- POP adalah operasi untuk mengambil data dari tumpukan. Operasi ini biasa dinyatakan dengan pop(T). Dalam hal ini data teratas dari tumpukan T akan dikeluarkan dan menjadi nilai balik pop. Itulah sebabnya, penggunaan pop sering dituangkan dalam bentuk pernyataan :

data = pop (T); Tabel berikut memperlihatkan sejumlah operasi PUSH dan POP Tabel 1. Ilustrasi PUSH dan POP pada Tumpukan (STACK) Operasi

Penjelasan

Hasil tumpukan T

push(T,’Paris’)

Paris dimasukkan terlebih

Innsbruck push(T, ‘Innsbruck’)

dulu, baru Innsbruck

Paris

pop(T)

Innsbruck dikeluarkan,

Geneva push(T, ‘Amsterdam’)

kemudian Amsterdam

Amsterdam push(T, ‘Geneva’)

dimasukkan, dan diikuti

Paris

Geneva

push(T, ‘Roma’)

Roma dan Vienna

push(T, ‘Vienna’)

ditambahkan

Geneva Amsterdam Paris

pop(T)

Vienna, Roma dan Geneva

London pop(T)

dikeluarkan. Kemudian

Amsterdam pop(T)

London ditambahkan

Paris

push(T, ‘London’)

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

III. APLIKASI TUMPUKAN

Aplikasi Tumpukan (Stack) sangat banyak, beberapa penerapan Tumpukan diantaranya adalah :

Membalik String.

Jika kita memproses suatu string dimulai dari yang paling kiri dan menaruh ke tumpukan karakter per karakter maka karakter paling kiri akan berada pada posisi paling bawah dalam tumpukan. Kalau kemudian, karakter dalam tumpukan diambil satu persatu dan disusun dari kiri ke kanan maka string akan terbentuk dengan susunan terbalik terhadap aslinya, seperti diperlihatkan pada gambar di bawah ini.

String asal FERNANDO

di proses ketumpokan

AN

di ambil satu persatu dan di susun

dari kiri ke kanan : ODNANREF

Gb. Pembalikan string melalui tumpukan

 Mengkonversikan bilangan system decimal ke system biner. Contoh. Bilangan 19 identik dengan bilangan biner : 10011. Algoritma untuk melakukannya adalah seperti berikut :

1. Tumpukan <---- kosong

2. While Bilangan > 0

3. Digit ---- sisa pembagian bilangan bulat dengan 2

4. Push(Tumpukan, Digit)

5. Bilangan ---- pembagian bilangan bulat dengan 2

6. End-While

7. While (Tumpukan tidak kosong)

8. Digit ---- Pop

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

9. Tampilkan digit

10. End-While

 Mengevaluasi Ekspresi Aritmetika. Misalnya, tumpukan dipakai untuk memproses perhitungan semacam (2+1)*3+5*2 yang melibatkan berbagai operator dengan prioritas yang berbeda.

 Memproses pasangan tanda kurung dalam suatu ekspresi. Misalnya, ekspresi seperti (a(b{c|d}[]) dianggap valid, sedangkan ekspresi (a(b{c|d] dianggap tidak valid.

 Menangani fungsi Rekursif. Secara internal computer menggunakan tumpukan ketika terjadi pemanggilan fungsi secara rekursif.

4. Implementasi Stack dengan Vektor

Tumpukan dapat dibuat dengan berbagai cara. Salah satu cara yaitu, menggunakan Vector. Dalam hal ini, jumlah data

Implementasi Stack dengan Vector #include <vcl.h>

#pragma hdrstop #include <iostream> #include <string> #include <vector> using namespace std; class Tumpukan { private:

vector<string> tumpukan; int puncak;

public: // Konstruktor Tumpukan(int ukuran) : puncak(-1) {

tumpukan.resize(ukuran); // Ukuran vector

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

// Memasukkan data ke tumpukan // Nilai balik berupa false // kalau tumpukan sudah penuh bool push(string data) {

// Periksa kalau tumpukan penuh if (puncak == (tumpukan.size()-1))

return false; // Masukkan data ke tumpukan puncak++; tumpukan[puncak] = data;

} string pop(void) {

if (! empty()) return tumpukan[puncak--]; else return ""; // String kosong menyatakan // tumpukan sudah habis } bool empty(void) {

return (puncak == -1); } }; int main() {

int ukuran = 10; Tumpukan stack(ukuran); // Buat objek // Masukkan 5 buah nama stack.push("Aminudin"); stack.push("Zaskia"); stack.push("Rina Melati"); stack.push("Farhan");

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

string nama = stack.pop(); cout << nama << endl;

} getchar();

Hasil Eksekusi Program Tumpukan Dengan Vector

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Indra Yatini B, Flowchart, Algoritma, dan Pemrograman Menggunakan Bahasa C++ Builder ,

Graha Ilmu, Yogyakarta, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 09

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

MODUL PERKULIAHAN

Pemrograman Algoritma

Struktur Data

Modul Standar untuk digunakan dalam Perkuliahan di Universitas Mercu Buana

Fakultas

Progra Studi

Tatap Muka

Kode MK

Disusu Oleh

Il u Ko puter

Tek ik I for atika

12 Tim Dosen

A stra t

Ko pete si

 Ma pu e buat progra ya g  I ple e tasi Stack de ga li ked‐list

e gi ple e tasika stack de ga

li ked‐list

IMPLEMENTASI STACK DENGAN LINKED LIST

I. Implementasi Aplikasi Linked List untuk membuat tumpukan (Stack)

// Implementasi kelas SimpulTumpukan dan ListTumpukan // (Aplikasi untuk membalik string) #include <vcl.h> #pragma hdrstop #include <iostream> #include <string> #include <conio.h> using namespace std; class SimpulTumpukan {

public: char data; SimpulTumpukan* berikut;

// Konstruktor SimpulTumpukan(char data);

class ListTumpukan {

private: SimpulTumpukan* puncak; public: ListTumpukan(); virtual ~ListTumpukan(); void push(char data); bool empty(); char pop();

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

// Konstruktor SimpulTumpukan::SimpulTumpukan(char data) {

SimpulTumpukan::data = data; SimpulTumpukan::berikut = NULL;

ListTumpukan::ListTumpukan() {

ListTumpukan::puncak = NULL; } // Destruktor ListTumpukan::~ListTumpukan() {

// Menghapus semua simpul SimpulTumpukan* penunjukHapus; while (puncak != NULL) {

penunjukHapus = puncak; puncak = puncak->berikut; delete penunjukHapus;

// push() (Bersifat publik) // Untuk memasukkan data ke dalam tumpukan

void ListTumpukan::push(char data) {

SimpulTumpukan* ptrBaru;

ptrBaru = new SimpulTumpukan(data); ptrBaru->berikut = puncak; puncak = ptrBaru;

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

// empty() (Bersifat publik) // Menghasilkan true kalau tumpukan dalam keadaan kosong

bool ListTumpukan::empty() {

return puncak == NULL; }

// pop() (Bersifat publik) // Mengambil sebuah nilai dari tumpukan char ListTumpukan::pop() {

if (empty()) {

cout << "Tumpukan sudah kosong. " << "Tidak bisa diambil lagi" << endl; return 0; // Karakter NULL menyatakan tumpukan sudah kosong }

SimpulTumpukan* ptrData; char data; ptrData = puncak; data = puncak->data; puncak = puncak->berikut; delete ptrData; return data;

} int main() {

ListTumpukan tumpukan; tumpukan.push('A'); tumpukan.push('B'); tumpukan.push('C'); tumpukan.push('D');

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

// Ambil isi tumpukan cout << "Isi tumpukan dari atas ke bawah:" << endl; char karakter; while (! tumpukan.empty()) {

karakter = tumpukan.pop(); cout << karakter << endl;

getch(); }

Hasil eksekusi :

II. APLIKASI DOUBLE LINKED LIST (SENARAI BERANTAI GANDA)

Double Linked List adalah jenis linked list yang memiliki 2 buah pointer. Pointer pertama dipakai untuk menunjuk ke simpul berikutnya dan pointer kedua digunakan untuk menunjuk ke simpul pendahulunya.

// Contoh untuk menguji senarai berantai ganda #include <vcl.h> #pragma hdrstop #include <iostream> #include <conio.h> using namespace std; class SimpulGanda {

public:

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

// Konstruktor SimpulGanda(char data); }; class ListGanda {

private: SimpulGanda* pertama; SimpulGanda* terakhir;

public: ListGanda(); virtual ~ListGanda(); void insertFirst(char data); void insertLast(char data); bool insertAfter(char kunci, char data); bool empty(); char removeFirst(); char removeLast(); bool removeKey(char data); void displayForward(); void displayBackward();

}; // Konstruktor SimpulGanda::SimpulGanda(char data) { // Konstruktor

SimpulGanda::data = data; SimpulGanda::berikut = NULL; SimpulGanda::sebelum = NULL;

} // Konstruktor ListGanda::ListGanda() { // Konstruktor

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

ListGanda::pertama = NULL; ListGanda::terakhir = NULL;

} // Destruktor ListGanda::~ListGanda() { // Destruktor // Menghapus semua simpul

SimpulGanda* penunjukHapus; while (pertama != NULL) {

penunjukHapus = pertama; pertama = pertama->berikut; delete penunjukHapus;

} } // insertFirst() (Bersifat publik) // Menyisipkan data ke dalam senarai // sehingga akan ditunjuk oleh pertama void ListGanda::insertFirst(char data) { // Buat simpul baru dan isikan Karakter ke dalam simpul SimpulGanda* ptrBaru = new SimpulGanda(data); // Atur penunjuk ke simpul

if (empty()) terakhir = ptrBaru; else pertama->sebelum = ptrBaru; ptrBaru->berikut = pertama; ptrBaru->sebelum = NULL; pertama = ptrBaru;

} // insertLast() (Bersifat publik) // Menyisipkan data ke akhir senarai void ListGanda::insertLast(char data) {

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

// Buat simpul baru dan isikan karakter ke dalam simpul SimpulGanda* ptrBaru = new SimpulGanda(data); // Atur penunjuk ke simpul if (empty()) pertama = ptrBaru; else {

terakhir->berikut = ptrBaru; ptrBaru->sebelum = terakhir;

} ptrBaru->berikut = NULL; terakhir = ptrBaru;

} // insertAfter() (Bersifat publik) // Menyisipkan data ke sesudah kunci kunci bool ListGanda::insertAfter(char kunci, char data) {

char ditemukan = false; // Cari posisi Key SimpulGanda* ptrData = pertama; while (ptrData != NULL) {

if (ptrData->data == kunci) {

ditemukan = true; break;

} ptrData = ptrData->berikut;

} // Cek kalau tidak ditemukan if (! ditemukan) {

return false; } // Buat simpul baru dan isikan data ke dalam simpul SimpulGanda* ptrBaru = new SimpulGanda(data);

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

// Atur penunjuk ke simpul if (ptrData == terakhir) {

ptrBaru->berikut = NULL; terakhir = ptrBaru;

} else {

ptrBaru->berikut = ptrData->berikut; ptrData->berikut->sebelum = ptrBaru;

} ptrBaru->sebelum = ptrData; ptrData->berikut = ptrBaru; return true;

} // empty() (Bersifat publik) // Menghasilkan true kalau senarai kosong atau false kalau tidak kosong bool ListGanda::empty() {

return pertama == NULL; } // removeFirst() (Bersifat publik) // Menghapus data pada simpul yang ditunjuk oleh pertama char ListGanda::removeFirst() {

if (empty()) {

cout << "Tumpukan sudah kosong" << endl; return 0;

} char data = pertama->data; SimpulGanda* ptrData = pertama; if (pertama->berikut == NULL)

terakhir = NULL; else pertama->berikut->sebelum = NULL;

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

} // removeLast() (Bersifat publik) // Menghapus data pada simpul yang ditunjuk oleh terakhir char ListGanda::removeLast() {

if (empty()) {

cout << "Tumpukan sudah kosong" << endl; return 0;

} char data = terakhir->data; SimpulGanda* ptrData = terakhir; if (pertama->berikut == NULL)

pertama = NULL; else terakhir->sebelum->berikut = NULL;

terakhir = terakhir->sebelum; delete ptrData; return data;

} // removeKey() (Bersifat publik) // Menghapus simpul yang sesuai dengan kunci // Hasil true kalau data dihapus false kalau tak ada yang dihapus bool ListGanda::removeKey(char data) {

SimpulGanda* ptrData = pertama; while (ptrData->data != data) {

ptrData = ptrData->berikut; if (ptrData == NULL) {

return false;

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

} } if (ptrData == pertama)

pertama = ptrData->berikut; else ptrData->sebelum->berikut = ptrData->berikut; if (ptrData == terakhir) terakhir = ptrData->sebelum; else ptrData->berikut->sebelum = ptrData->sebelum; delete ptrData; return true;

} // displayForward() (Bersifat publik) // Menampilkan isi senarai dari pertama ke terakhir void ListGanda::displayForward() {

cout << "Dari pertama ke terakhir: " << endl; SimpulGanda* ptrData = pertama; while (ptrData != NULL) {

cout << ptrData->data; ptrData = ptrData->berikut;

} cout << endl; // Pindah baris

} // displayBackward() (Bersifat publik) // Menampilkan isi senarai dari terakhir ke pertama void ListGanda::displayBackward() {

cout << "Dari terakhir ke pertama: " << endl; SimpulGanda* ptrData = terakhir; while (ptrData != NULL) {

cout << ptrData->data; ptrData = ptrData->sebelum;

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

} cout << endl; // Pindah baris

} int main() {

ListGanda senarai; senarai.insertFirst('A'); senarai.insertFirst('B'); senarai.insertFirst('C'); senarai.insertFirst('D'); senarai.insertFirst('E'); senarai.displayForward(); cout << "Penyisipan X dan Y: " << endl; senarai.insertLast('X'); senarai.insertLast('Y'); senarai.displayBackward(); senarai.displayForward();

char karakter = senarai.removeFirst(); cout << "Karakter terkiri yang diambil: " << endl; senarai.displayForward();

senarai.removeKey('C'); cout << "Setelah C diambil:" << endl; senarai.displayForward();

karakter = senarai.removeLast(); cout << "Karakter terkanan yang diambil: " << endl; senarai.displayForward();

cout << "Penyisipan setelah B: " << endl; senarai.insertAfter('B', 'M'); senarai.displayForward();

getch(); }

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Hasil eksekusi :

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Daftar Pustaka

Abdul Kadir, Teori dan Aplikasi Struktur Data Menggunakan C++ , Penerbit Andi, Yogyakarta, 2013

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 11

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

MODUL PERKULIAHAN

Pemrograman Algoritma

Struktur Data

Modul Standar untuk digunakan dalam Perkuliahan di Universitas Mercu Buana

Fakultas

Progra Studi

Tatap Muka

Kode MK

Disusu Oleh

Il u Ko puter

I for atika

13 Tim Dosen

A stra t

Ko pete si

 Ma pu e jelaska ya g di aksud  ADT Queue

de ga ADT ueue

 I ple e tasi ueue de ga array li ear  Ma pu e buat progra ya g

e gi ple e tasika ueue de ga 

da sirkular

I ple e tasi ueue de ga li ked‐list array li ear da sirkular.  Ma pu e buat progra ya g

e gi ple e tasika Queue de ga li ked‐list

ADT (Abstrack Data Type) QUEUE

I. ADT QUEUE

Queue disebut juga antrian dimana data masuk di satu sisi dan keluar di sisi yang lain. Karena itu, queue bersifat FIFO (First In First Out). Antrian ( Queue ) merupakan suatu kumpulan data yang penambahan elemennya (masuk antrian) hanya bisa dilakukan pada suatu ujung (disebut dengan sisi belakang/ rear ) atau disebut juga enqueue yaitu apabila seseorang masuk ke dalam sebuah antrian. Jika seseorang keluar dari antrian/penghapusan (pengambilan elemen) dilakukan lewat ujung yang lain (disebut dengan sisi depan/ front ) atau disebut juga dequeue yaitu apabila seseorang keluar dari antrian.

Jadi, dalam antrian menggunakan prinsip “masuk pertama keluar pertama” atau disebut juga dengan prinsip FIFO ( first in first out ). Dengan kata lain, urutan keluar akan sama dengan urutan masuknya. Contoh : antrian mobil saat membeli karcis di pintu jalan tol, antrian di bioskop dan sebagainya.

1. Operasi / Prosedur Standar pada QUEUE / ANTRIAN

QUEUE merupakan struktur data dinamis, ketika program dijalankan, jumlah elemennya dapat berubah secara dinamis sesuai keperluan. Berikut ini operasi-operasi standar pada queue :

a. Inisialisasi, merupakan prosedur untuk membuat queue pada kondisi awal, yaitu queue yang masih kosong (belum mempunyai elemen).

b. InQueue, Insert Queue merupakan prosedur untuk memasukkan sebuah elemen baru pada queue. Jumlah elemen Queue akan bertambah satu dan elemen tersebut merupakan elemen belakang.

c. DeQueue, Delete Queue merupakan prosedur untuk menghapus/mengambil sebuah elemen dari queue. Elemen yang diambil adalah elemen depan dan jumlah elemen queue akan berkurang satu.

Hal lain yang perlu diperhatikan dalam suatu struktur dinamis adalah jumlah elemen struktur data tersebut. Operasi-operasi yang berhubungan dengan jumlah elemen suatu queue adalah :

1. Size , yaitu operasi untuk mendapatkan banyaknya elemen queue.

2. Empty , yaitu prosedur untuk mengetahui apakah queue dalam keadaan kosong atau tidak. Dengan status ini maka dapat dicegah dilakukannya operasi Dequeue

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

3. Full , merupakan prosedur untuk mengetahui apakah Queue penuh atau tidak. Prosedur ini hanya berlaku untuk queue yang jumlahnya terbatas.

II. IMPLEMENTASI QUEUE DENGAN ARRAY LINEAR dan SIRKULAR

Karena antrian merupakan suatu kumpulan data, maka tipe data yang sesuai untuk menyajikan antrian adalah menggunakan array atau list (senarai berantai).

Perhatikan gambar berikut ini :

depan

keluar masuk

belakang

gambar 1. Contoh antrian dengan 6 elemen

Gambar di atas menunjukkan contoh penyajian antrian menggunakan array. Antrian di atas berisi 6 elemen, yaitu A, B, C, D, E dan F. Elemen A terletak di bagian depan antrian dan elemen F terletak di bagian belakang antrian. Jika ada elemen baru yang akan masuk, maka elemen tersebut akan diletakkan di sebelah kanan F. Dan jika ada elemen yang akan dihapus, maka A akan dihapus terlebih dahulu.

Elemen A terletak di bagian depan, kemudian disusul elemen B dan elemen yang paling akhir atau paling belakang adalah elemen F. Misalkan ada elemen baru yang akan masuk maka akan terletak di belakang elemen F, sehingga elemen baru akan menempati posisi yang paling belakang.

Gambar 2 menunjukkan antrian di atas dengan penambahan elemen G dan H, sehingga gambar 1. Menjadi :

depan

keluar masuk

belakang gambar 2. Contoh penambahan antrian dengan 2 elemen

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Gambar 3 menunjukkan antrian dengan penghapusan elemen A dan B, sehingga gambar 1 menjadi :

depan

keluar masuk

belakang gambar 3. Contoh penghapusan antrian dengan 2 elemen

Seperti pada tumpukan atau stack di dalam antrian juga dikenal 2 operasi dasar yaitu menambah elemen baru yang akan diletakkan di bagian belakang antrian dan menghapus elemen yang terletak di bagian depan antrian. Selain itu kita juga harus melihat antrian itu mempunyai isi atau masih kosong.

Untuk memahami penggunaan antrian dalam array, kita membutuhkan deklarasi antrian, misalnya sebagai berikut :

# define MAXN 6 Typedef enum { NOT_OK, OK } Tboolean; Typedef struct {

Titem array [MAXN]; int first; int last; int number_of_items;

} Tqueue

Dengan deklarasi di atas, elemen antrian dinyatakan dalam tipe integer yang semuanya terdapat dalam struktur. Variabel first menunjukkan posisi elemen pertama dalam array, dan variabel last menunjukkan posisi elemen terakhir dalam array.

Algoritma dari penggalan program di atas adalah :

1. Tentukan elemen yang akan dimasukkan ke dalam antrian (dalam hal ini adalah 6 elemen).

2. Deklarasikan struktur untuk menampung elemen pada antrian.

3. Selesai. Untuk menambah elemen baru dan mengambil elemen dari antrian dalam antrian, diperlukan deklarasi berikut ini :

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

} Tboolean enqueue ( Tqueue *Pqueue, Titem item)

{ if (Pqueue -> number_of_items >= MAXN) return (NOT_OK); else {

Pqueue -> last++; if (Pqueue -> last > MAXN -1) Pqueue -> = 0; Pqueue -> array[Pqueue->last] = item; Pqueue -> number_of_items++; return (OK);

Tboolean dequeue (Tqueue *Pqueue, Titem, item) { if (Pqueue -> number_of_items == 0) return (NOT_OK); else {

*Pitem = Pqueue -> array[Pqueue->first++]; if (Pqueue -> first > MAXN -1) Pqueue -> first = 0; Pqueue -> number_of_items--; return (OK);

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Contoh program antrian : // Contoh antrian

#include <vcl.h> #pragma hdrstop #include <iostream> #include <string> #include <conio.h> #include <vector> using namespace std; class Antrian { private:

vector<string> data; int depan, belakang; int maksElemen;

public: // Konstruktor Antrian(int ukuran) {

depan = 0; belakang = 0; maksElemen = ukuran; data.resize(ukuran); // Ukuran vector

} // Memasukkan data ke antrian // Nilai balik tidak ada void insert(string x) {

int posisiBelakang; // Geser belakang ke posisi berikutnya if (belakang == maksElemen)

posisiBelakang = 1; else posisiBelakang = belakang + 1; // Cek belakang apa sama dengan Depan if (posisiBelakang == depan)

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

belakang = posisiBelakang; // Masukkan data data[belakang] = x;

} } string remove(void) {

if (empty()) {

cout << "Antrian kosong" << endl; return "";

} if (depan == maksElemen)

depan = 1; else depan = depan + 1; return data[depan]; } bool empty(void) {

if (depan == belakang) return true; else return false; } }; int main() {

int ukuran = 10; Antrian daftar(ukuran); // Buat objek // Masukkan 5 buah nama daftar.insert("Aminudin"); daftar.insert("Zaskia");

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

string nama = daftar.remove(); cout << nama << endl;

} getch();

Hasil eksekusi :

III. IMPLEMENTASI QUEUE DENGAN LINKED LIST

Untuk memanipulasi sebuah antrian bisa digunakan dua buah variabel yang menyimpan posisi elemen paling depan dan elemen paling belakang. Apabila antrian diimplementasikan menggunakan linked list maka cukup 2 pointer yang bisa dipakai yaitu elemen paling depan (kepala) dan elemen paling belakang (ekor).

Untuk mengimplementasikan antrian dengan menggunakan pointer, perhatikan algoritma berikut ini :

1. Tentukan struktur untuk menampung node yang akan dimasukkan pada antrian. Deklarasi struktur pada penggalan program berikut ini :

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

char data; struct queueNode *nextPtr;

}; typedef struct queueNode QUEUENODE; ypedef QUEUENODE * QUEUENODEPTR; QUEUENODEPTR headPtr = NULL, tailPtr = NULL;

2. Deklarasikan penambahan elemen baru pada antrian, dimana letaknya adalah paling belakang. Deklarasi penambahan elemen baru tersebut dapat dilihat pada penggalan program berikut ini :

void enqueue ( QUEUENODEPTR *headPtr, QUEUENODEPTR *tailPtr, char value ) { QUEUENODEPTR newPtr = malloc ( sizeof ( QUEUENODE ) );

If ( newPtr != NULL ) {

newPtr -> data = value; newPtr -> nextPtr = NULL; if ( isEmpty ( *headPtr ) )

*headPtr = newPtr;

else ( *tailPtr ) -> nextPtr = newPtr;

*tailPtr = newPtr;

3. Lakukan pengecekan terhadap antrian, apakah antrian dalam kondisi kosong atau tidak. Kalau kondisi antrian kosong, maka elemen bisa dihapus. Penggalan program berikut ini akan menunjukkan kondisi tersebut.

int isEmpty ( QUEUENODEPTR headPtr ) {

return headPtr == NULL;

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Indra Yatini B, Flowchart, Algoritma, dan Pemrograman Menggunakan Bahasa C++ Builder ,

Graha Ilmu, Yogyakarta, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 12

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

MODUL PERKULIAHAN

Pemrograman Algoritma

Struktur Data

Modul Standar untuk digunakan dalam Perkuliahan di Universitas Mercu Buana

Fakultas

Progra Studi

Tatap Muka

Kode MK

Disusu Oleh

Il u Ko puter

Tek ik I for atika

14 Tim Dosen

A stra t

Ko pete si

 Ma pu e jelaska ya g di aksud

 ADT Bi ary Tree de ga ADT Bi ary Tree  Ma pu e gi ple e tasika bi ary

tree e ggu aka li ked‐list  Ma pu e gi ple e tasika operasi

da a ipulasi terhadap bi ary tree

ADT Binary Tree

I. ADT Binary Tree

Definisi Pohon adalah :  Susunan dari satu atau lebih simpul (node) yang terdiri dari satu simpul khusus yang

disebut akar (root) sedang sisanya membentuk subtree dari akar. LEVEL

KL

Akar dari struktur pohon ini adalah A

Satu simpul akan berisi : ~

Informasi ( misal, A , B, dst) ~

Cabang-cabang (Link) yang menghubungkan Kesimpul simpul yang lain. Simpul A sebagai akar mempunyai 3 Link yang membentuk SUBTREE B,C, D. Jumlah SUBTREE dari satu simpul disebut : DERAJAT (DEGREE). Derajat Simpul : A = 3

Simpul yang mempunyai derajat = 0 disebut : SIMPUL TERMINAL atau DAUN (LEAF) Contoh simpul daun gambar diatas adalah : K , L, F, G, M, I , J

Struktur Pohon yang terkenal adalah struktur geneologi (silsilah). Dalam struktur tersebut adanya simpul anak (children) dan orangtua(parent)

2015 Pemrograman Algoritma Struktur Data Modul 13

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Contoh anak D adalah

H, I, J

Orangtua D adalah A

Anak dari orang tua yang sama (saudara sekandung) disebut sibling misal H,I,J.

DERAJAT (DEGREE) SUATU POHON

Adalah derajat maksimum dari suatu simpul dalam pohon. Contoh derajat pohon dalam gambar diatas adalah 3. Nenek Moyang dari dari suatu simpul adalah seluruh simpul-simpul yang ada sepanjang lintasan dari akar sampai simpul tersebut. Contoh nenek moyang dari M adalah A, D dan H.

KEDALAMAN (HEIGHT atau DEPTH)

Kedalaman suatu pohon ditentukan oleh level maksimum dari simpul dalam pohon. Contoh kedalaman pohon dari gambar diatas adalah A.

HUTAN (FOREST)

Adalah susunan dari beberapa pohon. Bila akar A dihilangkan maka akan diperoleh hutan dengan 3 pohon yaitu :

B(E(K,L),F) C(G) D(H(M),I,J)

Ada 2 cara untuk menyatakan struktur pohon yaitu :

1. Gambar

2. Daftar(List) Pernyataan dengan Gambar adalah seperti terlihat pada Gambar diatas sedangkan kalau

dengan List adalah sebagai berikut :

(A(B(E(K,L),F),C(G),D(H(M),I,J)))

Proses dalam struktur data non linier, bentuk pohon akan lebih mudah digambarkan bila diketahui :

1. n ( Jumlah Simpul atau Node )

2. k ( Derajat Pohon)

Dari data n dan k maka dapat dihitung : JUMLAH LINK

= n.k

JUMLAH NULL-LINK

= n( k - 1)+1

2015 Pemrograman Algoritma Struktur Data Modul 13

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

JUMLAH NON ZERO LINK = n - 1 STRUKTUR NODE K-ary

Pohon 3 - ary :

Dari gambar diatas diket : n = 10 , k = 3 Maka dapat dihitung :

JUMLAH LINK

= n . k = 3. 10 = 30

JUMLAH NULL LINK

= n(k–1)+1 = 10( 3 – 1 ) + 1 = 21

JUMLAH NON ZERO LINK = n – 1 = 10 – 1 = 9

POHON BINER (BINARY TREE)

 Tipe yang sangat penting dari struktur data  Dalam struktur pohon biner hanya dikenal SUBTREE KIRI DAN SUBTREE KANAN

saja

Simpul dalam pohon biner adalah :

Susunan dari simpul-simpul yang masing-masing bisa kosong atau terdiri dari akar dan dua pohon biner yang terpisah dan disebut subtree kiri dan subtree kanan.

2015 Pemrograman Algoritma Struktur Data Modul 13

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

A Pohon biner dengan subtree kanan kosong

Pohon biner dengan subtree kiri kosong

Complete Binary Tree

Pohon Biner Penuh ( Full Binary Tree)

Adalah pohon biner yang mempunyai simpul atau node lengkap dari level 1 sampai level ke I

Full Binary Tree

Pohon Biner Lengkap ( Complete Binary Tree)

Adalah pohon biner yang mempunyai simpul dengan nomor urut 1 sampai dengan n.

2015 Pemrograman Algoritma Struktur Data Modul 13

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

Anak terkiri menunjukkan anak Terkanan menujukkan 1 Jumlah simpul jumlah max simpul 1

No anak kiri (Left Child) = No. Parent * 2 No anak kanan (Right Child) = (No. Parent *2) + 1

No Parent = No Child

Pertanyaan

1. Pohon dengan simpul jumlah simpul = 273 merupakan lengkap atau penuh

2. Berapa kedalamannya ?

3. No berapa simpul terkiri dari level tersebut ?

4. berapa jumlah maxsimum simpul level 7

5. No berapa anak kanan dari simpul ke 180 ?…..ada dilevel berapa anak tersebut.

6. No. berapa orang tua dari simpul ke 83 ? … ada dilevel berapa orangtua tsb

2015 Pemrograman Algoritma Struktur Data Modul 13

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Kedalaman minimal dari pohon biner adalah :

2 Log n + 1 --  dimana n = jumlah simpul

Contoh bila n = 15 Maka kedalamannya minimal =

2 Log 15 + 1 = Log 15 + 1

Log 2 = 1.17 / 0.3 + 1 = 3 + 1 = 4

SKEWED TREE Binary Tree yang semua nodenya (kecuali leaf/daun) hanya memiliki satu child.

Adalah Pohon biner yang miring kekiri atau kekanan, atau dengan kata lain pohon biner dengan subtree kiri kosong atau subtree kanan kosong.

Pohon Biner seperti ini disimpan dalam bentuk

B Array sangat memboroskan

REPRESENTASINYA sebagai berikut :

9 Kosong sebanyak 7 Elemen

Berdasarkan full binary tree, pohon jenis diatas memiliki banyak simpul kosong. Seharusnya dibawah A, terdapat simpul anak yg selevel, namun hanya terdapat 1 simpul anak yaitu B, dibawah B, seharusnya terdapat 1 simpul anak B, 2 simpul anak lainnya yang selevel atau 2 simpul anak dari simpul yg selevel dengan B, kosong 3 array.

2015 Pemrograman Algoritma Struktur Data Modul 13

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Terlihat dari contoh diatas bahwa penyimpanan data dalam memori dari pohon biner hanya menguntungkan kalau pohon binernya penuh sehingga tidak memboroskan tempat. Untuk menanggulangi ini maka perlu menggunakan representasi Linked List, dimana masing-masing simpul akan mempunyai 3 field yaitu :

LCHILD DATA

Contoh Representasi Link Pohon Biner Biasa

2015 Pemrograman Algoritma Struktur Data Modul 13

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Indra Yatini B, Flowchart, Algoritma, dan Pemrograman Menggunakan Bahasa C++ Builder ,

Graha Ilmu, Yogyakarta, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 13

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

MODUL PERKULIAHAN

Pemrograman Algoritma

Struktur Data

Modul Standar untuk digunakan dalam Perkuliahan di Universitas Mercu Buana

Fakultas

Progra Studi

Tatap Muka

Kode MK

Disusu Oleh

Il u Ko puter

Tek ik I for atika

14 Tim Dosen

A stra t

Ko pete si

 Ma pu e gi ple e tasika traversal  ADT Bi ary Tree pre‐order, i ‐order da post‐order.  Ma pu e gi ple e tasika progra ya g elakuka pe caria pada bi ary tree

ADT Binary Tree

I. PENELUSURAN POHON BINER ( Binary Tree Traversal )

Ada 3 macam Traversal :

1. Inorder Traversal

2. Preorder Traversal

3. Postorder Traversal

1. Inorder Traversal

Akan menghasilkan bentuk INFIX, Bentuknya :

Operand1 Operator Operand2

Contoh Tulislah hasil penelusuran pohon biner berikut ini bila ditelusuri secara INORDER.

Langkah-langkahnya :

1. Telusuri Subtree (sub pohon) Kiri

2. Proses Simpul Akar

3. Telusuri Subtree(Sub pohon) Kanan maka akan diperoleh persamaan INORDERnya adalah: (A + B) * C

2. Preorder Traversal

Akan menghasilkan bentuk PREFIX, Bentuknya

Operator Operand1 Operand2

2015 Pemrograman Algoritma Struktur Data Modul 14

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

Contoh Tulislah hasil penelusuran pohon biner berikut ini bila ditelusuri secara PREORDER.

Langkah-langkahnya :

1. Proses Simpul Akar

2. Telusuri Subtree(sub pohon) Kiri

3. Telusuri Subtree(Sub pohon) Kanan maka akan diperoleh persamaan PREORDERnya adalah: *+A B C

3. Postorder Traversal

Akan menghasilkan bentuk POSTFIX, Bentuknya :

Operand1 Operand2 Operator

Contoh Tulislah hasil penelusuran pohon biner berikut ini bila ditelusuri secara POSTORDER.

Langkah-langkahnya :

1. Telusuri Subtree(sub pohon) Kiri

2. Telusuri Subtree(Sub pohon) Kanan

3. Proses Simpul akar maka akan diperoleh persamaan POSTORDERnya adalah:

A B+ C*

2015 Pemrograman Algoritma Struktur Data Modul 14

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

SOAL latihan

1. Buat Persamaan INORDER, PREORDER, DAN POST ORDER dari Tree Berikut :

2. Diket Persamaan POST ORDER :

A B / C * D E ** F / + 2 –

Buat INORDER, PREORDER, dan buat Tree nya.

II. BINARY SEARCH TREE adalah Binary tree dengan sifat bahwa :  semua left child harus lebih kecil daripada right child dan parentnya.

 Juga semua right child harus lebih besar daripada left child dan parentnya. Binary search tree dibuat untuk mengatasi kelemahan pada binary tree biasa, yaitu kesulitan

dalam searching atau pencarian node tertentu dalam binary tree. Contoh binary search tree umum :

Pada dasarnya operasi dalam binary search tree sama dengan binary tree biasa, kecuali pada operasi insert, update dan delete .

2015 Pemrograman Algoritma Struktur Data Modul 14

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

~ OPERASI INSERT

Pada binary search tree, insert dilakukan setelah ditemukan lokasi yang tepat (lokasi tidak ditentukan oleh user sendiri). Misalnya anda diminta memasukkan angka-angka berikut ini ke dalam suatu binary search tree. Angka-angka tersebut adalah 12, 15, 13, 9, 5, 11, 20

Algoritma dari insert ini adalah :

1. Masukkan sebuah huruf, angka pertama yang masuk akan menjadi root.

2. Kemudian masukkan angka berikutnya ke dalam tree tersebut.

3. Bandingkan angka tersebut dengan angka yang menjadi root, apabila angkanya lebih besar dari root maka letaknya ada di sebelah kanan. Kalau angkanya lebih kecil, maka letaknya di sebelah kiri root.

4. Untuk sub root atau child, caranya juga sama dengan langkah 3. Implementasi dari algoritma di atas dapat dilihat pada ilustrasi gambar berikut ini ;

1. Insert angka 12

Masukkan angka 12 ke dalam tree. Karena tree masih kosong maka otomatis angka

12 menjadi root.

2. Insert angka 15

Karena angka 15 lebih besar dari angka 12, maka sesuai dengan aturan yang ada dalam binary search tree, angka 15 ini berada di sebelah kanan angka 12.

3. Insert angka13

Karena angka 13 yang dimasukkan lebih besar dari angka 12, maka sesuai dengan aturan yang berlaku, angka 13 ini harus berada di sebelah kanan angka 12. Kemudian karena disebelah kanan angka 12 sudah ada angka 15, maka angka 13 ini harus dibandingkan lagi dengan angka 15. Karena angka 13 lebih kecil dari angka 15, maka posisinya ada disebelah kiri angka 15.

2015 Pemrograman Algoritma Struktur Data Modul 14

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

4. Insert angka 9

Karena angka 9 yang dimasukkan lebih kecil dari angka 12, maka sesuai dengan aturan yang berlaku angka 9 ini harus berada di sebelah kiri angka 12.

5. Insert angka 5

Karena angka 5 lebih kecil dari angka 12, maka sesuai aturan yang berlaku angka 5 ini harus berada di sebelah kiri angka 12. Kemudian karena di sebelah kiri angka 12 sudah ada angka 9, maka angka 5 ini harus dibandingkan lagi dengan angka 9. Karena angka 5 lebih kecil dari angka 9, maka posisinya ada di sebelah kiri angka 9.

6. Insert angka 11

Karena angka 11 lebih kecil dari angka 12, maka sesuai dengan aturan yang berlaku angka 11 ini harus berada di sebelah kiri angka 12. Kemudian karena di sebelah kiri angka 12 sudah ada angka 9, maka angka 11 ini harus dibandingkan lagi dengan angka 9. Karena angka 11 lebih besar dari angka 9, maka posisinya ada di sebelah kanan angka 9.

2015 Pemrograman Algoritma Struktur Data Modul 14

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

7. Insert angka 20

Karena angka 20 lebih besar dari angka 12, maka sesuai dengan aturan yang berlaku angka 20 ini harus berada di sebelah kanan angka 12. Kemudian karena di sebelah kanan angka 12 sudah ada angka 15, maka angka 20 ini harus dibandingkan lagi dengan angka 15. Karena angka 20 lebih besar dari angka 15, maka posisinya ada di sebelah kanan angka 15.

~ OPERASI UPDATE

Seperti pada binary tree biasa, namun disini update akan berpengaruh pada posisi node selanjutnya. Bila setelah diupdate mengakibatkan tree tersebut bukan Binary Search Tree lagi, maka harus dilakukan perubahan pada tree dengan melakukan rotasi supaya tetap menjadi Binary Search Tree.

~ OPERASI DELETE

Delete dilakukan setelah ditemukan lokasi yang tepat. (lokasi tidak ditentukan oleh user sendiri). Misalnya dari angka-angka berikut ini dan sesuai dengan permasalahan pada operasi insert yaitu 12, 15, 13, 9, 5, 11, 20. Anda diminta untuk menghapus angka 5, 20,

12, 9 dan 15. Adapun algoritma dari delete ini adalah :

1. Tentukan angka yang akan dihapus.

2. Kalau angka tersebut merupakan leaf, maka bisa langsung dihapus.

3. Kalau angka yang dihapus mempunyai 1 atau lebih cabang, maka posisi angka yang dihapus dapat digantikan pada angka yang merupakan leaf baik itu berada pada sub tree kiri atau kanan.

Implementasi dari algoritma di atas dapat dilihat pada ilustrasi gambar berikut ini :

1. Delete angka 5

Karena angka 5 merupakan leaf, maka angka 5 ini langsung dapat dihapus.

2015 Pemrograman Algoritma Struktur Data Modul 14

Pusat Bahan Ajar dan eLearning

http://www.mercubuana.ac.id

2. Delete angka 20

Karena angka 20 ini juga termasuk leaf, maka angka ini juga bisa segera dihapus.

3. Delete angka 12

Karena angka 12 ini mempunyai 2 anak cabang, maka untuk menggantikan angka 12 yang dihapus dapat menggunakan angka yang ada di sebelah kiri subtree bagian kanan yaitu angka 13.

4. Delete angka 9

Karena angka 9 mempunyai 1 cabang di sebelah kiri, maka angka 11 yang merupakan cabang dari 9 dapat menggantikan angka 9 yang dihapus.

5. Delete angka 15

Karena angka 15 merupakan leaf, maka angka ini dapat segera dihapus.

2015 Pemrograman Algoritma Struktur Data Modul 14

8 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id

Contoh program : #include <vcl.h> #pragma hdrstop #include <iostream> #include <string> #include <conio.h> using namespace std; class SimpulPohon {

public: char data; SimpulPohon* induk; SimpulPohon* kiri; SimpulPohon* kanan;

// Konstruktor SimpulPohon(char karakter);

}; class PohonBiner {

private: SimpulPohon* akar; bool sisip(SimpulPohon* &ortu, SimpulPohon* ptrBaru); SimpulPohon* cari(SimpulPohon* &akar, char data); string inOrder(SimpulPohon* ptrSimpul); string preOrder(SimpulPohon* ptrSimpul); string postOrder(SimpulPohon* ptrSimpul); void hapusSemuaSimpul(SimpulPohon* ptrSimpul);

public: PohonBiner(); ~PohonBiner(); bool sisip(char data); bool cari(char data);

2015 Pemrograman Algoritma Struktur Data Modul 14

9 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

}; // Konstruktor SimpulPohon SimpulPohon::SimpulPohon(char data) {

SimpulPohon::data = data; SimpulPohon::induk = NULL; SimpulPohon::kiri = NULL; SimpulPohon::kanan = NULL;

} // Konstruktor PohonBiner PohonBiner::PohonBiner() {

PohonBiner::akar = NULL; } // Destruktor PohonBiner PohonBiner::~PohonBiner() {

hapusSemuaSimpul(akar); } // sisip (Bersifat privat) // Untuk menyisipkan simpul ke pohon // Nilai balik: true = Berhasil disisipkan // false = Gagal karena data kembar bool PohonBiner::sisip(SimpulPohon* &ortu, SimpulPohon* ptrBaru) {

if (ptrBaru->data == ortu->data) {

delete ptrBaru; // Hapus karena sudah ada return false;

} else

if (ptrBaru->data < ortu->data)

2015 Pemrograman Algoritma Struktur Data Modul 14

10 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

ortu->kiri = ptrBaru; ptrBaru->induk = ortu; return true;

} else

return sisip(ortu->kiri, ptrBaru); else // Berarti lebih dari

if (ortu->kanan == NULL) {

ortu->kanan = ptrBaru; ptrBaru->induk = ortu; return true;

} else

return sisip(ortu->kanan, ptrBaru);

} // sisip (Bersifat publik) // Untuk menyisipkan data ke pohon // Nilai balik: true = Berhasil disisipkan // false = Gagal karena data kembar bool PohonBiner::sisip(char data) {

SimpulPohon* ptrBaru = new SimpulPohon(data); if (akar == NULL) {

akar = ptrBaru; return true;

} else

return sisip(akar, ptrBaru); } // cari (Bersifat privat) // Untuk mencari data data // Nilai balik: true: ketemu

2015 Pemrograman Algoritma Struktur Data Modul 14

11 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id

// false: tidak ketemu // argumen Akar menyatakan akar dari subpohon // untuk pencarian SimpulPohon* PohonBiner::cari(SimpulPohon* &akar, char data) {

if (akar == NULL) return NULL; else if (data == akar->data)

return akar;

else

if (data < akar->data) return cari(akar->kiri, data); else return cari(akar->kanan, data);

} // cari (Bersifat publik) // Menghasilkan : true: kalau data ketemu // false: kalau tidak ketemu bool PohonBiner::cari(char data) {

if (cari(akar, data) == NULL) return false; else return true; } // hapus (Bersifat publik) // Nilai balik: false = Data tidak ketemu // true = Data berhasil dihapus bool PohonBiner::hapus(char data) {

SimpulPohon* simpulDihapus = cari(akar, data); if (simpulDihapus == NULL) {

return true; }

2015 Pemrograman Algoritma Struktur Data Modul 14

12 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

// Simpul yang akan dihapus berkedudukan // sebagai daun (tidak punya anak) if (simpulDihapus == akar)

akar = NULL; else

if (simpulDihapus->induk->kiri == simpulDihapus) // Kalau yang dihapus adalah anak kiri ortunya simpulDihapus->induk->kiri = NULL;

else

// Kalau yang dihapus adalah anak kanan ortunya simpulDihapus->induk->kanan = NULL;

} else {

// Simpul yang akan dihapus memiliki anak di sebelah kiri saja

if (simpulDihapus == akar) {

akar = simpulDihapus->kiri; akar->induk = NULL;

} else {

// Kalau bukan akar if (simpulDihapus->induk->kiri == simpulDihapus)

// Merupakan anak kiri dari ortunya simpulDihapus->induk->kiri = simpulDihapus->kiri; simpulDihapus->kiri->induk = simpulDihapus->induk;

} else {

// Merupakan anak kanan dari ortunya simpulDihapus->induk->kanan = simpulDihapus->kiri;

2015 Pemrograman Algoritma Struktur Data Modul 14

13 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

} else

if (simpulDihapus->kiri == NULL) {

// Simpul yang akan dihapus mempunyai anak di sebelah kanan saja

if (simpulDihapus == akar) {

akar = simpulDihapus->kanan; akar->induk = NULL;

} else // Kalau bukan akar

if (simpulDihapus->induk->kiri == simpulDihapus)

// Simpul dihapus adalah anak kiri ortunya simpulDihapus->induk->kiri = simpulDihapus->kanan; simpulDihapus->kanan->induk = simpulDihapus->induk;

} else {

// Simpul dihapus adalah anak kanan ortunya simpulDihapus->induk->kanan = simpulDihapus->kanan; simpulDihapus->kanan->induk = simpulDihapus->induk;

else {

// Simpul yang dihapus memiliki dua buah subpohon // -- Cari pengganti/suksesor simpul yang akan dihapus SimpulPohon* suksesor = simpulDihapus->kanan; while (suksesor->kiri != NULL)

suksesor = suksesor->kiri;

// -- Putuskan suksesor dari pohon if (suksesor->induk->kiri == suksesor)

2015 Pemrograman Algoritma Struktur Data Modul 14

14 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id

{ // Suksesor sebagai anak kiri dari induknya suksesor->induk->kiri = suksesor->kanan; if (suksesor->kanan != NULL)

suksesor->kanan->induk = suksesor->induk; } else {

// Suksesor sebagai anak kanan dari induknya suksesor->induk->kanan = suksesor->kanan; if (suksesor->kanan != NULL)

suksesor->kanan->induk = suksesor->induk; } // Data pada suksesor disalin ke simpul yang akan dihapus

simpulDihapus->data = suksesor->data; // Ubah simpul yang ditunjuk oleh suksesor ke SimpulDihapus simpulDihapus = suksesor; } delete simpulDihapus; return true;

} // InOrder (bersifat privat) // Menampilkan data secara inorder string PohonBiner::inOrder(SimpulPohon* ptrSimpul) {

string hasil = ""; if (ptrSimpul != NULL) {

if (ptrSimpul->kiri != NULL)

hasil = hasil + inOrder(ptrSimpul->kiri); hasil = hasil + ptrSimpul->data; if (ptrSimpul->kanan != NULL)

hasil = hasil + inOrder(ptrSimpul->kanan); } return hasil;

2015 Pemrograman Algoritma Struktur Data Modul 14

15 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id

// InOrder (bersifat publik) // Menampilkan data secara inorder string PohonBiner::inOrder() {

return inOrder(akar); } // PreOrder (bersifat privat) // Menampilkan data secara preorder string PohonBiner::preOrder(SimpulPohon* ptrSimpul) {

string hasil = ""; if (ptrSimpul != NULL) {

hasil = hasil + ptrSimpul->data; if (ptrSimpul->kiri != NULL)

hasil = hasil + preOrder(ptrSimpul->kiri); if (ptrSimpul->kanan != NULL)

hasil = hasil + preOrder(ptrSimpul->kanan);

} return hasil;

} // PreOrder (bersifat publik) // Menampilkan data secara preorder string PohonBiner::preOrder() {

return preOrder(akar); } // PostOrder (bersifat privat) // Menampilkan data secara postorder string PohonBiner::postOrder(SimpulPohon* ptrSimpul) {

string hasil = ""; if (ptrSimpul != NULL) {

if (ptrSimpul->kiri != NULL) hasil = hasil + postOrder(ptrSimpul->kiri);

2015 Pemrograman Algoritma Struktur Data Modul 14

16 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id http://www.mercubuana.ac.id

} // PostOrder (bersifat publik) // Menampilkan data secara postorder string PohonBiner::postOrder() {

return postOrder(akar); } // HapusSemuaSimpul (Bersifat privat) // Untuk menghapus semua simpul void PohonBiner::hapusSemuaSimpul(SimpulPohon* ptrSimpul) {

if (ptrSimpul != NULL) {

hapusSemuaSimpul(ptrSimpul->kiri); hapusSemuaSimpul(ptrSimpul->kanan);

delete ptrSimpul; } } int main() { PohonBiner pohon; string dataNama = "KEBUNMAIYA"; // Memasukkan karakter-karakter yang ada di dataNama ke Pohon for (unsigned int i = 0; i < dataNama.length(); i++) {

if (pohon.sisip(dataNama[i]) == false)

cout << "Data " << dataNama[i] << " sudah ada" << endl;

else

cout << "Data " << dataNama[i] << " disimpan" << endl;

2015 Pemrograman Algoritma Struktur Data Modul 14

17 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id

} cout << "InOrder: "

<< pohon.inOrder() << endl; cout << "PreOrder: " << pohon.preOrder() << endl; cout << "PostOrder: " << pohon.postOrder() << endl; // Menghapus A, N dan K pohon.hapus('A'); pohon.hapus('N'); pohon.hapus('K'); cout << "Setelah A, N dan K dihapus: " << endl

<< "PreOrder: " << pohon.preOrder() << endl;

getch(); } Hasil eksekusi :

2015 Pemrograman Algoritma Struktur Data Modul 14

18 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2 , Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++ , Informatika, Bandung, 2010. Moh. Sjukani, Algoritma & Struktur Data dengan C, C++ dan JAVA , Mitra Wacana Media,

Bandung, 2004.

2015 Pemrograman Algoritma Struktur Data Modul 14

19 Pusat Bahan Ajar dan eLearning

Tim Dosen

http://www.mercubuana.ac.id