BFS Algoritması C Kodu

Sizlere daha önce sırasıyla;

BFS Algoritması Adım Adım Nasıl Çalışır
Graf Yapısı Nasıl Oluşturulur
BFS Algoritması C kodu nasıl Yazılır

oylesine c kodu, bfs ile alakası yok


konularını anlatmıştık. Bu yazımızda ise size BFS algoritmasını, text dosyasından okuduğu bilgilere uygulayan C kodunu hazır olarak sunuyoruz. Yalnız dikkat edin, kodunuzu kopyaladığınız lokasyonda matrix.txt isimli bir dosyanız olmalı ve içinde 5x5 lik bir matris yapısı oluşturmalısınız. rakamların arasında boşlık olmasına dikkat edin. Yani aşağıdaki matris yapısı gibi olmalı. (siz bu yapıyı kendinize uyarlayabilirsiniz, her düğümün 0, 1, 2, 3, 4 olarak numaralandırıldığı kabul edilir)

1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1

BFS Algoritması Hazır C Kodu



#include <stdio.h>

/* ***********Algoritma Uzmanı********** */
/* ********www.algoritmauzmani.com****** */

/* Aşağıdaki 3 değer düğümün durumu için */
#define hazir 1
#define beklemede 2
#define ziyaretEdilmis 3


int rear = -1, front = -1; // Kuyruğun ön ve arka değerleri
int kuyruk[5]; // Kuyruk elemanlarını tutacak dizi
int durum[5]; // Düğüm durumlarını tutacak dizi
int dizi[5][5]; // Matrisimizi tutacak olan 2 boyutlu dizimiz

// Bu fonksiyona gönderilen dizideki tüm düğümler başlangıçta "hazir" durumuna getirilecek
void hazirEt(int dizi)
{
int i;
    for(i=0; i<5; i++)
        {
            durum[i] = hazir;
        }
}

//klasik kuyruga eleman ekleme fonksiyonu
void kuyruga_ekle(int data)
{
    if(rear == 4)
        printf("kuyruk dolu!");
    else
    {
        if(front == -1)
            front = 0;
        rear = rear + 1;
        kuyruk[rear] = data;
    }
}

//kuyruktan hem eleman siler, hem de silinen degeri kullanıcıya döndürür
int kuyruktan_sil()
{
    int delete_item;
    if(front == -1 || front > rear)
    {
        printf("Kuyruk Bos\n");
        exit(1);
    }

    delete_item = kuyruk[front];
    front = front+1;
    return delete_item;
}

// Kuyruk bossa 1 return eder
int kuyruk_bos_mu()
{
    if(front == -1 || front > rear)
        return 1;
    else
        return 0;
}

// Esas bfs fonksiyonumuz burada, başlangıç düğümü parametre olarak gönderilir
void bfs(int v)
{
    int i;

    kuyruga_ekle(v); // gönderilen düğüm kuyruğa eklenir
    durum[v] = beklemede; // her zaman kuyruğa eklenen düğüm beklemede olarak işaretlenir

    while(!kuyruk_bos_mu()) // döngümüz kuyruk boş olduğu sürece döner
    {
        v = kuyruktan_sil( ); // kuyruktan silinen değer v değişkenine aktarılır
        printf("%d ",v); // kuyruktan silinen eleman ekrana yazdırılır
        durum[v] = ziyaretEdilmis; // kuyruktan silinen eleman her zaman ziyaretEdilmiş olarak işaretlenir

        for(i=0; i<5; i++)
        {
            if(dizi[v][i] == 1 && durum[i] == hazir) // eğer matriste düğümler arası bağlantı varsa "ve" durumu hazırsa alttaki işlemler gerçekleşir
            {
                kuyruga_ekle(i);
                durum[i] = beklemede;
            }
        }
    }
    printf("\n");
}







//kendisine gonderilen dizi parametresiyle matris okuyan c fonksiyonu
void matrisOku(int dizi[5][5])
{

    int i;
  // fp ismindeki dosya tipinde değişken oluşturduk
  // bu değişken, fopen komutuyla belirtilen dosyayı açıyor
  // "r" parametresiyle (read) dosyayı okuma işlemi yapıyor.
  FILE *fp = fopen ("matris.txt", "r");

  // Dosyayı açamazsa hata mesajı gösteriyoruz
  if (fp == NULL) {
    fprintf (stderr, "Dosya acilamadi\n");
    return 255;
  }

  // fscan fonksiyonunun gereği parametre olarak
  // dosya değişkeni adı, satır sayısı ve kaydedilecek yeri belirtiyoruz
  // Matriste sayılar arasında boşlul olduğu için %d ifadeleri arasında
  // Boşluk olmasına dikkat edin
  for (i = 0; fscanf (fp, "%d %d %d %d %d", &dizi[i][0],
                                            &dizi[i][1],
                                            &dizi[i][2],
                                            &dizi[i][3],
                                            &dizi[i][4]) != EOF && i < 5; ++i);

  //Dosyamızı kapatan fonksiyon
  fclose (fp);

}

void algoritmaUzmani();
int main()
{
    int i, j, secim, root;

    matrisOku(dizi);
    hazirEt(durum);

    printf("hangi dugumden baslayacaksiniz? (0-4 arasi 0 ve 4 dahil rakam girin!)... ");
    scanf("%d", &root);
    bfs(root);


    printf("\n ilgili konuya gitmek icin klavyeden 7 rakamına basin\n");
    scanf("%d", &secim);
    if(secim == 7)
        algoritmaUzmani();
    return 0;
}

//sadece ilgili konuya gitmek icin. diger kodlar ile ilgisi yok
void algoritmaUzmani()
{
     system("C:\\Progra~2\\Google\\Chrome\\Application\\chrome.exe http://www.algoritmauzmani.com/2016/10/bfs-algoritmasi-c-kodu-nasil-yazlr.html");
     printf("\n Eger asagida sistem yolu hatasi aliyorsaniz bunu onemsemeyin");
     if(system)
     {
          system("C:\\Progra~1\\Google\\Chrome\\Application\\chrome.exe http://www.algoritmauzmani.com/2016/10/bfs-algoritmasi-c-kodu-nasil-yazlr.html");
          if(system)
            system("C:\\Progra~2\\Mozill~1\\firefox.exe http://www.algoritmauzmani.com/2016/10/bfs-algoritmasi-c-kodu-nasil-yazlr.html");
            if(system)
                system("C:\\Progra~1\\Mozill~1\\firefox.exe http://www.algoritmauzmani.com/2016/10/bfs-algoritmasi-c-kodu-nasil-yazlr.html");
     }
}

Etiketler: , , ,