ELN1002 – BİLGİSAYAR PROGRAMLAMA 2 VERİ YAPILARI Sunu Planı Kendini-gösteren Yapılar Dinamik Bellek Tahsisi Bağlı Listeler Yığınlar Kuyruklar Ağaçlar 1 Veri Yapıları Şu ana kadar, diziler, matrisler ve yapılar gibi, sabit büyüklükteki veri yapıları üzerinde duruldu Bu bölümde, çalışma zamanında daralıp genişleyen dinamik veri yapıları üzerinde durulacaktır. Bağlı liste: Tek bir çizgiye bağlanan elemanların listesi. Ekleme ve silinme listenin herhangi bir noktasından Yığın: Derleyici ve işletim sistemleri için önemli bir yapı. Ekleme ve silinme sondan. Kuyruk: Bekleme kuyrukları. Ekleme sondan, silinme baştan. Ağaç: Verilerin yüksek hızda aranması ve dizilmesi için. Kendini-gösteren Yapılar Kendini-gösteren yapılar, kendi tipinde bir işaretçi üyeye sahip yapıalrdır. struct node { int data; struct node *nextPtr; } nextPtr üyesi, „link-bağ‟ olarak da adlandırılır. Bir yapı tipindeki değişkene aynı yapı tipinde bir değişkeni bağlamak için kullanılır. Kendini gösteren yapılar, listeler, kuyruklar, yığınlar ve ağaçlar gibi veri yapılarının oluşturulmasında kullanılırlar. Kendi tipindeki son işaretçiye NULL atanarak kendini işaret etme işlemi sonlandırılabilir. 2 Dinamik Bellek Tahsisi Dinamik veri yapılarının oluşturulması ve kullanımı dinamik bellek tahsisini gerektirir. Dinamik bellek tahsisinin sınırı, teorik olarak donanımın sahip olduğu fiziksel bellek kadar veya sanal bellek sisteminde mevcut sanal bellek miktarı kadar olabilir. Fakat uygulamada durum böyle değildir, çünkü bilgisayarda eşzamanlı olarak çalışan pek çok program mevcuttur. malloc, free ve sizeof() bu aşamada kullanılacak olan en temel dinamik bellek tahsisi komutlarıdır. 3 Bağlı Listeler Bir bağlı liste, “düğüm” olarak adlandırılan, kendini-gösteren yapıların, işaretçilerle bağlanan – dolayısıyla bağlı adının alan – doğrusal bir birikimidir. Bağlı listeye, listenin ilk düğümünü gösteren bir işaretçiyle erişilebilir. Takip eden düğümlere ise: Her düğümde bulunan, bağ işaretçisi üyesiyle erişilebilir. Listenin son elemanında bulunan bağ işaretçisi, listenin sonunun geldiğini belirtmek üzere, NULL adres değerine atanır. Böylece yeni bir düğüm işaret edemez. Veri bağlı listelerde veri dinamik olarak tutulur – her düğüm yalnızca ihtiyaç duyulduğu zaman oluşturulur. Bir düğüm, diğer yapılar da dahil olmak üzere herhangi bir tipte değişkeni içerebilir. Bağlı Listeler Veri listeleri dizilerde de tutulabilir, fakat bağlı listeler birkaç avantaj getirmektedirler. Bir bağlı liste, veri yapısı içerisindeki veri elemanlarının sayısı tahmin edilmez olduğunda uygundur. Bağlı listeler dinamiktir, dolayısıyla listenin uzunluğu gerektikçe azaltılır veya çoğaltılır. Bir dizinin uzunluğu, bununla birlikte, bir kere hafıza tahsisi yapıldıktan sonra değiştirilemez. Bağlı listeler, bellekte kesintisiz şekilde depolanmazlar. Fakat, mantıksal olarak düşünüldüğünde, bağlı listenin düğümleri kesintisizmiş gibi görünür. Başlangıç 17 29 93 4 5 Karakterler alfabetik sırada diziliyorlar. 6 Bir listeye sıralı şekilde düğüm ekleme *sPtr oncekiPtr gecerliPtr yeniPtr *sPtr oncekiPtr gecerliPtr yeniPtr 7 Listeden düğüm silme *sPtr *sPtr oncekiPtr oncekiPtr gecerliPtr gecerliPtr geciciPtr Yığınlar Yığın, bağlı listenin kısıtlı bir versiyonudur. Yeni düğümlerin eklenmesi veya düğüm silinmesi yalnızca yığının tepesinden gerçekleştirilebilir. Bu sebepten dolayı yığın, son giren ilk çıkar (LIFO – Last In First Out) prensibiyle çalışmaktadır. Yığına, yığının tepesini gösteren bir işaretçiyle erişilebilir. Yığının en son düğümünde bulunan bağ işaretçisi, yığının dibini göstermek üzere, NULL adres değerine eşitlenir. Yığınlar ve bağlı listeler, özdeş şekillerde gösterilirler. Bağlı listeyle yığın arasındaki fark, bağlı listelerde veri ekleme ve silme herhangi bir noktadan yapılabilir, fakat yığında bu işlem en tepede gerçekleştirilir. 8 Yığınlar Yığın işlemlerinde kullanılan temel fonksiyonlar push ve pop fonksiyonlarıdır. Push fonksiyonu yeni bir düğüm oluşturur ve yığının en tepesine yerleştirir. Pop fonksiyonu, düğümün en tepesindeki düğümü siler, ona ayrılmış belleği boşaltır ve o düğümdeki değerleri döndürür. stackPtr 8 2 3 9 10 11 Push işlemi *tepePtr *yeniPtr *tepePtr *yeniPtr 12 Pop işlemi *tepePtr *tepePtr *geciciPtr Kuyruklar Başka bir yaygın veri yapısı ise kuyruklardır. Kuyruğa düğüm eklemek ancak kuyruğun sonundan, kuyruktan düğüm silmek ise kuyruğun başından gerçekleştirilir. Bu sebepten, kuyruk ilk giren ilk çıkar (FIFO – First In First Out) prensibiyle çalışmaktadır. Düğüm ekleme operasyonuna – enqueue Düğüm silme operasyonuna ise – dequeque adı verilmektdir. Başlangıç 17 Son 29 93 13 14 15 16 Kuyruğa ekleme *basPtr *basPtr *sonPtr *sonPtr *yeniPtr *yeniPtr Kuyrukta Silme *basPtr *basPtr *sonPtr *sonPtr *geciciPtr 17 Ağaçlar Bağlı listeler, yığın ve kuyruklar doğrusal veri yapılarıdır. Ağaçlar ise, özel yeteneklere sahip, doğrusal olmayan iki- boyutlu veri yapılarıdır. Ağaç düğümleri, iki veya daha fazla bağ içerir. Bu bölümde, binary ağaçlar üzerinde durulacaktır, yani düğümlerinin tümünde iki bağlantı olan ağaçlar (düğümleri bir veya ikisi NULL olabilir veya hiçbirisi NULL olmayabilir.) “Kök düğümü”, ağacın ilk düğümüdür. Kök düğümünün her bir bağlantısı “alt (child)” olarak adlandırılır. Sol alt düğüm, sol alt ağacın ilk düğümüdür ve sağ alt düğüm, sağ alt ağacın ilk düğümüdür. Bir düğümün altları, “kardeş” düğümler olarak adlandırılır. Altı olmayan düğüme ise “yaprak düğümü” adı verilir. 18 19 20 Binary Arama Ağacı Binary Arama Ağacı Sol alt ağaç içerisindeki değerler ailenin diğer elemanına göre daha küçüktür. Sağ alt ağaç içerisindeki değerler ailenin diğer elemanına göre daha büyüktür. Hızlı tarama imkanı sağlar. 21