|
C# ile Göstericisiz Bağlı Liste Kullanımı |
|
Gönderiliyor lütfen bekleyin... |
|
|
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
|
|
|
-
-
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
|
|