Veri Yapıları içeriğine geri dön

2016 Güz Final

Soru 3 Kuyruk Bağlı Liste

#include<iostream>
#include<cstdlib> //malloc-free yada new-delete için eklendi
using namespace std;
struct dugum{
    int asalsayi; //asal sayı tutacak
    dugum * next;
};
//Bu sınıf kuyruk  içine asal sayı ekleme, çıkarma ve listeleme yapar.
class KuyrukAsalSayi{
        public:            
                //Listedeki elemanların adreslerini tutacak işaretçiler
                dugum *ilk;
                dugum *son;                
                KuyrukAsalSayi() //Yapıcı Metot
                {
                    ilk=NULL;
                    son=NULL;
                }
                //Eleman Ekleme Fonksiyonu                
                void ekle(int sayi)
                {    
                    //Gelen sayı için düğümü oluşturuyoruz…
                    dugum *d;                 
                    d=(dugum*)malloc(sizeof(dugum)); //ilkdugum için bellekten yer ayrılıyor
                    d->asalsayi=sayi; //fonksiyona gelen veriyi düğüme ekledik                    
                    if(ilk!=NULL)//eğer listede eleman varsa
                    {                        
                        son->next=d;
                        son=d;
                        son->next=NULL;
                    }
                    else //eğer listede hiç eleman yoksa
                    {
                        ilk=d;
                        son=ilk;
                        ilk->next=NULL;
                    }
                }                
                //Bağlı liste elemanları ekranda yazdırılıyor
                void listele()
                {
                    dugum *p;
                    p=ilk;    
                    if (p==NULL) cout<<"Liste bos"<<endl;            
                    while(p!=NULL)
                    {
                        cout<<p->asalsayi<<"\t";//düğümün verisi ekrana yazdırılıyor
                        p= p->next; //bir sonraki düğüme gidiliyor
                    }
                }                

                int  cikart()
                {
                    dugum *p;
                    p=ilk;
                    if(p!=NULL) //liste boş değilse
                    {
                        if(p->next==NULL)//listede sadece bir eleman varsa
                        {
                            ilk=NULL;
                            son=NULL;
                        }
                        else //listede birden fazla eleman varsa
                        {
                            ilk=ilk->next;
                        }                        
                        int s=p->asalsayi; //silinmeden önce değeri alıyorum…
                        free(p);
                        return s;//kullanıcıya silinen değer gönderiliyor
                    }
                    else //liste boşsa
                    {
                        cout<<"Liste Boş"<<endl;
                        return INT_MIN; //integer minumum sınır değeri gönderiliyor…
                    }
                }            
                
                //Listedeki tüm düğümler siliniyor
                void temizle()
                {
                    dugum *p;
                    while(ilk!=NULL)
                    {
                        p=ilk; //ilk düğümün referans ettiği düğüm alınıyor
                        ilk=p->next; //ilk sonraki düğüme referans ediyor
                        free(p); //p düğümü siliniyor…                        
                    }                    
                    son=NULL;//sonu gösteren düğümde NULL yapılıyor                
                }
};

int main()
{
    KuyrukAsalSayi kuyruk;
    //veri ekleme işlemleri
    kuyruk.ekle(2);
    kuyruk.ekle(3);
    kuyruk.ekle(5);
    kuyruk.ekle(7);
    kuyruk.listele();
    //veri alma işlemleri
    int silinen=kuyruk.cikart();
    cout<<endl<<"Silinen Deger:"<<silinen<<endl;
    kuyruk.listele();
    
    //liste siliniyor
    kuyruk.temizle();
    cout<<endl<<"Asal sayı liste son durum:"<<endl;
    kuyruk.listele();        
    return 0;
    

}
2016 Güz Final 3. ve 4. Soru Çözüm Kodları

Soru 4 İkili Ağaç

#include <iostream>
#include <stdlib.h> //new and delete için
#include <stdio.h>
using namespace std;
//Her düğüm içinde  ürün bilgileri tutulsun…
struct dugumAgac
{    
    int barkod;
    string urunAdi;
    int urunAdedi;
    int urunFiyati;
    dugumAgac *sol,*sag;
};

class IkiliAgac
{
    public:
           dugumAgac *kok; //kökü tutacak
           IkiliAgac()//Yapıcı metot
           {
                 kok=NULL; //ilk atamayı yaptık, yani kök eleman eklenene kadar NULL olacak
           }           
           void ekle(dugumAgac *agacKok, dugumAgac *yeni)
           {
                   //Öncelikle kökün boş olup olmadığı kontrol ediliyor…
                   if(agacKok==NULL) //kök boş ise
                   {
                    kok=yeni; //yeni gelen düğümü ekledik                                            
                }
                else
                {
                    //yeni gelen ürünün barkod numarasına bakarak küçükse sola
                    //değilse sağ tarafa atama yapacağız…
                    if(yeni->barkod<=agacKok->barkod) //değer küçükse sola düğüm ekliyoruz
                    {
                        if(agacKok->sol==NULL) //solda hiç eleman yoksa
                            agacKok->sol=yeni;
                        else
                            ekle(agacKok->sol,yeni); //rekürsif olarak fonksiyon tekrar çağrılıyor ve sola eleman ekleniyor                            
                    }
                    else //sag tarafa eleman ekliyoruz…
                    {
                        if(agacKok->sag==NULL) //solda hiç eleman yoksa
                            agacKok->sag=yeni;
                        else
                            ekle(agacKok->sag,yeni);                         
                    }                    
                }
           }
           
           //Ağaçta listeleme yapıyoruz…
           void listele(dugumAgac *agacKok)
           {
                   // Ortada kök sıralaması
                if(agacKok!=NULL)                  
                {            
                    listele(agacKok->sol);
                    cout<<endl<<"—-Urun Bilgileri—"<<endl;
                       cout<<"Barkod:"<<agacKok->barkod<<endl;
                       cout<<"Urun Adi:"<<agacKok->urunAdi<<endl;
                       cout<<"Urun Fiyati:"<<agacKok->urunFiyati<<" TL"<<endl;
                       cout<<"Urun Adedi:"<<agacKok->urunAdedi<<endl;
                       listele(agacKok->sag);
                }
           }
           
           void agacYaz(dugumAgac *agac) //Yalnız tek bir düğümü yazdıracak
           {
                    if(agac!=NULL)
                    {
                    cout<<endl<<"—-Urun Bilgileri—"<<endl;
                       cout<<"Barkod:"<<agac->barkod<<endl;
                       cout<<"Urun Adi"<<agac->urunAdi<<endl;
                       cout<<"Urun Fiyati"<<agac->urunFiyati<<endl;
                       cout<<"Final:"<<agac->urunAdedi<<endl;    
                   }
                   else
                       cout<<endl<<"Ağaç boş"<<endl;
                       
           }
           
         dugumAgac * degerGir()
         {
              dugumAgac * yeni;
              yeni=new dugumAgac; //yeni düğümü oluşturduk, bellekten yer tahsis ediyoruz…
            cout<<endl;      
            cout<<"Urun Adı:"; getline(cin,yeni->urunAdi);
            cout<<endl;
            cout<<"Barkod giriniz:"; cin>>yeni->barkod;
            cout<<"Fiyati giriniz:"; cin>>yeni->urunFiyati;
            cout<<"Adedi giriniz:"; cin>>yeni->urunAdedi;    
            cin.ignore(1,'\n'); //—Okuma yaparken oluşan satır atlama sorunu için eklendi, solved by Emel Akkuyu—    
            yeni->sol=NULL;
            yeni->sag=NULL;            
            return yeni;
         }
        
        //Döngüsel Arama Algoritması, numaraya göre arama yapıyoruz
        dugumAgac *araDongusel(dugumAgac *agac, int aranan)
        {
             while(agac!=NULL&&agac->barkod!=aranan)
               {            
               if(aranan<agac->barkod)    
               {
                    agac=agac->sol;                   
               }
               else
                       agac=agac->sag;                   
            }
            return agac;
        }
        //Rekursif Arama Algoritması, barkoda göre arama yapıyoruz
        dugumAgac *araRekursif(dugumAgac *agac, int aranan)
        {
             if(agac==NULL) return NULL; //agaç boş ise dön
            if(aranan==agac->barkod) //aranan kök düğümde ise     
            {
                agacYaz(agac);     //elemanlarını direk yazdır                   
            }
            if(aranan<agac->barkod) //aranan soldaki düğümde ise
            {
                   araRekursif(agac->sol,aranan);
            }
            else  //aranan sağdaki düğümde ise
            {
                   araRekursif(agac->sag,aranan);               
            }
        }
        
        // Ürün artırma ve azaltma- Ben tek fonksiyon ile tasarladım ama ayrı iki fonksiyon tasarlanabilir
        void UrunGuncelleme(dugumAgac *agac, int arananBarkod, bool kontrol)
        {
            // arama işlemini iki farklı fonksiyon ile yapabiliriz.
            dugumAgac * arananDeger;
            arananDeger=araDongusel(agac,arananBarkod);
            //agac=araRekursif(agac,arananBarkod);
            if(arananDeger==NULL)
            {        
                cout<<"…Ürün bulunamadı…"<<endl;
            }
            else
            {
                if(kontrol==true) // Ürün miktarı artırılacak
                {
                    agac->urunAdedi++;
                }
                else // Ürün miktarı azaltılacak
                {
                    agac->urunAdedi–;
                }
            }
                
        }    
                
};

int main()
{
    IkiliAgac agac; //Sınıfın nesnesini oluşturduk
    // Verileri agaca eklemeden önce düğümü oluşturalım.

    dugumAgac * yeni;        
    yeni=agac.degerGir(); // Eleman değerleri giriliyor
    agac.ekle(agac.kok,yeni);// Ağacın kök adresi ve yeni eleman gönderiliyor

            
    // Listeleme yapıyoruz
    agac.listele(agac.kok);
    
    //  …..Ürün Ekleme İşlemleri önce barkoduve gelen miktarı alıyoruz ….
    int arananBarkod=12;
        
    // Ürün artırma;
    bool kontrol=true;
    agac.UrunGuncelleme(agac.kok,arananBarkod,kontrol);    
    
    //Ürün azaltma;
    //kontrol=false;
    //agac.UrunGuncelleme(agac.kok,arananBarkod,kontrol);
    
    // Listeleme yapıyoruz
    agac.listele(agac.kok);


    
    return 0;
}