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(simpulkiri); hapus_semua_simpul(simpulkanan);
delete simpul; }
}
//*---* //* Tambah() * //* Nilai Balik = 1 – data sudah ditambahkan * //* 0 – data sudah ada (kembar)* //*---* int PohonBiner::tambah(char data)
{
SimpulPohon *simpul; Simpul = new SimpulPohon; simpulkiri = NULL; simpulkanan = NULL; simpulinduk = NULL; simpuldata = 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 (barudata == orangtuadata) {
delete baru; return(0); }
else
if (barudata < orangtuadata) {
if (!orangtuakiri) {
orangtuakiri = baru; baruinduk = orangtua; }
else
return(tambah(orangtuakiri, baru); }
else {
if (!orangtuakanan) {
orangtuakanan = baru; baruinduk = orangtua; }
else
return(tambah(orangtuakanan, baru); }
return(1); }
{
tampil(akar); cout<< endl; }
void PohonBiner::tampil(SimpulPohon *simpul) {
if (simpul) {
if (simpulkiri) tampil (simpulkiri); cout << simpul data;
if (simpulkanan tampil (simpulkanan); }
}
//*---* //* 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_dihapuskanan)
{
if (!simpul_dihapuskiri) {
// Simpul yang akan dihapus sebagai daun if (!simpul_dihapus == akar)
akar = NULL; else
if (simpul_dihapusindukkiri == simpul_dihapus) simpul_dihapusindukkiri = NULL;
else
simpul_dihapusindukkanan = NULL; }
else {
// Simpul yang akan dihapus mempunyai anak if (simpul_dihapus == akar)
{
akar = simpul_dihapuskiri; akarinduk = NULL; }
else
if (simpul_dihapusindukkiri == simpul_dihapus) {
simpul_dihapusindukkiri = simpul_dihapus kiri; simpul_dihapuskiriinduk = simpul_dihapus induk; }
else {
simpul_dihapusindukkanan = simpul_dihapus kiri; simpul_dihapuskiriinduk = simpul_dihapus induk; }
} } else
{
// Simpul yang akan dihapus
// Mempunyai anak di sebelah kanan saja if (simpul_dihapus == akar)
{
akar = simpul_dihapuskanan; akarinduk = NULL;
} else
if (simpul_dihapusindukkiri == simpul_dihapus) {
simpul_dihapusindukkiri = simpul_dihapus kanan; simpul_dihapuskananinduk = simpul_dihapus induk; }
else {
simpul_dihapusindukkanan = simpul_dihapus kanan; simpul_dihapuskananinduk = simpul_dihapus induk; }
} else {
// Simpul yang dihapus memiliki dua buah sub pohon SimpulPohon *suksesor = simpul_dihapuskanan; // cari suksesor
while (suksesorkiri !- NULL) suksesor = suksesorkiri; // Putuskan suksesor dari pohon
if (suksesorindukkiri == suksesor ) {
suksesorindukkiri = suksesorkanan; suksesorkananinduk = suksesorinduk; }
else {
suksesorindukkanan = suksesorkanan; suksesorkananinduk = suksesorinduk; }
// 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 == simpuldata) return(simpul); else
if (data < simpuldata)
return(cari(simpulkiri, data)); else
return(cari(simpulkanan, 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)