• Tidak ada hasil yang ditemukan

SENARAI BERANTAI DAN POHON BINER

Dalam dokumen Pemrograman Berorientasi Objek (Halaman 43-51)

Daftar Buku

SENARAI BERANTAI DAN POHON BINER

Senarai berantai (Linked List) merupakan contoh struktur data sederhana yang menggunakan pemakaian memori secara dinamis. Perhatikan contoh lengkap senarai berantai berikut :

//*---* //* Contoh 9.1 : Senarai berantai * //*---* #include <iostream.h> #include <iomanip.h> #include <string.h> #include <conio.h> struct Simpul { char nama[35]; char telepon[15]; Simpul *lanjutan; }; class Senarai { private : Simpul *pertama;

Simpul *pendahulu; // Digunakan untuk penghapusan Simpul *cari(char *nama);

public:

Senarai(); ~Senarai();

int tambah(char *nama, char *telepon, char *alamat); void tampil();

void tampil(char *nama); int hapus(char *nama); }; void main() { clrscr(); Senarai daftar; daftar.tambah("Amiruddin","675834"); daftar.tambah("Esti Pangestu","685834",); daftar.tambah("Udinsah","675846"); daftar.tambah("Sita Dewi","677734"); daftar.tambah("Gusti Randa","676835"); daftar.tampil(); daftar.tampil("Udin"); daftar.hapus("Udinsah"); daftar.tampil(); } Senarai::Senarai() { pertama = NULL; } Senarai::~Senarai() {

// Hapus seluruh simpul Simpul *simpul_dihapus; while (pertama != NULL) { simpul_dihapus = pertama; pertama = pertama->lanjutan; delete simpul_dihapus; } }

//*---* //* tambah() * //* Menambah data ke senarai * //* Nilai balik : 0 – Data tidak berhasil ditambahkan (heap penuh) * //* 1 – Data berhasil ditambahkan * //*---* int Senarai::tambah(char *nama, char *telepon, char *alamat) {

Simpul *baru; baru = new Simpul; if (baru) { baru->lanjutan = pertama; strcpy(baru->nama, nama); strcpy(baru->telepon, telepon); strcpy(baru->alamat, alamat); pertama = baru; return(1); } else return(0); } //*---* //* tampil() * //* Menampilkan daftar telepon berdasarkan suatu panggilan nama * //* ---* void Senarai::tampil(char *nama)

{

Simpul *ptr_data = pertama; char data_nama[35]; char dicari[35]; strcpy(dicari, nama); strupr(dicari);

cout << setiosflags(ios::left) << setfill('.');

cout << endl << "DAFTAR TELEPON " << dicari << " : " << endl;

while (ptr_data != NULL) {

strcpy(data_nama,ptr_data->nama); strupr(data_nama);

if (strstr(data_nama, dicari))

cout << setw(36) << ptr_data->nama << setw(10) << ptr_data->telepon << ptr_data->alamat << endl; ptr_data = ptr_data->lanjutan; }

cout << resetiosflags(ios::left) << setfill(' '); }

//*---* //* tampil() * //* Menampilkan isi seluruh simpul pada senarai berantai * //*---* void Senarai::tampil()

{

Simpul *ptr_data = pertama;

cout << setiosflags(ios::left) << setfill('.'); cout << endl << "DAFTAR TAMU : " << endl; while (ptr_data != NULL)

{

cout << setw(36) << ptr_data->nama << setw(10) << ptr_data->telepon

ptr_data = ptr_data->lanjutan; }

cout << resetiosflags(ios::left) << setfill(' '); }

//*---*

//* cari() *

//* Nilai Balik : *

//* NULL  Data ketemu *

//* Bukan NULL  Data tak ketemu * //*---*

Simpul *Senarai::cari(char *nama) { Simpul *ptr_data = pertama; pendahulu = NULL; while (ptr_data != NULL) { if (strcmp(nama, ptr_data->nama) == 0) break; pendahulu = ptr_data; ptr_data = ptr_data->lanjutan; } return(ptr_data); } //*---* //* hapus() *

//* Menghapus suatu simpul berdasarkan suatu nama * //* Nilai Balik = 0 – data tidak ada *

//* 1 – simpul berhasil dihapus *

//*---* int Senarai::hapus(char *nama)

{

Simpul *posisi_data; posisi_data = cari(nama); if (posisi_data == NULL) return(0); // Data tak ada else

{

if (pendahulu == NULL) {

// Simpul yang akan dihapus adalah simpul yang pertama pertama = pertama->lanjutan;

} else {

// Bukan simpul yang pertama yang akan dihapus pendahulu->lanjutan = posisi_data->lanjutan; } delete posisi_data; } return(1); }

Hasil eksekusi :

Dalam terminologi struktur data, sebuah pohon (tree) adalah suatu struktur yang terdiri sejumlah simpul dengan karateristik sebagai berikut :

1. Ada sebuah simpul yang berkedudukan sebagai puncak (disebut akar atau root). Semua simpul dapat ditelusuri dari simpul ini.

2. setiap simpul mempunyai lintasan yang unuk terhadap akar. Perhatikan contoh program lengkap tentang pohon biner.

//*---*

//* Contoh 9.2 : Pohon biner * //*---*

#include <iostream.h> #include <string.h> #include <conio.h> // Struktur simpul pohon struct SimpulPohon { SimpulPohon *induk; // Menunjuk ke induk SimpulPohon *kiri; // Menunjuk ke anak kiri SimpulPohon *kanan; // Menunjuk ke anak kanan char data; }; class PohonBiner { private : SimpulPohon *akar; int tambah(SimpulPohon *orang tua, SimpulPohon *baru); SimpulPohon *cari(SimpulPohon *simpul, char data); void hapus_semua_simpul(SimpulPohon *simpul); void tampil(SimpulPohon *simpul); public : PohonBiner(); // Konstruktor ~PohonBiner(); // Destruktor int tambah(char data); void tampil();

DAFTAR TELEPON :

Gusti Randa………676835

Sita Dewi………677734

Udinsah..….………675846

Esti Pangestu………..685834

Amirudin….………675834

DAFTAR TELEPON UDIN :

Udinsah..….………675846

Amirudin….………675834

DAFTAR TELEPON :

Gusti Randa………676835

Sita Dewi………677734

Esti Pangestu………..685834

Amirudin….………675834

int hapus(char data); int cari(char data); };

void main() {

clrscr();

char data[ ] = ‘CARKDUPBENXZS”; PohonBiner pohon;

// Bentuk keadaan awal pohon biner for (int i = 0; i < strlen(data); i ++ ) !pohon.tambah(data[ ]);

cout << “Daftar Perintah : “ << endl;

cout << “+ diikuti karakter  menambah data “ << endl; cout << “- diikuti karakter  menghapus data “ << endl; cout << “? diikuti karakter  mencari data “ << endl; cout << “L  menampilkan pohon biner “ << endl; cout << “S  selesai “ << endl;

char perintah, karakter; do { cout << “Perintah : “; cin >> perintah; switch(perintah) { case ‘+’ : cin >> karakter; pohon.tambah(karakter); break; case ‘-‘ : cin >> karakter; pohon.hapus(karakter); break; case ‘?’ : cin >> karakter; if (pohon.cari(karakter));

cout << karakter << “ada pada pohon” << endl; else

cout << karakter << “tidak ada pada pohon “ << endl; break;

case ‘L’ :

pohon.tampil(); break;

}

cin.ingrone(80, ‘\n’); // Hapus isi penampung }while (perintah != ‘S’);

}

// Definisi fungsi anggota dan konstruktor PohonBiner::PohonBiner() { akar = NULL; } PohonBiner::~PohonBiner() { hapus_sumua_simpul(akar); }

void PohonBiner:: hapus_sumua_simpul(SimpulPohon *simpul) {

if (simpul) {

hapus_semua_simpul(simpulkiri); hapus_semua_simpul(simpulkanan);

delete simpul; }

}

//*---* //* Tambah() * //* Nilai Balik = 1 – data sudah ditambahkan * //* 0 – data sudah ada (kembar)* //*---* int PohonBiner::tambah(char data)

{

SimpulPohon *simpul; Simpul = new SimpulPohon; simpulkiri = NULL; simpulkanan = NULL; simpulinduk = NULL; simpuldata = data; if (akar == NULL) { akar = simpul; return(1); } else return(tambah(akar, simpul); } //*---* //* Tambah() * //* Nilai Balik = 1 – data sudah ditambahkan * //* 0 – data sudah ada (kembar)* //*---*

int PohonBiner::tambah(SimpulPohon *orangtua, SimpulPohon *baru) {

if (barudata == orangtuadata) {

delete baru; return(0); }

else

if (barudata < orangtuadata) {

if (!orangtuakiri) {

orangtuakiri = baru; baruinduk = orangtua; }

else

return(tambah(orangtuakiri, baru); }

else {

if (!orangtuakanan) {

orangtuakanan = baru; baruinduk = orangtua; }

else

return(tambah(orangtuakanan, baru); }

return(1); }

{

tampil(akar); cout<< endl; }

void PohonBiner::tampil(SimpulPohon *simpul) {

if (simpul) {

if (simpulkiri) tampil (simpulkiri); cout << simpul data;

if (simpulkanan tampil (simpulkanan); }

}

//*---* //* Hapus() * //* Nilai Balik = 1 – data tidak ketemu * //* 0 – data berhasil dihapus * //*---* int PohonBiner::hapus(char data)

{

SimpulPohon *simpul_dihapus; Simpul_dihapus = cari(akar, data); if (!simpul_dihapus == NULL)

return(0); //Data dicari tidak ketemu if (!simpul_dihapuskanan)

{

if (!simpul_dihapuskiri) {

// Simpul yang akan dihapus sebagai daun if (!simpul_dihapus == akar)

akar = NULL; else

if (simpul_dihapusindukkiri == simpul_dihapus) simpul_dihapusindukkiri = NULL;

else

simpul_dihapusindukkanan = NULL; }

else {

// Simpul yang akan dihapus mempunyai anak if (simpul_dihapus == akar)

{

akar = simpul_dihapuskiri; akarinduk = NULL; }

else

if (simpul_dihapusindukkiri == simpul_dihapus) {

simpul_dihapusindukkiri = simpul_dihapus kiri; simpul_dihapuskiriinduk = simpul_dihapus induk; }

else {

simpul_dihapusindukkanan = simpul_dihapus kiri; simpul_dihapuskiriinduk = simpul_dihapus induk; }

} } else

{

// Simpul yang akan dihapus

// Mempunyai anak di sebelah kanan saja if (simpul_dihapus == akar)

{

akar = simpul_dihapuskanan; akarinduk = NULL;

} else

if (simpul_dihapusindukkiri == simpul_dihapus) {

simpul_dihapusindukkiri = simpul_dihapus kanan; simpul_dihapuskananinduk = simpul_dihapus induk; }

else {

simpul_dihapusindukkanan = simpul_dihapus kanan; simpul_dihapuskananinduk = simpul_dihapus induk; }

} else {

// Simpul yang dihapus memiliki dua buah sub pohon SimpulPohon *suksesor = simpul_dihapuskanan; // cari suksesor

while (suksesorkiri !- NULL) suksesor = suksesorkiri; // Putuskan suksesor dari pohon

if (suksesorindukkiri == suksesor ) {

suksesorindukkiri = suksesorkanan; suksesorkananinduk = suksesorinduk; }

else {

suksesorindukkanan = suksesorkanan; suksesorkananinduk = suksesorinduk; }

// Data pada suksesor disalin ke simpul yang dihapus simpul_dihapus = suksesor; } delete simpul_dihapus; return(1); } //*---* //* cari() * //* Nilai Balik = NULL – data tidak ketemu * //*---*

SimpulPohon *PohonBiner::cari(SimpulPohon *simpul, char data) {

if (simpul == NULL) return(NULL); else

if (data == simpuldata) return(simpul); else

if (data < simpuldata)

return(cari(simpulkiri, data)); else

return(cari(simpulkanan, data)); }

//*---*

//* cari() *

//* Nilai Balik = 1 – data tidak ketemu *

//* 0 – data ketemu *

//*---* int PohonBiner::cari(char data)

{

if (cari (akar, data) == NULL) return(0); else return(1); } Hasil eksekusi : Tugas Praktikum :

Buat program menggunakan senarai berantai (lihat contoh program 9.1). Ubah program diatas. Dimana data input dimasukkan lewat keyboard. (simpan dengan nama tugoop9.cpp)

Daftar Perintah :

+ diikuti karakter  menambah data

- diikuti karakter  menghapus data

? diikuti karakter  mencari data

L  menampilkan pohon biner

S  selesai

Perintah : L 

ABCDEKNPRSUXZ

Perintah : A 

A ada pada pohon

Perintah : M 

M tidak ada pada pohon

Perintah : L 

ABCDEKMNPRSUXZ

Perintah : -D 

Perintah : L 

Dalam dokumen Pemrograman Berorientasi Objek (Halaman 43-51)

Dokumen terkait