Sıralı Bağlı Liste (Öncelik Kuyruğu)

Yazar : zafer 24. Ağustos 2009 21:57

Bağlı listelere elemanları baştan veya sondan ekleyebilirsiniz. Bu sizin tasarladığınız liste ile ilgilidir. Ancak bu listede aramak yapmak veya listeyi sıralamak istediğiniz zaman işler biraz karışır çünkü bağlı listelerde doğrusal hareket edersiniz. Bundan dolayı her defasında bağlı listenin bir sonraki düğümüne ilerlersiniz.

Böyle bir duruma ilk baştan bir çözüm bulmak isterseniz imdadınıza Öncelik Kuyruğu (Priority queue) adı verilen teknik yetişir. Bu teknikte amaç, listeye elemanları eklerken listenin sıralı düzenini bozmadan bu eklemeyi yapmaktır. Böylece listeye tüm elemanları eklediğinizde elinizde sıralı bir liste olacaktır. Bununla ilgili örnek bir uygulamaya ait kodları aşağıya ekliyorum. Bu kodda rastgele 0-100 arasında oluşturulan 25 sayı bir bağlı listeye sıralı bir şekilde ekleniyor ve sonra bu sıralı liste ekrana yazdırılıyor. Sorularınız olursa yardımcı olmaya çalışırım. Tüm okuyucularıma sağlık ve mutluluk dilerim.

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct yiginDugumu {
    int                 data;
    struct yiginDugumu* sonraki;
};

void ListeyeEkle(struct yiginDugumu** ilkDugum, int data);

int main()
{
    struct yiginDugumu* basDugum = NULL;
    struct yiginDugumu* say;
    int i;

    srand(time(NULL));

    for (i=0; i<25; i++){
        ListeyeEkle(&basDugum, rand() % 99 +1);
    }

    for (i=0, say=basDugum; say != NULL; i++, say = say->sonraki) {
        printf("%d-> %d\n", i, say->data);
    }

    return 0;
}

void ListeyeEkle(struct yiginDugumu** ilkDugum, int data)
{
    struct yiginDugumu* gecerliDugum = *ilkDugum;
    struct yiginDugumu* yeniDugum;
    struct yiginDugumu* oncekiDugum = NULL;

    yeniDugum = malloc(sizeof(struct yiginDugumu));
    yeniDugum->data = data;
    yeniDugum->sonraki = NULL;

    while (gecerliDugum != NULL && gecerliDugum->data < data) {
        oncekiDugum = gecerliDugum;
        gecerliDugum = gecerliDugum->sonraki;
    }

    if (oncekiDugum == NULL) {
        *ilkDugum = yeniDugum;
    }
    else {
        oncekiDugum->sonraki = yeniDugum;
    }

    yeniDugum->sonraki = gecerliDugum;
}

 

Tags: , , ,

C Notları

Yorum ekle




  Country flag
biuquote
  • Yorum
  • Canlı önizleme
Loading


Zafer Günlükleri © 2008 - 2012 Zafer'in kişisel paylaşım sitesi.
BlogEngine.NET 2.0.0.36 | Tema : Mads Kristensen | Düzenleyen : Zafer Çelenk
Oturum Aç | APML ile filtrele

Anket

D dilini duydunuz mu?




Sonuçlar

Projeler

Galeri

Takvim

<<  Mayıs 2012  >>
PaSaÇaPeCuCuPa
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

Yazıları takvimde göster

Satranç

I play chess at Chess.com!

Son Yorumlar

Comment RSS

Yasal Uyarı

Bu site görüşlerin paylaşıldığı kişisel bir blogdur. Site içeriğinden meydana gelebilecek sorunlardan site sahibi sorumlu değildir. Yorumlar site sahibi tarafından onaylandıktan sonra yayınlanacaktır.