Jawaban Responsi Struktur Data

ehm....
soal responsinya adalah membuat main function dengan pilihan link list atau binary tree...

dari pada banyak bacot... liat ajha ni..
yang binary tree.


#include <cstdlib>
#include <iostream>

using namespace std;


class BinaryTree
{
    private:
           BinaryTree* left;
           BinaryTree* right;
           int data;
           BinaryTree* root;

    public:
        BinaryTree()
        {
           root = NULL;
        }

        bool isEmpty() const { return root==NULL; }
        void inorderr();
        void inorder(BinaryTree*);
        void preorderr();
        void preorder(BinaryTree*);
        void postorderr();
        void postorder(BinaryTree*);
        void insert(int);
        void remove(int);
};

void BinaryTree::insert(int d)
{
    BinaryTree* t = new BinaryTree;
    BinaryTree* parent;
    t->data = d;
    t->left = NULL;
    t->right = NULL;
    parent = NULL;

    if(isEmpty()) root = t;
    else
    {
        BinaryTree* curr;
        curr = root;
        while(curr)
        {
            parent = curr;
            if(t->data > curr->data) curr = curr->right;
            else curr = curr->left;
        }

        if(t->data < parent->data)
           parent->left = t;
        else
           parent->right = t;
    }
}

void BinaryTree::remove(int d)
{
    bool found = false;
    if(isEmpty())
    {
        cout<<"Data kosong ! "<<endl;
        return;
    }

    BinaryTree* curr;
    BinaryTree* parent;
    curr = root;

    while(curr != NULL)
    {
         if(curr->data == d)
         {
            found = true;
            break;
         }
         else
         {
             parent = curr;
             if(d>curr->data) curr = curr->right;
             else curr = curr->left;
         }
    }
    if(!found)
         {
        cout<<" Data not found! "<<endl;
        return;
    }

    if((curr->left == NULL && curr->right != NULL)|| (curr->left != NULL&& curr->right == NULL))
    {
       if(curr->left == NULL && curr->right != NULL)
       {
           if(parent->left == curr)
           {
             parent->left = curr->right;
             delete curr;
           }
           else
           {
             parent->right = curr->right;
             delete curr;
           }
       }
       else
       {
          if(parent->left == curr)
           {
             parent->left = curr->left;
             delete curr;
           }
           else
           {
             parent->right = curr->left;
             delete curr;
           }
       }
     return;
    }
         if( curr->left == NULL && curr->right == NULL)
    {
        if(parent->left == curr) parent->left = NULL;
        else parent->right = NULL;
                  delete curr;
                  return;
    }

    if (curr->left != NULL && curr->right != NULL)
    {
        BinaryTree* chkr;
        chkr = curr->right;
        if((chkr->left == NULL) && (chkr->right == NULL))
        {
            curr = chkr;
            delete chkr;
            curr->right = NULL;
        }
        else
        {

            if((curr->right)->left != NULL)
            {
                BinaryTree* lcurr;
                BinaryTree* lcurrp;
                lcurrp = curr->right;
                lcurr = (curr->right)->left;
                while(lcurr->left != NULL)
                {
                   lcurrp = lcurr;
                   lcurr = lcurr->left;
                }
        curr->data = lcurr->data;
                delete lcurr;
                lcurrp->left = NULL;
           }
           else
           {
               BinaryTree* tmp;
               tmp = curr->right;
               curr->data = tmp->data;
           curr->right = tmp->right;
               delete tmp;
           }

        }
         return;
    }

}

void BinaryTree::inorderr()
{
  inorder(root);
}

void BinaryTree::inorder(BinaryTree* p)
{
    if(p != NULL)
    {
        if(p->left) inorder(p->left);
        cout<<" "<<p->data<<" ";
        if(p->right) inorder(p->right);
    }
    else return;
}

void BinaryTree::preorderr()
{
    preorder(root);
}

void BinaryTree::preorder(BinaryTree* p)
{
    if(p != NULL)
    {
        cout<<" "<<p->data<<" ";
        if(p->left) preorder(p->left);
        if(p->right) preorder(p->right);
    }
    else return;
}

void BinaryTree::postorderr()
{
    postorder(root);
}

void BinaryTree::postorder(BinaryTree* p)
{
    if(p != NULL)
    {
        if(p->left) postorder(p->left);
        if(p->right) postorder(p->right);
        cout<<" "<<p->data<<" ";
    }
    else return;
}



int main(int argc, char *argv[])
{
   
BinaryTree coba ;
           coba.insert(5);
           coba.insert(9);
           coba.insert(12);
           coba.insert(45);
           coba.insert(34);
           coba.insert(89);
           coba.insert(1);
           coba.insert(90);
           coba.insert(7);
           coba.insert(48);
           coba.insert(92);
         
coba.preorderr();
    cout<<"\n\n";
    coba.inorderr();
    cout<<"\n\n";
    coba.postorderr();
    cout<<"\n\n";
   
    coba.remove(34);
    coba.remove(90);
    coba.remove(92);
    coba.remove(5);
   
    coba.preorderr();
    cout<<"\n\n";
    coba.inorderr();
    cout<<"\n\n";
    coba.postorderr();          
   
    system("PAUSE");
    return EXIT_SUCCESS;
}

===================
yang link list
#include <iostream>

using namespace std;
class linklist{
      public:
             linklist();
             void tambah(int);
             void tambahdepan(int);
             void tambahbelakang(int);
             void tampil();
             void hapus(int);
             void sisip(int,int);
      private:
              int data;
              linklist *berikut,*p;

      };

      linklist::linklist(){
      p=NULL;
      }

      void linklist::tambah(int info){
           linklist *q,*t;

           if(p==NULL){
           p=new linklist;
           p->data=info;
           p->berikut=NULL;
                       }else{
           q=p;
           while(q->berikut != NULL)
           q=q->berikut;

           t=new linklist;
           t->data=info;
           t->berikut=NULL;
           q->berikut=t;
                             }
           }

      void linklist::tambahdepan(int nilai){
           linklist *q;

           q = new linklist;
           q->data = nilai;
           q->berikut = p;
           p = q;
           }

      void linklist::tambahbelakang(int nilai){
           linklist *q,*t;

           if( p == NULL )
           {
           p = new linklist;
           p->data = nilai;
           p->berikut = NULL;
           }
           else
           {
           q = p;
           while( q->berikut != NULL )
           q = q->berikut;

           t = new linklist;
           t->data = nilai;
           t->berikut = NULL;
           q->berikut = t;
              }
           }

      void linklist::tampil(){
           linklist *i;
           for(i=p;i!=NULL;i=i->berikut){
           cout<<i->data<<" "<<"-> ";
                                         }cout<<" NULL\n";
           }

      void linklist::hapus(int target){
          linklist *q,*r;
          q=p;
          if(q->data==target){
          p=q->berikut;
          delete q;
          return;
                              }
          r=q;
          while(q!=NULL){
          if(q->data==target){
          r->berikut=q->berikut;
          delete q;
          return;
                              }
          r=q;
          q=q->berikut;
                         }
          cout<<"\nElemen "<<target<<" tidak ada.\n";
          }

          void linklist::sisip(int posisi,int nilai){
               linklist *q,*t;
               int i;
               for(i=1,q=p;i<=posisi-1;i++){
                       q=q->berikut;
                       if(q==NULL){
                       cout<<"\nElemen lebih kecil dari "<<posisi<<"\n ";
                       return;
                                   }
                       }

               t=new linklist;
               t->data=nilai;
               t->berikut=q->berikut;
               q->berikut=t;
               }
               
int main(int argc, char *argv[])
    linklist reza;
    reza.tambah(9);
    reza.tambah(7);
    reza.tambah(2);
    reza.tambah(6);
    reza.tambah(13);
    reza.tambah(19);
    reza.tambah(1);
    reza.tambah(17);
    reza.tambah(15);
    reza.tambah(11);
    reza.tambah(5);
    reza.tambah(31);
    reza.tampil();
    
    //hapus data
    cout << " hapus 13"<<endl;
    reza.hapus(13);
    reza.tampil();
    cout << " hapus 11"<<endl;
    reza.hapus(11);
    reza.tampil();
    cout << " hapus 2"<<endl;
    reza.hapus(2);
    reza.tampil();
    cout << " hapus 19"<<endl;
    reza.hapus(19);
    reza.tampil();
    
    //sisip data
    cout << " sisip data 99 pada posisi ke 5"<<endl;
    reza.sisip(4,99);
    reza.tampil();
    cout << " sisip data 35 pada posisi ke 3"<<endl;
    reza.sisip(2,35);
    reza.tampil();
    cout << " sisip data 73 pada posisi ke 7"<<endl;
    reza.sisip(6,73);
    reza.tampil();
    
    //tambah depan
    cout << " tambah data 23 di depan"<<endl;
    reza.tambahdepan(23);
    reza.tampil();
    
    //tambah belakang
    cout << " tambah data 89 di belakang"<<endl;
    reza.tambahbelakang(89);
    reza.tampil(); 
    

    system("PAUSE");
    return EXIT_SUCCESS;
}

Posting Komentar

0 Komentar