Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Arden Agopyan
Arden Agopyan
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
2 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: bellek dobject ekleyerek eleman elemani kullanmadan listeler listenin public public void sinifi sinifimizi sonraki suankidugum yapici C# / VC#/.NET Arden Agopyan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 11.3.2005
Okunma Sayısı : 39851
Yorum Sayısı : 4     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 29.3.2024
Turhal Temizer
Mac OS/X Removing CUDA 29.3.2024
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 29.3.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 29.3.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
C# ile Göstericisiz Bağlı Liste Kullanımı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Bu yazımızda bağlı liste (linked list) yapılarını ve bu yapıları C# dilinde gösterici (pointer) kullanmadan oluşturmanın yolunu inceleyeceğiz.

Bağlı listeler (Linked lists)

Bağlı listeler dinamik veri yapılarıdır. Bellek üzerinde tanımlanan elemanlar göstericiler yardımıyla birbirlerine bağlanarak bağlı liste yapısı oluşturulur.  Listeye istenirse dizilerde olduğu gibi eleman ekleme ve silme işlemleri uygulanabilir. Bağlı liste kullanımının dizi kullanımından farkı programcının, başta kaç adet elemanla işlem yapılacağını bilmek zorunda olmamasıdır. Listenin boyutu dizilerde olduğu gibi önceden belirlenmez ve dinamik olarak yaratılır. Kaç adet elemanla çalışacağımızı bilmediğimiz durumlarda bağlı liste kullanmak bize büyük avantajlar sağlar çünkü sadece birkaç elemanın kullanılacağı bir diziyi, ne kadarlık bir bellek alanı ayıracağımızı bilmeden -örneğin 1000 elemanı barındıracak şekilde- yaratmak bize bellek kullanım miktarı açısından büyük çaplı bir kayba mal olacaktır.

Değişik kullanım amaçlarına göre tasarlanmış birçok çeşit bağlı liste türü vardır. (Tek/çift yönlü – doğrusal/dairesel bağlı listeler). Bu türler hakkında detaylı bilgiye: http://www.csharpnedir.com/makalegoster.asp?MId=349 adresinden erişebilirsiniz.

Bu yapıların C dilindeki tasarımına kısaca değinirsek; bu dilde programlama yapmış olanların çok iyi bildiği gibi birçok alanda programcıya çeşitli kolaylıklar sağlayan ve çoğu durumda kullanımı zorunlu olan bağlı listeler yaratılırken, yapı (struct) içerisinde öncelikle elemanlar arasındaki bağlantı bilgisi (elemanın kendisinden önceki ve sonraki elemanların yerleri) göstericilere bellek adresleri atanarak belirlenir, daha sonra elemana ait bilginin tutulacağı bir değişken tanımlanır, ayrıca listenin türüne göre ilk ve son elemanları gösteren göstericiler tanımlanarak liste belirlenirdi. Listenin başına yeni bir eleman eklenmediği sürece, ilk elemanı gösteren gösterici değişmezdi. Son olarak bağlı liste yaratıldıktan sonra en sondaki elemanı belirtmek için, sonraki elemanı gösteren göstericiye NULL değeri atanırdı. Böylece bellek üzerindeki veriler (elemanlar) birbirlerine bağlanmış olurdu.

Biz yazımızda C# dilini kullanarak göstericileri kullanmadan sınıflar yardımıyla çift yönlü bir bağlı liste yapısı tasarlayacağız. C# sınıf kütüphanelerindeki ArrayList sınıfı bağlı listelerin yerine geçen bir sınıf olmasına rağmen, biz yinede bu yapıyı nasıl kuracağımızı görelim.

Kodlama

Bir Class Library projesi açmakla işe başlayabiliriz. Projemize Dugum.cs dosyasını ekleyerek Dugum sınıfımızı yaratalım.

public class Dugum
{
      protected object dObject;
      protected Dugum nOnceki;
      protected Dugum nSonraki;
     
      public object Deger    
      {
           get  {     return dObject;   }
           set  {     dObject = Deger;}
      }

      public Dugum Onceki  
      {          
           get  {     return nOnceki;   }   
           set  {     nOnceki = value;}
      }

      public Dugum Sonraki   
      {    
          get  {     return nSonraki;}   
          set  {     nSonraki = value;}  
      }  

      // Yapıcı metot
      public Dugum(Dugum oncekiDugum, Dugum sonrakiDugum, object dugumObj)  
      {          
          nOnceki = oncekiDugum;      
          nSonraki= sonrakiDugum;     
          dObject = dugumObj;    
      }
}

Görüldüğü gibi nOnceki ve nSonraki değişkenlerini Dugum olarak, dObject değişkenini ise object olarak, tüm bu değişkenleri de protected olarak tanımladık ve bu değişkenlere sınıfımızda kullanacağımız isimleriyle (Deger,Onceki,Sonraki) açtığımız get-set bloklarıyla eriştik. Son olarak Dugum sınıfı için gereken yapıcı metodu ve parametrelerini belirleyerek sınıfımızı tamamladık.Şimdi sıra geldi asıl bağlı liste sınıfımızı tasarlamaya. Bunun için projemize bagliListe.cs dosyasını ekleyerek sınıfımızı yaratalım.

public class bagliListe
{
            int dugumSayisi = 1;
            int suankidugumIndex = 0;   
            Dugum suAnkiDugum;

            // Dugum sayısını döndürür
            public int Say   
            {          
                  get { return dugumSayisi;}  
            }    

            // Su anki düğümü dondurur
            public Dugum SuAnkiDugum  
            {
                  get   { return suAnkiDugum;} 
            } 

            // Su anki düğümün index numarasını dondurur
            public int SuAnkiDugumIndex 
            {  
                  get   { return suankidugumIndex;}
            }

           // Yapıcı metot
            public bagliListe(object obj)
            {          
                  suAnkiDugum = new Dugum(null, null, obj); 
                  suAnkiDugum.Sonraki = null;       
                  suAnkiDugum.Onceki = null;  
            }                  

            // Yeni düğüm ekler ve eklenen düğümü o anki düğüm olarak belirler
            public void DugumEkle(object obj) 
            {          
                  if(suAnkiDugum.Sonraki == null)    //    listenin sonunda eleman yoksa sona ekler
                  {                
                        suAnkiDugum = suAnkiDugum.Sonraki = new Dugum(suAnkiDugum, null, obj); 
                  }          
                  else        // eleman varsa araya ekler
                  {                
                        suAnkiDugum = suAnkiDugum.Sonraki = new Dugum(suAnkiDugum, suAnkiDugum.Sonraki,obj);  
                  }    
                  dugumSayisi++;         
                  suankidugumIndex++;
            }          

            // O anki düğümden sonraki düğüme gider
            public void SonrakineGit()  
            {                
                  if(suAnkiDugum.Sonraki == null)    // ileride dugum yoksa istisnai durum olusturulur
                  {                
                         throw new Exception("Sonraki dugum bulunamadi!");      
                  }          
                  else  // ileride dugum mevcutsa sonraki dugume gider
                  {           
                        suAnkiDugum = suAnkiDugum.Sonraki;  
                        suankidugumIndex++;         
                  }
            }           

            public void OncekineDon()   
            {          
                  if(suAnkiDugum.Onceki == null)     // onde dugum yoksa istisnai durum olusturulur  
                  {                
                        throw new Exception("Onceki dugum bulunamadi!");    
                  }          
                  else  // onde dugum mevcutsa onceki dugume gider    
                  {                
                        suAnkiDugum = suAnkiDugum.Onceki;             
                        suankidugumIndex--;         
                  }          
            }

            // indeks numarası verilen düğüme git
            public void DugumeGit(int index)  
            {    
                  while(suankidugumIndex != index)
                  {
                        if(suankidugumIndex < index) SonrakineGit();                 
                       else if(suankidugumIndex > index) OncekineDon();
                  }
            }
}

Kodda görüldüğü gibi düğüm sayısını döndüren Say, o anki düğümü döndüren SuAnkiDugum, o anki düğümün indeks numarasını döndüren SuAnkiDugumIndex, listeye yeni bir düğüm ekleyen DugumEkle, düğümler arasında ilerlemeyi sağlayan SonrakineGit, OncekineDon ve DugumeGit metotlarını ve bagliListe yapıcı metodunu yazarak sınıf tasarımımızı tamamladık. 

Son olarak

Görüldüğü gibi göstericileri kullanmadan sadece sınıf yapılarından yararlanarak çift yönlü bir bağlı liste tasarımı yaptık. Oluşturduğumuz sınıfı artık uygulamalarımızda gerekli referansları ekleyerek kullanabiliriz. Yazdığımız kod birkaç uygulama ile test edilmiştir. Herhangi bir hatayla karşılaşmanız durumunda e-posta adresimden bana ulaşmanızı rica ederim. Başka bir yazıda görüşmek üzere.  

Referanslar 

http://www.csharpnedir.com/makalegoster.asp?MId=349
http://ogrenci.hacettepe.edu.tr/~b0145801/c/clisteler.htm
http://www.c-sharpcorner.com/language.asp

Makale:
C# ile Göstericisiz Bağlı Liste Kullanımı C#, Visual C# ve .NET Arden Agopyan
  • Yazılan Yorumlar
  • Yorum Yaz
MAR
23
2005
Merhabalar. İlginiz için teşekkürler. İlk yorumumda da belirttiğim üzere zaten bunun bir bilgi eksikliğinden kaynaklandığını ben de düşünmüyorum ki bu eksikliğe sahip biri zaten böyle bir sitede kuşkusuz editörlük yapamaz. Bahsettiklerinizi ve anlatılmak isteneni zaten anlıyorum ancak bu tür bir anlatım tarzının bu dili yeni öğrenmeye başlayan ya da CC++ geçmişi olmadığı için bu ifadeleri düşündüğünüz tarzda yorumlayamayacak kişiler tümüyle yanlış bilgilenmiş olacak ve C# ile birlikte gelen ve bağlı liste hazırlamaktan daha da önemli olduğunu düşündüğüm bu temel dil özelliğinden habersiz kalacaklardır. Örneğin böyle bir kişi makalenin ardından şu soruyu sorsa ne cevap vereceğiz: Gösterici kullanmadan C#da böyle bir yapıyı hazırlayabilmek çok güzel bişeymiş. Peki ben bunu göstericilerle hazırlamak istiyor olsaydım nasıl bir sözdizimi kullanacaktım?. Tabi ki bir yanıt beklemiyorum çünkü bir yanıtı yok. Yalnızca anlatmak istediğim şeyi bir soruyla ifade etmek istedim. İlginiz için tekrar teşekkürler Sefer Bey. İyi çalışmalar..
MAR
20
2005
Makalenin başlığının vurgulamak istediği çok açık. Pointer dan kasıt klasik c ve C++ dillerinden aşina olduğumuz pointeri vurgulanmış. Zaten her dilin kendine özel isimlendirmeleri var. C# dilindeki pointer diye isimlendireceğimiz unsafe kod blogunda tanımlayacağımız pointerlardır.Ki benzer şekilde C++ dilinde de referans denen şey de aslında pointer olmasına karşın pointer denmeyip referans deniyor. Kısacası vurgulanmak istenen konu bellidir. İçeriğini de okuyunca başlık net olarak açıktır.
MAR
20
2005
Merhaba, Evet soyledikleriniz doğru , gösterici (pointer) olmadan bağlı liste gibi kompleks bir veri yapısı tasarlanamaz. Ama bu dediğini C dili için geçerli. Yalnız dikkat eden gösterici derken bildiğimiz klasik int *ptr şeklindeki tanımlamadan bahsediyoruz. Yoksa elbetteki C# dilinde tanımladığını nesneler de zaten alt planda birer göstericiden ibaret. Makalede yazılan bağlı listedeki elemanlar da her ne kadar bildiğimiz klasik tanımlanan biçimde referans vermiyor olsada aslında onlarda daha alt seviye birer adres. Eğer C# dilinde C deki gibi gösterici sintaksı ile yapılmış olsaydı o zaman dediğiniz gibi başlık daha farklı olabilirdi. Ama bu haliyle başlığın uygun olduğunu düşünorum. Tabi kişiden kişiye değişir, yoruma açık bir konu. Olayı hangi açıdan ele aldığınıza da bağlı. Ama sizin soylediğiniz gibi bir bilgi eksikliği yok.. Yorumlarınız için teşekkürler.
MAR
20
2005
Sizin gibi ciddi ve C# için sağlam referans teşkil eden bir site için bu makale başlığı pek yakışık almadı. Umarım hatanın kaynağı bilgi eksikliği değil yalnızca popülist bir yaklaşımdır. Pointer kullanmadan bağlı liste oluşturamazsınız. Aksine burada verilmesi gereken bilgi, yaratılan sınıf örneklerinin adlarının zaten kendi başlangıç adreslerini tutan bir pointeri temsil etmesi olmalıydı. Yani siz yine pointer kullanıyorsunuz ancak sintaktik olarak C++ gibi zorlanmıyorsunuz demeliydiniz. Bu ise bağlı listenin nasıl yapılacağından daha da önemli bir bilgi. Lütfen bu faydalı siteye yakışmayacak yanlışlığı düzeltiniz.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor