MS-Dos c++ tree-example


 /************************************************************
Bu projede öğrenci listesini saklayacak bir ağaç yapısı
kurulmuştur. Program girdi dosyasından öğrenci numarası,
isim ve soy isim bilgilerini okumuş ve ikili ağaç yapısında tutmuştur.
Programda bu agaç yapısını kaydetmek için dosyaya_yaz fonksiyonu
oluşturulmuştur bu fonksiyon cikti.txt adli bir cikti dosyasi
üretmektedir.
*************************************************************/

Girdi dosyalarına erişim:
data1.txt , data2.txt , data3.txt
 Kullanıcı arayüzü:

ogrenci.h//header file
#define Ogrenci_no_uzunluk 15
#define Ad_soyad_uzunluk 30

struct ogrenci{
    char ogrno[Ogrenci_no_uzunluk];
    char ad[Ad_soyad_uzunluk];
    char soyad[Ad_soyad_uzunluk];
    ogrenci *solPtr;
    ogrenci *sagPtr;
};

typedef struct ogrenci Ogrenci;
typedef Ogrenci *ogrenciPtr;

dugum.h//header file 
#ifndef DUGUM_H
#define DUGUM_H
#include<stdio.h>
#include"ogrenci.h"
struct Agac{
   FILE *okuldefteri;
   ogrenciPtr kok;
   int count;
   bool var_mi(char *);
   int dugumsayisi;
   void olustur();
   void kapat();
   void agacbosalt(ogrenciPtr);
   void dosyadanoku(char *);
   void agackur(char *,char *,char *);
   void inordertara(ogrenciPtr);
   void preordertara(ogrenciPtr);
   void postordertara(ogrenciPtr);
   void ogrenciSil();
   void sil(ogrenciPtr *);
   void ilkgenislikbul();//breath first search
   void ilkderinlikbul();//depth first search
   void dosyaya_yaz();
   void yazma_islemi(ogrenciPtr);
};
#endif

agac_kurulumu.cpp//source code 
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iomanip>
#include<fstream>
#include<stack>
#include<queue>

#include"dugum.h"
using namespace std;

void Agac::olustur(){
    kok = NULL;
    dugumsayisi = 0;
   
}

void Agac::agackur(char *talebeno,char *isim,char *soyisim){
    ogrenciPtr tara,yeni;
    tara = kok;
    int karsilas;
    bool eklenme_durumu = false;
    yeni = new Ogrenci;
    strcpy(yeni->ad,isim);
    strcpy(yeni->soyad,soyisim);
    strcpy(yeni->ogrno,talebeno);
    yeni->sagPtr = NULL;
    yeni->solPtr = NULL;
    if(kok==NULL){
        kok=yeni;
        //ilk düğüm burada eklenir
        dugumsayisi++;
        return;
    }
    while((tara!=NULL) && (!eklenme_durumu)){           
        karsilas = strcmp(yeni->ogrno,tara->ogrno);
        if(karsilas<0){
            if(tara->solPtr != NULL)
                tara=tara->solPtr;
            else{
                tara->solPtr = yeni;
                eklenme_durumu = true;
            }
        }else if(karsilas>0){
            if(tara->sagPtr != NULL)
                tara = tara->sagPtr;
            else{
                tara->sagPtr = yeni;
                eklenme_durumu = true;
            }
        }else
            ;
    }
    if(eklenme_durumu)
        dugumsayisi++;
    //Diğer düğümler yukarıdaki satırlarda eklenir
       
       

}            
void Agac::dosyadanoku(char *dosya){
    struct Kayit{
        char ad[Ad_soyad_uzunluk];
        char soyad[Ad_soyad_uzunluk];
        char ogrno[Ogrenci_no_uzunluk];
    };
    Kayit kayit;
    char four[Ad_soyad_uzunluk];
    char c;
    ifstream oku;
    oku.open(dosya,fstream::out);
    if(oku==NULL){
        cerr << "Hata" << endl;
        return;
    }
    while(!oku.eof()){
        oku >> kayit.ogrno >> kayit.ad >> kayit.soyad;
        if(kayit.ogrno==NULL)
            break;
        oku.get(c);//Bir karakter okur
        c=oku.peek();//Sonraki karakteri okur fakat imlec ilerlemez
        if(c>='A' && c<='Z'){
            oku >> four;
            oku.ignore(1);
            strcat(kayit.ad," ");
            strcat(kayit.ad,kayit.soyad);
            strcpy(kayit.soyad,four);
        }else if(c>='0' && c<='9')
            ;
        else if(c==NULL){
            agackur(kayit.ogrno,kayit.ad,kayit.soyad);
            break;
        }
        agackur(kayit.ogrno,kayit.ad,kayit.soyad);
    }
    oku.close();
}
void Agac::yazma_islemi(ogrenciPtr writing){
    struct Kayit{
        char ad[Ad_soyad_uzunluk];
        char soyad[Ad_soyad_uzunluk];
        char ogrno[Ogrenci_no_uzunluk];
    };
    Kayit kayit;
    if(writing){
        yazma_islemi(writing->solPtr);
        strcpy(kayit.ad,writing->ad);
        strcpy(kayit.soyad,writing->soyad);
        strcpy(kayit.ogrno,writing->ogrno);
        fprintf(okuldefteri,"%s%s%s%s%s%s",kayit.ogrno,"\t",kayit.ad," ",kayit.soyad,"\n");
        yazma_islemi(writing->sagPtr);
    }
   
}
void Agac::dosyaya_yaz(){
    if(!(okuldefteri=fopen("cikti.txt","w+"))){
        cerr << "Dosya acilamadi" << endl;
        return;
    }
    yazma_islemi(kok);
    fclose(okuldefteri);
}
void Agac::inordertara(ogrenciPtr root){
    if(root){
    inordertara(root->solPtr);
    cout << root->ogrno <<" "<<root->ad<<" "<<root->soyad<<endl;
    inordertara(root->sagPtr);
    }
}
void Agac::postordertara(ogrenciPtr root){
    if(root){
    postordertara(root->solPtr);
    postordertara(root->sagPtr);
    cout << root->ogrno <<" "<<root->ad<<" "<<root->soyad<<endl;
    }
}
void Agac::preordertara(ogrenciPtr root){
    if(root){
    cout << root->ogrno <<" "<<root->ad<<" "<<root->soyad<<endl;
    preordertara(root->solPtr);
    preordertara(root->sagPtr);
    }
}
bool Agac::var_mi(char *numara){
    ogrenciPtr tara;
    tara=kok;
    int karsilastir=0;
    while(tara){
        karsilastir=strcmp(numara,tara->ogrno);
        if(karsilastir<0)
            tara=tara->solPtr;
        else if(karsilastir>0)
            tara=tara->sagPtr;
        else {
           
            return true;
        }
    }

        return false;
}
void Agac::ogrenciSil(){
    ogrenciPtr tara,ust;
    tara=kok;
    bool bulundu=false;
    int karsilastir=0;;
    char yon = 'x';
    char ogrenci_no[Ogrenci_no_uzunluk];
    cout << "Lutfen silmek istediginiz ogrenci numarasini giriniz : " << endl;
    cin.ignore(16,'\n');
    cin.getline(ogrenci_no,15);
    if(var_mi(ogrenci_no)==false)
        cout << ogrenci_no << " bu numarada bir ogrenci kayitta bulunmamaktadir."<<endl;
    else{
        while(tara && !bulundu){
            karsilastir=strcmp(ogrenci_no,tara->ogrno);
            if(karsilastir<0){
                ust=tara;
                yon = 'l';
                tara=tara->solPtr;
            }else if(karsilastir>0){
                ust = tara;
                yon = 'r';
                tara=tara->sagPtr;
            }else
                bulundu = true;
        }
        if(bulundu){
            if(yon=='l')
                sil(&ust->solPtr);
            else if(yon=='r')
                sil(&ust->sagPtr);
            else
                sil(&kok);
            cout << " Silindi" << endl;
        }else
            cout << "Hata" << endl;
    }
}
void Agac::sil(ogrenciPtr *sPtr){
    ogrenciPtr silinecek,ekleme;
    silinecek = *sPtr;
    if(silinecek==NULL)
        return;
    else if(silinecek->sagPtr==NULL){
        *sPtr=silinecek->solPtr;
        delete silinecek;
    }
    else if(silinecek->solPtr==NULL){
        *sPtr=silinecek->sagPtr;
        delete silinecek;
    }else{
        ekleme=silinecek->sagPtr;
        if(ekleme->solPtr)
            ekleme=ekleme->solPtr;
        ekleme->solPtr=silinecek->solPtr;
        *sPtr = silinecek->sagPtr;
        delete silinecek;
    }
}
void Agac::ilkderinlikbul(){
    char aranacak[Ogrenci_no_uzunluk];
    cout << "Lutfen aramak istediginiz ogrenci numarasini giriniz : ";
    cin.ignore(16,'\n');
    cin.getline(aranacak,15);
    ogrenciPtr tara;
    bool bulundu = false;
    stack<ogrenciPtr>yigin;
    yigin.push(kok);
    count=0;
    while(!yigin.empty()){
       
        tara = yigin.top();
        yigin.pop();
        if(strcmp(aranacak,tara->ogrno)==0){
            cout << tara->ogrno <<" "<< tara->ad <<" "<< tara->soyad << endl;
            bulundu = true;
            break;
        }
        if(tara->sagPtr!=NULL)
        yigin.push(tara->sagPtr);
        if(tara->solPtr!=NULL)
        yigin.push(tara->solPtr);
        count++;
    }
   
    if(bulundu==false)
        cout << "Aradiginiz numarada bir ogrenci kayitta bulunamadi! " << endl;
}
void Agac::ilkgenislikbul(){
    char aranacak[Ogrenci_no_uzunluk];
    cout << "Lutfen aramak istediginiz ogrenci numarasini giriniz : ";
    cin.ignore(16,'\n');
    cin.getline(aranacak,15);
    bool bulundu = false;
    queue<ogrenciPtr>kuyruk;
    ogrenciPtr tara;
    count=0;
    kuyruk.push(kok);
    while(!kuyruk.empty()){
        tara = kuyruk.front();
        kuyruk.pop();
        if(strcmp(aranacak,tara->ogrno)==0){
        cout << tara->ogrno <<" "<< tara->ad <<" "<< tara->soyad << endl;
        bulundu = true;
        break;
        }
        if(tara->solPtr!=NULL)
            kuyruk.push(tara->solPtr);
        if(tara->sagPtr!=NULL)
            kuyruk.push(tara->sagPtr);
        count++;
    }
   
    if(bulundu==false)
        cout << "Aradiginiz numarada bir ogrenci kayitta bulunamadi! " << endl;
}
void Agac::agacbosalt(ogrenciPtr root){
    if(root){
        if(root->solPtr!=NULL){
            agacbosalt(root->solPtr);
            root->solPtr = NULL;
        }
        if(root->sagPtr!=NULL){
            agacbosalt(root->sagPtr);
            root->sagPtr = NULL;
        }
        delete root;
    }

}
void Agac::kapat(){
    agacbosalt(kok);
    cout <<"\n" <<"agac bosaltildi"<<endl;

agac.cpp/source code
#include<iomanip>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<conio.h>
using namespace std;
#include"dugum.h"
typedef Agac veriyapisi;
veriyapisi agac;
void menu(void);
int main(){
    agac.olustur();
    int secim,secim2;
    char *dosyaadi[3] = {"data1.txt","data2.txt","data3.txt"};
    cout << "Hangi girdi dosyasi uzerinde calismak istiyorsunuz : "<<endl;
    cout << "1 - data1.txt" <<"\n"<<"2 - data2.txt"<<"\n"<<"3 - data3.txt"<<"\n"<<"4 - Cikis"<<endl;
    cout << "Lutfen seciniz : ";
    cin >> secim;
    while(secim!=4){
        switch(secim){
        case 1:
            agac.dosyadanoku(dosyaadi[0]);
            break;
        case 2:
            agac.dosyadanoku(dosyaadi[1]);
            break;
        case 3:
            agac.dosyadanoku(dosyaadi[2]);
            break;
        default :
                cout << "Hatali secim tekrar giriniz : ";
                cin >> secim;
                break;
        }
        if(secim<=3 && secim>0)
            break;
    }
    if(secim==4)
        return EXIT_SUCCESS;
      
    menu();
    cin >> secim2;
   
    while(secim2!=8){
        switch(secim2){
        case 1:
            agac.inordertara(agac.kok);
            cout << "Toplam ogrenci sayisi = "<<agac.dugumsayisi<<endl;
            break;
        case 2:
            agac.preordertara(agac.kok);
            cout << "Toplam ogrenci sayisi = "<<agac.dugumsayisi<<endl;
            break;
        case 3:
            agac.postordertara(agac.kok);
            cout << "Toplam ogrenci sayisi = "<<agac.dugumsayisi<<endl;
            break;
        case 4:
            agac.ogrenciSil();
            break;
        case 5:
            agac.dosyaya_yaz();
            cout<<"cikti.txt dosyasi olusturuldu"<<endl;
            break;
        case 6:
            agac.ilkderinlikbul();
            //cout <<"\n"<< agac.count<<endl;
            break;
        case 7:
            agac.ilkgenislikbul();
            //cout <<"\n"<< agac.count<<endl;
            break;
      
        default :
            cout <<"Hatali bir secim yaptiniz lutfen tekrar giriniz"<<endl;
            menu();
            cin >> secim2;
            break;
        }
        menu();
        cin >> secim2;
   
    }
   
    agac.kapat();
    return EXIT_SUCCESS;
}
void menu(void){
  cout <<"\n"<<endl;
  cout << "1 - Inorder tara ve listele " << endl;
  cout << "2 - Preorder tara ve listele" << endl;
  cout << "3 - Postorder tara ve listele " << endl;
  cout << "4 - Ogrenci sil "<< endl;
  cout << "5 - Dosyaya yaz " << endl;
  cout << "6 - Ilk derinlik ara " << endl;
  cout << "7 - Ilk genislik ara "<< endl;
  cout << "8 - CIKIS"<< endl;
}
 
 


No comments:

Post a Comment