28
Mar'11

C ile Bağlı Liste,Stack(Yığın) ve Kuyruk Kullanımı (C Programlama Dili)

Merhaba,

Bu yazıda, başlıktan da anlaşılacağı gibi c programlama dilinde bağlı liste,stack ve kuyruk veri modellerine bir açıklık getirmeye çalışacağım.
Bahsettiğimiz veri modellerini kullanarak, karşılaşabileceğiniz birçok problemin üstesinden kolaylıkla gelebilirsiniz.

Bağlı listeleri kullanarak doğru bellek kullanımı, pointer, struct yapıları gibi konularla da içiçe kodlar yazılabilir.

C programlama dilini biliyorum diyen bir programcının mutlaka bağlı listeler(linked list) ile çok rahatlıkla program yazabiliyor olması gerekmekte.

Şimdi bağlı listeler(linked list) konusuna değinmek istiyorum.

BAĞLI LİSTE(Linked List)

Bağlı liste, bellekteki her verinin aynı zamanda sıradaki veriyi işaret eden bir pointer yardımıyla birbirlerine bağlanmasıyla oluşan veriler dizidir.

Programda 10 elemanlı integer bir dizi tanımı yaptığımızda ( int Dizi[10]; ) bellekten ardı ardına gelen  10 tane yer ayırmış oluyoruz.Yani Dizi[0] 100 numaralı bellek adresinde tutulurken dizi[1] 101 numaralı bellek adresinde tutuluyor ve böyle böyle ard arda sıralanmış 10 eleman var.

Peki şimdi bellekte 10 elemanlık boşluğun olduğunu ama ard arda 10 elemanlık bir boşluğun olmadığını varsayalım.Artık 10 elemanlı bir dizi tanımlayamayız.İşte tam bu noktada biz bellekten malloc ile herhangi bir yer isteyip istediğimiz yerleride birbirini işaret edecek şekilde bağlarsak sorunu halletmiş oluruz.Bunun adı da bağlı liste.

Bağlı listeler tek yönlü ve çift yönlü olmak üzere ikiye ayrılır;

Tek Yönlü Bağlı Listeler

Tek yölü bağlı listelerde her verinin işaretçisi, bir sonraki veriyi işaret eder.Son verinin işaretçisine ise NULL atanır.

Resimdeki büyük fontlu rakramlar veri, hemen yanlarındaki 4 basamaklı rakamlar ise bir sonraki veririn adresleridir.

Kodlarken kullanımı:

Bir struct tanımlarız.Örneğin;

struct kayit{
char isim[30];
kayit *sonraki;
};
kayit *ilk, *son;

Burada kayit tipinde tanımlanan sonraki adlı pointer içerisinde her zaman bir sonraki verinin adres bilgisini taşıyacak.

ilk ve son olarak tanımladığımız işaretçiler ise ilk ve son kaydın adres bilgisini tutacaklar.Listeyi bellekte kaybetmemek için ilk ve son kaydın adres bilgisini devamlı bilmeliyiz.

Sonraki kayda ilerleme:

2 elemanlı bir listemizin olduğunu düşünürsek kayıtlarla işlemler şu şekilde yapılır;

ilk->sonraki = son;

son->sonraki = NULL;

İyi anlaşılması gereken nokta ise ilk ve son diye tanımladığımız işaretçilerin bir struct bilgisini barındırdıkları, sonraki adlı işaretçinin ise sadece struct içinde bir eleman pointer olduğudur.

Çift Yönlü Bağlı Listeler

struct kayit{
char isim[30];
kayit *sonraki, *onceki;// buraya dikkat 2 tane işaretçi var.
};
kayit *ilk, *son;

Önceki ve sonraki adlı iki işaretçi sayesinde iki yönlü olarak kayıtlara ulaşabilir veya yönlerin birinde bir kopma olduğunda programımız diğer yönden ilerleyerek verileri kaybetmemiş olur.Tek yölü olup da bir hata sonucu program çalışırken bağ kopsaydı verilerimiz uzay boşluğunda kayboşmuş gibi olacaktı.

STACK(YIĞIN)

Stack veri modelinde ilk giren eleman son çıkar(FILO) mantığı vardır.

Bağlı listemize eleman eklerken sona eklemeli, eleman çıkarırken yine sondaki elemanı çıkarmalıyız.

Stack içine eleman alımına “push”, eleman çekilmesine de” pop” deniliyor.

Örnek olarak bir işlem yazarken kullandığımız parantezleri verebiliriz.İlk açılan parantez son kapanır.Son açılan ise ilk önce kapanır.

Bu şekilde bir işlemdeki parantezlerin sağlamasını yapan programa buradan ulaşabilrisiniz.

KUYRUK

Kuyruk veri yapısında ise ilk giren ilk çıkar(FIFO) mantığı vardır.

Bağlı listeye bir eleman ekleyeceksek sona eklemeli, eleman çıkaracaksak baştan çıkarmalıyız.

Örnek olarak banka kuyruğu verilebilir.İlk sıra fişini alanın işlemi ilk gerçekleştirilir.

——

Bu yazınında sonuna gelmiş bulunuyorum.Umarım faydalı bir yazı olmuştur.

Bağlı liste ile ilgili örnekleri ilerleyen günlerde paylaşmayı düşünüyorum.C Programlama Dili kategorisini takip edin:)

İyi çalışmalar.

  • Ahmet Bahadır Yılmaz

    teşekkürler çok faydalı oldu . kısa ve güzel bi biçimde anlatmıssınız

Yeni makaleleri E-Mail ile takip edin!