25
Eyl
2024

Veri yapıları ve algoritmalar II dersi kaynak kodlar

25.09.2024

Binary search (ikili arama) algoritması için derste yazdığımız kaynak kod.

#include <iostream>
using namespace std;

int ikiliArama(int dizi[], int sol, int sag, int aranan)
{
    if (sag>=sol)
    {
        int orta = sol + (sag - sol)/2;
        if (dizi[orta]==aranan)
        {
            return orta;
        }
        if (dizi[orta]>aranan)
        {
            return ikiliArama(dizi, sol, orta-1, aranan);
        }
        else
        {
            return ikiliArama(dizi, orta+1, sag, aranan);
        }
    }
    else
    {
        return -1;
    }
}

int main()
{
    int elemansayisi = 10;
    int yeni[elemansayisi] = {2, 3, 6, 8, 12, 50, 60, 72, 88, 99}; 

    cout<<ikiliArama(yeni, 0, elemansayisi, 72);
    
    return 0;
}

02.10.2024

Sıralama algoritmaları

#include<iostream>
using namespace std;
// Kabarcık sıralama *************************************************************************
void bubbleSort(int dizi[], int n) 
{ 
    int i, j; 
    for (i = 0; i < n; i++)     
      for (j = 0; j < n-1; j++) 
    	    if (dizi[j] > dizi[j+1]) 
       	    {
        		int temp = dizi[j];
        		dizi[j] = dizi[j+1];
        		dizi[j+1] = temp;
      }
      
} 

// Yerleştirmeli sıralama *************************************************************************
void insertionSort(int dizi[], int n)
{
  int i, j, anahtar;
  for(i = 1; i<n; i++)
  {
    anahtar = dizi[i];
    j = i-1;
    while(j>=0 && dizi[j]>anahtar)
    {
      dizi[j+1] = dizi[j];
      j = j-1;
    }	
    dizi[j+1] = anahtar;
  }
}

// Seçmeli sıralama *************************************************************************
void selectionSort(int arr[], int n)
{
  int enkucuk, yedek;
    for (int i = 0; i < n-1; i++)
  {
    	enkucuk = i;
    	for (int j = i+1; j < n; j++)
    	{
        	if (arr[j]<arr[enkucuk])
        	{
            	enkucuk = j;
        	}
    	}

    	if (enkucuk != i)
    	{
        	yedek = arr[i];
        	arr[i] = arr[enkucuk];
        	arr[enkucuk] = yedek;
    	}               
  }
}

// Kabuk sıralama *************************************************************************
void shellSort(int dizi[], int n) 
{
  for (int a = n / 2; a > 0; a /= 2) 
  {
  for (int i = a; i < n; i += 1) 
  {
      int temp = dizi[i];
      int j;
      for (j = i; j >= a && dizi[j - a] > temp; j -= a) {
        dizi[j] = dizi[j - a];
      }
      dizi[j] = temp;
    }
  }
}

// Hızlı sıralama *************************************************************************
int bolumlendir (int dizi[], int kucuk, int buyuk)
{
    int pivot = dizi[buyuk]; // pivot
    int i = (kucuk - 1); // Index of smaller element and indicates the right position of pivot found so far
 
    for (int j = kucuk; j <= buyuk - 1; j++)
    {
        // If current element is smaller than the pivot
        if (dizi[j] < pivot)
        {
            i++; // increment index of smaller element
            int temp = dizi[i];
            dizi[i] = dizi[j];
            dizi[j] = temp; 
        }
    }
    int temp = dizi[i+1];
    dizi[i+1] = dizi[buyuk];
    dizi[buyuk] = temp;
    return (i + 1);
}

void quickSort(int dizi[], int kucuk, int buyuk)
{
    if (kucuk < buyuk)
    {
        int pi = bolumlendir(dizi, kucuk, buyuk);
        quickSort(dizi, kucuk, pi - 1);
        quickSort(dizi, pi + 1, buyuk);
    }
}

//*******************************************************************************
main()
{
  int dizi[5] = {10, 6, 8, 11, 2};
  
  bubbleSort(dizi, 5);
  insertionSort(dizi, 5);
  selectionSort(dizi, 5);
  shellSort(dizi,5);
  quickSort(dizi, 0, 4);
  
  for(int i = 0; i<5; i++)
    cout<<dizi[i]<<"  ";
}

23.10.2024

Tek yönlü bağlı liste

 #include<iostream>
using namespace std;

// DÜĞÜM YAPISINI TANIMLAMA**************************************************************************************
struct dugum{
  int ID;
  dugum *sonraki;
};


// BAĞLI LİSTEYE DÜĞÜM EKLEME**************************************************************************************
// Fonksiyon kök ve iterator işaretçilerini alır. Eğer iterator == NULL ise liste boştur. 
// Liste boş değilse yeni düğüm eklenir ve sonrakisi NULL yapılır. İterator son düğümü gösterecek şekilde döndürülür.
dugum *ekle(dugum *kok, dugum *adres, int veri)
{
    if (adres==NULL) // Liste boş. Gelen adres verisi kök adresini gösteriyor
    {
      kok->ID = veri; 
      kok->sonraki = NULL;
      cout<<veri<<" eklendi."<<endl;
      return kok; // Kökün gösterdiği ilk eleman yazıldı. Gösterici artık o elemanı gösteriyor			
    }
    else if(adres->sonraki == NULL)    // Gösterici son elemanda, düğümü sona ekliyoruz ve göstericiyi yeni düğüme işaretliyoruz
    {
      dugum *yeni = new dugum;
      adres->sonraki = yeni;
      yeni->ID = veri;
      yeni->sonraki = NULL;
      cout<<veri<<" eklendi."<<endl;
      return adres->sonraki;
    }
    else // Göstericinin gösterdiği araya eleman ekliyoruz
    {
      dugum *yeni = new dugum;
      yeni->sonraki = adres->sonraki;
      adres->sonraki = yeni;
      yeni->ID = veri;
      cout<<veri<<" eklendi."<<endl;
      return adres->sonraki;
    }
}

// BAĞLI LİSTEDEN DÜĞÜM SİL**************************************************************************************
dugum* sil(dugum* adres ,int veri)
{
  if (adres->ID == veri) // Silinecek düğüm ilk sırada iste silme sonrasında kök adres değişecek
  {
    dugum *temp = adres;
    adres = adres->sonraki;
    delete(temp);
    cout<<veri<<" ilk dugumdeydi ve silindi."<<endl;
    return adres; // Kök adresi değişti.
  }
  else // Listede birden fazla düğüm varsa
  {
    dugum *oncekiDugum = NULL;
    dugum *kok = adres;
    while (adres!= NULL) // Silinecek düğümü bulmak için aramaya başla
    {				
      if (adres->ID == veri) // Düğüm bulundu mu?
      {
        oncekiDugum->sonraki = adres->sonraki;	
        delete(adres);
        cout<<veri<<" silindi."<<endl;
        return kok;
      }
      oncekiDugum = adres;
      adres = adres->sonraki;	
    }
    return kok;
  }	
}

// BAĞLI LİSTEYİ YAZDIR**************************************************************************************
// Kök ve iterator bilgisini parametre olarak alır. İterator boşsa liste boştur.
// Aksi halde iterator->sonraki NULL olana kadar liste yazdırılır. 
void yazdir(dugum *adres)
{
  if (adres==NULL) 
  {
    cout<<"Liste bos"<<endl;
  }
  else
  {
    while(adres!=NULL)
   	{
      cout<<adres->ID<<endl;
      adres = adres->sonraki;
    }
  }	
  
}

// BAĞLI LİSTEDE ARAMA**************************************************************************************
// Kökten başlayarak sona ilerler ve anahtarın kaçıncı sırada olduğunu arar.
// Anahtarı bulursa iteratorü anahtarın bulunduğu düğüme getirir.
dugum *ara(dugum *adres, int veri)
{
  int siraNo = 0;
  while(adres!=NULL)
  {
    siraNo++;
    if (adres->ID == veri)
    {
      cout<<"Aranan veri "<<siraNo<<".dugumde"<<endl;
      return adres;
    }	
    adres = adres->sonraki;
  }
  cout<<"Veri bulunamadi."<<endl;
  return NULL;
}

int main()
{
  // Yeni bağlı liste oluştur
  dugum *kok = new dugum;
  kok->sonraki = NULL;
  
  // İşlem yapacağımız düğüm bilgisi için bir iterator oluşturuyoruz
  // Bu iterator ile bir düğümü işaret edersek o düğümden sonra araya düğüm ekleyebiliriz.
  dugum *gosterici = NULL;
  
  // Örnek düğümler ekle
  gosterici = ekle(kok, gosterici, 10);
  gosterici = ekle(kok, gosterici, 20);
  gosterici = ekle(kok, gosterici, 30);
  gosterici = ekle(kok, gosterici, 40);
  
  // Listeyi yazdır
  yazdir(kok);
  
  // Listede değer ara
  ara(kok, 11);
  ara(kok, 20);
  
  // Listeden düğüm sil
  kok = sil(kok, 10);
  kok = sil(kok, 30);
  // Listeyi yazdır
  yazdir(kok);
  
  gosterici = ekle(kok, gosterici, 50);
  yazdir(kok);	
}

Dairesel bağlı liste

#include<iostream>
using namespace std;

// DÜĞÜM YAPISINI TANIMLAMA**************************************************************************************
struct dugum{
    int ID;
    dugum *sonraki;
};


// BAĞLI LİSTEYE DÜĞÜM EKLEME**************************************************************************************
// Fonksiyon kök ve iterator işaretçilirini alır. Eğer iterator == NULL ise liste boştur.
// Liste boş değilse yeni düğüm eklenir ve sonrakisi NULL yapılır. İterator son düğümü gösterecek şekilde döndürülür.
dugum *ekle(dugum *kok, dugum *adres, int veri)
{
        if (adres==NULL) // Liste boş. Gelen adres verisi kök adresini gösteriyor
        {
            kok->ID = veri;
            kok->sonraki = kok;
            cout<<veri<<" eklendi."<<endl;
            adres = kok;
            return kok; // Kökün gösterdiği ilk eleman yazıldı. Gösterici artık o elemanı gösteriyor
        }
        else // Göstericinin gösterdiği araya eleman ekliyoruz
        {
            dugum *yeni = new dugum;
            yeni->sonraki = adres->sonraki;
            adres->sonraki = yeni;
            yeni->ID = veri;
            cout<<veri<<" eklendi."<<endl;
            return adres->sonraki;
        }
}

// BAĞLI LİSTEDEN DÜĞÜM SİL**************************************************************************************
dugum* sil(dugum* adres ,int veri)
{
    // Listede tek düğüm varsa
    if (adres == adres->sonraki)
    {
        if (adres->ID == veri)
        {
            delete(adres);
            cout<<veri<<" ilk dugumdeydi ve silindi."<<endl;
            return NULL;
        }
        else cout<<"Bulunamadi";
    }
    else // Listede birden fazla düğüm var
    {
        dugum *oncekiDugum = adres;
        dugum *kok = adres;
        adres = adres->sonraki;
        do// Silinecek düğümü bulmak için aramaya başla
        {
            if (adres->ID == veri) // Düğüm bulundu mu?
            {
                oncekiDugum->sonraki = adres->sonraki;
                if (adres!=kok) // kökü gösteren eleman silinmedi
                {
                    delete(adres);
                    return kok;
                }
                else  // Kökü gösteren eleman silindi. Kök bir sağdaki elemana kayacak
                {
                    delete(adres);
                    return oncekiDugum->sonraki;
                }
                cout<<veri<<" silindi."<<endl;
            }
            oncekiDugum = adres;
            adres = adres->sonraki;
        }while (adres!= kok->sonraki);
        return kok;
    }
}

// BAĞLI LİSTEYİ YAZDIR**************************************************************************************
// Kök ve iterator bilgisini parametre olarak alır. İterator boşsa liste boştur.
// Aksi halde iterator->sonraki NULL olana kadar liste yazdırılır.
void yazdir(dugum *adres)
{
    dugum* baslangic = adres; // Listenin başındaki düğümün adresini hafızaya al, o adrese dönene kadar listeyi yazdıracağız
    if (adres==NULL)
    {
        cout<<"Liste bos"<<endl;
    }
    else
    {
        do
         {
            cout<<adres->ID<<endl;
            adres = adres->sonraki;
        }while(adres!=baslangic);
    }
    
}

// BAĞLI LİSTEDE ARAMA**************************************************************************************
// Kökten başlayarak sona ilerler ve anahtarın kaçıncı sırada olduğunu arar.
// Anahtarı bulursa iteratorü anahtarın bulunduğu düğüme getirir.
dugum *ara(dugum *adres, int veri)
{
    int siraNo = 0;
    dugum* baslangic = adres; // Listenin başındaki düğümün adresini hafızaya al, o adrese dönene kadar listeyi yazdıracağız
    do
    {
        siraNo++;
        if (adres->ID == veri)
        {
            cout<<"Aranan veri "<<siraNo<<".dugumde"<<endl;
            return adres;
        }
        adres = adres->sonraki;
    }while((adres!=NULL) && (baslangic!=adres));
    cout<<"Veri bulunamadi."<<endl;
    return NULL;
}

int main()
{
    // Yeni bağlı liste oluştur
    dugum *kok = new dugum;
    kok->sonraki = NULL;
    
    // İşlem yapacağımız düğüm bilgisi için bir iterator oluşturuyoruz
    // Bu iterator ile bir düğümü işaret edersek o düğümden sonra araya düğüm ekleyebiliriz.
    dugum *gosterici = NULL;
    
    // Örnek düğümler ekle
    gosterici = ekle(kok, gosterici, 10);
    gosterici = ekle(kok, gosterici, 20);
    gosterici = ekle(kok, gosterici, 30);
    gosterici = ekle(kok, gosterici, 40);
    
    // Listeyi yazdır
    //yazdir(kok);
    
    // Listede değer ara
    //ara(kok, 20);
    //ara(kok, 20);
    
    // Listeden düğüm sil
    cout<<"silme"<<endl;
    kok = sil(kok, 10);
    kok = sil(kok, 30);

    
    gosterici = ekle(kok, gosterici, 50);
    yazdir(kok);

}

Çift yönlü bağlı liste

#include<iostream>
using namespace std;

// DÜĞÜM YAPISINI TANIMLAMA**************************************************************************************
struct dugum{
  int ID;
  dugum *sonraki;
  dugum *onceki;
};


// BAĞLI LİSTEYE DÜĞÜM EKLEME**************************************************************************************
// Fonksiyon kök ve iterator işaretçilirini alır. Eğer iterator == NULL ise liste boştur. 
// Liste boş deşilse yeni düğüm eklenir ve sonrakisi NULL yapılır. iterator son düğümü gösterecek şekilde döndürülür.
dugum *ekle(dugum *kok, dugum *adres, int veri)
{
    if (adres==NULL) // Liste boş. Gelen adres verisi kök adresini gösteriyor
    {
      kok->ID = veri; 
      kok->sonraki = NULL;
      kok->onceki = kok;
      cout<<veri<<" eklendi."<<endl;
      return kok; // Kökün gösterdiği ilk eleman yazıldı. Gösterici artık o elemanı gösteriyor			
    }
    else if(adres->sonraki == NULL)    // Gösterici son elemanda, düğümü sona ekliyoruz ve göstericiyi yeni düğüme işaretliyoruz
    {
      dugum *yeni = new dugum;
      adres->sonraki = yeni;
      yeni->ID = veri;
      yeni->sonraki = NULL;
      yeni->onceki = adres;
      cout<<veri<<" eklendi."<<endl;
      return adres->sonraki;
    }
    else // Göstericinin gösterdiği araya eleman ekliyoruz
    {
      dugum *yeni = new dugum;
      yeni->sonraki = adres->sonraki;
      yeni->sonraki->onceki = yeni;
      yeni->onceki = adres;
      adres->sonraki = yeni;
      yeni->ID = veri;
      cout<<veri<<" eklendi."<<endl;
      return adres->sonraki;
    }
}

// BAĞLI LİSTEDEN DÜĞÜM SİL**************************************************************************************
dugum* sil(dugum* adres ,int veri)
{
  if (adres->ID == veri) // Silinecek düğüm ilk sırada ise silme sonrasında kök adres değişecek
  {
    if (adres->sonraki==NULL) // Listede tek düğüm var
    {
      delete adres;
      cout<<"liste silindi"<<endl;
      return NULL;
    }
    else  // Listede başka düğümler de var ama ilk düğüm silinecek
    {
      dugum *temp = adres;
      adres = adres->sonraki;
      adres->onceki = adres;
      delete(temp);
      cout<<veri<<" ilk dugumdeydi ve silindi."<<endl;
      return adres; // Kök adresi değişti.
    }		
  }
  else // Listede birden fazla düğüm varsa
  {
    dugum *oncekiDugum = NULL;
    dugum *kok = adres;
    while (adres!= NULL) // Silinecek düğümü bulmak için aramaya başla
    {				
      if (adres->ID == veri) // Düğüm bulundu mu?
      {
        oncekiDugum->sonraki = adres->sonraki;	
        adres->sonraki->onceki = oncekiDugum;
        delete(adres);
        cout<<veri<<" silindi."<<endl;
        return kok;
      }
      oncekiDugum = adres;
      adres = adres->sonraki;	
    }
    return kok;
  }	
}

// BAĞLI LİSTEYİ YAZDIR**************************************************************************************
// Kök ve iterator bilgisini parametre olarak alır. İterator boşsa liste boştur.
// Aksi halde iterator->sonraki NULL olana kadar liste yazdırılır. 
void yazdir(dugum *adres)
{
  if (adres==NULL) 
  {
    cout<<"Liste bos"<<endl;
  }
  else
  {
    while(adres!=NULL)
   	{
      cout<<adres->ID<<endl;
      adres = adres->sonraki;
    }
  }	
  
}

// BAĞLI LİSTEDE ARAMA**************************************************************************************
// Kökten başlayarak sona ilerler ve anahtarın kaçıncı sırada olduğunu arar.
// Anahtarı bulursa iteratorü anahtarın bulunduğu düğüme getirir.
dugum *ileriara(dugum *adres, int veri)
{
  int siraNo = 0;
  while(adres!=NULL)
  {
    siraNo++;
    if (adres->ID == veri)
    {
      cout<<"Aranan veri "<<siraNo<<".dugumde"<<endl;
      return adres;
    }	
    adres = adres->sonraki;
  }
  cout<<"Veri bulunamadi."<<endl;
  return NULL;
}

dugum *geriara(dugum *kok, dugum *son, int veri)
{
  int siraNo = 0;
  dugum *gosterici = son;
  while(gosterici!=kok)
  {
    siraNo++;
    if (gosterici->ID == veri)
    {
      cout<<"Aranan veri "<<siraNo<<".dugumde"<<endl;
      return gosterici;
    }	
    gosterici = gosterici->onceki;
  }
  cout<<"Veri bulunamadi."<<endl;
  return NULL;
}

int main()
{
  // Yeni bağlı liste oluştur
  dugum *kok = new dugum;
  kok->sonraki = NULL;
  
  // İşlem yapacaığımız düğüm bilgisi için bir iterator oluşturuyoruz
  // Bu iterator ile bir düğümü işaret edersek o düğümden sonra araya düğüm ekleyebiliriz.
  dugum *gosterici = NULL;
  
  // Örnek düğümler ekle
  gosterici = ekle(kok, gosterici, 10);
  gosterici = ekle(kok, gosterici, 20);
  gosterici = ekle(kok, gosterici, 30);
  //gosterici = ekle(kok, gosterici, 40);
  
  // Listeyi yazdır
  //yazdir(kok);
  
  // Listede değer ara
  //ileriara(kok, 40);
  //ara(kok, 20);
  
  // Geri arama için önce listenin sonuna git
  /*dugum *son;
  son = kok;
  while(son->sonraki!=NULL) son = son->sonraki;
  geriara(kok, son, 30);
  */
  // Listeden düğüm sil
  kok = sil(kok, 10);
  kok = sil(kok, 20);
  kok = sil(kok, 30);
  
  //kok = sil(kok, 30);
  // Listeyi yazdır
  yazdir(kok);
  
  
  //gosterici = ekle(kok, gosterici, 50);
  //yazdir(kok);	
}

27.11.2024

Yığın

#include<iostream>
#include <locale.h>
using namespace std;

// Yığın veri yapısı
struct stack{
  int boyut;
  int *elemanlar;
  int ust;
};

// Yeni bir yığın oluşturma fonksiyonu
stack* createStack(int boyut)
{
  stack *yigin = new stack;
  yigin->boyut = boyut;
  yigin->ust = -1;
  yigin->elemanlar = new int[boyut];
  return yigin;
}

// Yığın boş mu?
bool isEmpty(stack &yigin)
{
  if (yigin.ust == -1)
    return true;
  else
    return false;
}

//Yığın dolu mu?
bool isFull(stack &yigin)
{
  if (yigin.ust == yigin.boyut-1)
    return true;
  else
    return false;
}

// Yığına eleman ekle
bool push(stack &yigin, int veri)
{
  if (isFull(yigin) == false)
  {
    yigin.elemanlar[++yigin.ust] = veri;
    cout<<yigin.elemanlar[yigin.ust]<<" eklendi. Yeni üst:"<<yigin.ust<<endl;
    return true;
  }
  cout<<"Yığın dolu";
    return false;
}

// Yığından eleman çıkarma
bool pop(stack &yigin) 
{
  if (isEmpty(yigin) == false)
  {
    cout<<yigin.elemanlar[yigin.ust]<<" çıkarıldı"<<endl;	    
    yigin.elemanlar[yigin.ust--] = NULL;
    return true;
  }
  cout<<"Yığın zaten boş"<<endl;
  return false;	
}

// En üst elemanı yazdırma
void peek(stack &yigin)
{
  cout<<"En üst eleman: "<<yigin.elemanlar[yigin.ust]<<", en üst indeks: "<<yigin.ust<<endl;
}

// Tüm yığını ekrana yazdır.
void display(stack  &yigin)
{
  if (isEmpty(yigin) == false)
  {
    for (int i = 0; i<=yigin.ust; i++)
      cout<<yigin.elemanlar[i]<<endl;
  }
  else cout<<"Yığın boş";	
}

main()
{
  setlocale(LC_ALL, "Turkish");
  
  // Başlangıç adresi yigin olan 10 elemanlı bir integer yığını oluşturulsun
  stack *yigin = createStack(10);
  
  // Yığın dolu mu?
  //cout<<isEmpty(*yigin);
  
  // Yığın boş mu?
  //cout<<isFull(*yigin);
  
  // Ekleme
  push(*yigin, 23);
  push(*yigin, 21);
  push(*yigin, 13);
  push(*yigin, 3);
  push(*yigin, 11);
  push(*yigin, 15);
  
  display(*yigin);
  
  pop(*yigin);
  pop(*yigin);
  peek(*yigin);
  pop(*yigin);
  pop(*yigin);
  pop(*yigin);
  pop(*yigin);
  pop(*yigin);
  pop(*yigin);
}

Kuyruk

#include<iostream>
#include <locale.h>
using namespace std;

// kuyruk veri yapısı
struct queue{
  int boyut;
  int *elemanlar;
  int ust;
};

// Yeni bir kuyruk oluşturma fonksiyonu
queue* createqueue(int boyut)
{
  queue *kuyruk = new queue;
  kuyruk->boyut = boyut;
  kuyruk->ust = -1;
  kuyruk->elemanlar = new int[boyut];
  return kuyruk;
}

// kuyruk boş mu?
bool isEmpty(queue &kuyruk)
{
  if (kuyruk.ust == -1)
    return true;
  else
    return false;
}

//kuyruk dolu mu?
bool isFull(queue &kuyruk)
{
  if (kuyruk.ust == kuyruk.boyut-1)
    return true;
  else
    return false;
}

// kuyruğa eleman ekle
bool enqueue(queue &kuyruk, int veri)
{
  if (isFull(kuyruk) == false)
  {
    kuyruk.elemanlar[++kuyruk.ust] = veri;
    cout<<kuyruk.elemanlar[kuyruk.ust]<<" eklendi. Yeni üst:"<<kuyruk.ust<<endl;
    return true;
  }
  cout<<"kuyruk dolu";
    return false;
}

// kuyruktan eleman çıkarma
bool dequeue(queue &kuyruk) 
{
  if (isEmpty(kuyruk) == false)
  {
    cout<<kuyruk.elemanlar[0]<<" çıkarıldı"<<endl;	   
    for(int i=0;i<=kuyruk.ust;i++)
    {
      
      kuyruk.elemanlar[i] = kuyruk.elemanlar[i+1]; 
    }
    kuyruk.ust--;
    
    
    return true;
  }
  cout<<"kuyruk zaten boş"<<endl;
  return false;	
}

// En üst elemanı yazdırma
void peek(queue &kuyruk)
{
  cout<<"En üst eleman: "<<kuyruk.elemanlar[0]<<", en üst indeks: "<<kuyruk.ust<<endl;
}

// Tüm kuyruğu ekrana yazdır.
void display(queue  &kuyruk)
{
  if (isEmpty(kuyruk) == false)
  {
    for (int i = 0; i<=kuyruk.ust; i++)
      cout<<kuyruk.elemanlar[i]<<endl;
  }
  else cout<<"kuyruk boş";	
}

main()
{
  setlocale(LC_ALL, "Turkish");
  
  // Başlangıç adresi kuyruk olan 10 elemanlı bir integer kuyruğu oluşturulsun
  queue *kuyruk = createqueue(10);
  
  // kuyruk dolu mu?
  //cout<<isEmpty(*kuyruk);
  
  // kuyruk boş mu?
  //cout<<isFull(*kuyruk);
  
  // Ekleme
  enqueue(*kuyruk, 23);
  enqueue(*kuyruk, 21);
  enqueue(*kuyruk, 13);
  enqueue(*kuyruk, 3);
  enqueue(*kuyruk, 11);
  enqueue(*kuyruk, 15);
  
  display(*kuyruk);
  
  dequeue(*kuyruk);
  dequeue(*kuyruk);
  peek(*kuyruk);
  dequeue(*kuyruk);
  dequeue(*kuyruk);
  dequeue(*kuyruk);
  dequeue(*kuyruk);
  dequeue(*kuyruk);
  dequeue(*kuyruk);
}

11.12.2024

İkili arama ağacı

#include<iostream>
using namespace std;

// Ağaç düğümü yapısının tanımlanması
struct dugum{
  int ID;
  dugum *sol;
  dugum *sag;	
};

// Yeni düğüm ekleme
dugum *ekle(dugum *kok, int veri)
{
  if (kok == NULL)
  {
    dugum *yeni = new dugum;
    yeni->sag = NULL;
    yeni->sol = NULL;
    yeni->ID = veri;
    return yeni;
  }
  if (veri < kok->ID)
  {
    kok->sol =  ekle(kok->sol, veri);
    return kok;
  }
  else if (veri >= kok->ID)
  {
    kok->sag = ekle(kok->sag, veri);
    return kok;
  }
}

// Ağacı dolaşma (traverse)
void dolas(dugum *kok)
{
  if (kok == NULL) 
    cout<<"bos";//return;
  else
  {
    /* 1. seçenek infix: LNR veya RNL (kök ortada)
    // işlem
    dolas(kok->sol); 
    dolas(kok->sag);*/
    
    /* 2 seçenek prefix: NLR veya NRL (kök başta)
    // işlem
    dolas(kok->sol); 
    dolas(kok->sag);*/
    
    // 3. seçenek postfix: LRN veya RLN (kök sonda)
    dolas(kok->sol); 
    dolas(kok->sag);
    // işlem
  }
}
// Ağacı listeleme
void listele(dugum *kok)
{
  if (kok == NULL) 
  {
    return;
  }
  else
  {
    // 1. seçenek infix: LNR veya RNL (kök ortada)
    listele(kok->sol); 
    cout<<kok->ID<<" ";
    listele(kok->sag);
    
    /* 2 seçenek prefix: NLR veya NRL (kök başta)
    cout<<kok->ID<<" ";
    listele(kok->sol); 
    listele(kok->sag);*/
    
    /* 3. seçenek postfix: LRN veya RLN (kök sonda)
    listele(kok->sol); 
    listele(kok->sag);
    cout<<kok->ID<<" ";*/
  }
}

// Arama
bool ara(dugum *kok, int aranan)
{
  if (kok->ID == aranan)
  {
    return true;
  }
  if (kok == NULL)
  {
    return false;
  }
  if (aranan < kok->ID)
    ara(kok->sol, aranan);
  if (aranan >= kok->ID)
    ara(kok->sag, aranan);
}

// Maksimum değer bulma
int maks(dugum *kok)
{
  while (kok->sag != NULL)
    kok = kok->sag;
  return kok->ID;
}

// Minimum değer bulma
int min(dugum *kok)
{
  while (kok->sol != NULL)
    kok = kok->sol;
  return kok->ID;
}

// Silme işlemi
dugum* sil(dugum *kok, int silinecek)
{
  if (kok == NULL)
    return NULL;
  else if (kok->ID == silinecek)
  {
    if ((kok->sag == NULL) && (kok->sol == NULL)) // Aranan veri bir yapraktaysa, yani sol ve sağ bağlantıları boşsa düğümü sil
    {
      delete(kok);
      return NULL;
    }
    // Eğer arada bir düğüm silinecekse;
    //Ya o düğümün sol altındaki en büyük düğüm silinen düğümün yerine gelir
    // Ya da o düğümün sağ altındaki en küçük düğüm silinen düğümün yerine gelir.
    if (kok->sag!=NULL) // Düğümün sağ bağlantısı doluysa sağdaki en küçük düğümü getir
    {
      kok->ID = min(kok->sag);
      kok->sag = sil(kok->sag, min(kok->sag));
      return kok;
    }
    else if (kok->sol!=NULL) // Sağ bağlantısı boş ve sol bağlantısı doluysa soldaki en büyük düğümü getir
    {
      kok->ID = maks(kok->sol);
      kok->sol = sil(kok->sol, maks(kok->sol));
      return kok;
    }
  }	
  else if (silinecek >= kok->ID) // Silinecek değer düğümden büyük eşitse sağdan devam et
  {
    sil(kok->sag, silinecek);
  }
  else if (silinecek< kok->ID) // Silinecek değer düğümden küçükse soldan devam et
  {
    sil(kok->sol, silinecek);
  }	
}

main()
{
  // Yeni ağaç oluştur	
  dugum *kok = new dugum;
  kok = NULL;
  
  // Ağaca düğümler ekle
  kok = ekle(kok, 23);
  kok = ekle(kok, 12);
  kok = ekle(kok, 9);
  kok = ekle(kok, 33);
  kok = ekle(kok, 41);
  //Ağacı listele
  listele(kok);

  int arananSayi = 41;
  if (ara(kok, arananSayi) == true ) cout<<arananSayi<<" bulundu"<<endl;
  else cout<<arananSayi<<" bulunmadi"<<endl;
    
  cout<<"en buyuk: "<<maks(kok)<<endl;    
  cout<<"en kucuk: "<<min(kok)<<endl;    
  
  sil(kok, 33);
  listele(kok);
}