C Programlama Bağlı Listeler




Bağlı liste herhangi bir tipten node’ların (düğümlerin) yine kendi tiplerinden düğümlere işaret etmesi (point) ile oluşan zincire verilen isimdir. Buna göre her düğümde kendi tipinden bir pointer olacak ve bu pointerlar ile düğümler birbirine aşağıdaki şekilde bağlanacaktır.






Linked List’in avantajı, hafızayı dinamik olarak kullanmasıdır. Buna göre hafızadan silinen bir bilgi için hafıza alanı boşaltılacak veya yeni eklenen bir bilgi için sadece o bilgiyi tutmaya yetecek kadar hafıza alanı ayrılacaktır.
Yukarıdaki figürde görülen bağlı listeye çok benzeyen ve yine çok kullanılan bir bağlı liste uygulaması da çift bağlı liste (doubly linked list) uygulamasıdır.

Buna göre her düğüm, hem kendinden öncekine hem de kendinden sonrakine bağlanır, bu sayede liste üzerinde ileri ve geri ilerlemek mümkündür.
Listelerin üzerinde işlem yapılırken, dolaşıcı (iterator) şeklinde bir gösterici tanımlanır. Bu dolaşıcı veri aranması, ekleme veya silme gibi işlemler sırasında listenin ilgili elemanına kadar gidilmesini sağlar. Listenin ilgili elemanına gidildikten sonra silme veya ekleme gibi işlemler yapılırken göstericilerde (pointers) yapılan değişikliklerin, listeyi etkilememesini sağlar.
Örneğin bir bağlı listeye yeni bir eleman eklenmesi sırasında aşağıdaki adımlar izlenir:
  1. Ekleme işlemini yapılacağı aralıktan önceki düğüme dolaşıcı tarafından gidilir.
  2. Yeni düğüm oluşturularak, sonrasına, dolaşıcının sonrası atanır.
  3. Dolaşıcının sonrasına ise yeni düğüm atanır.
Bağlı listeden eleman silinmesi sırasında, listede silinecek olan elemandan önceki düğüme kadar dolaşıcı ile gidilir. Dolaşıcının sonrasına, sonrasının sonrası atanır. Bu sayede ilk başta dolaşıcının sonrasında olan düğüm listeden kaldırılmış ve ulaşılamaz hale gelmiş olur. Ardından bu eleman istenirse hafızadan da kaldırılır.
Bağlı listelerin nesne yönelimli programlama dillerinde pointer tipi bulunmamasından dolayı kodlanması biraz farklıdır. Bilindiği gibi C++ gibi melez (hem C hem de nesne yönelimli programlamayı destekler) diller dışında JAVA, C# gibi dillerde gösterici (pointer) bulunmaz. Bunun yerine nesne göstericisi (object referrer) bulunur. Bu değişken tipleri esas olarak bir sınıf(Class)‘dan türetilmiş bir nesneyi(object) gösterebilen değişkenlerdir. Bu değişkenlerin aslında birer göstericiden farkı yoktur.


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
typedef struct liste{
 int deger;
 struct liste *sonraki;
}lst;
int main()
{ int sile;
 lst *p,*q,*ekle,*sil;
 int a,i,sayi;
 int aranacak;
 printf("kac deger girmek istiyorsunuz-->");
 scanf("%d",&a);
 p=q=new lst;
 printf("1. sayiyi giriniz.");
 scanf("%d",&q->deger);
 for(i=2;i<=a;i++)
 {
  p->sonraki=new lst;
   p=p->sonraki;
  printf("%d. degeri giriniz.",i);
  scanf("%d",&p->deger);
 
 }
 p->sonraki=NULL;
 printf(" hangi sayinin arasina kayit etmek istiyorsunuz.");
 scanf("%d",&sayi);
 if(sayi==0)
 {
  ekle=new lst;
  printf("hangi degeri girmek istersiniz.");
  scanf("%d",&ekle->deger);
  ekle->sonraki=q;
  q=ekle;
 }
 
 for(i=1,p=q;i<sayi;i++)
 {
  ekle=new lst;
  printf("hangi degeri girmek istersiniz.");
  scanf("%d",&ekle->deger);
  ekle->sonraki=p->sonraki;
  p->sonraki=ekle; }
  

  printf("hangi degeri silme istiyorsunuz.");
  scanf("%d",&sile);
  if(sile==1)
  {
   sil=q;
   q=q->sonraki;
   free(sil);
  }
  for(i=2,p=q;i<sile;i++)
  {
   p=p->sonraki;
   sil=p->sonraki;
  p->sonraki=sil->sonraki;
  free(sil); 
  
  }
  
 
  
 for(p=q;p->sonraki!=NULL;p=p->sonraki)
 {printf("%d\n degerler bunlardir-->",p->deger);
 }
     printf("aranacak degeri giriniz.");
  scanf("%d",&aranacak);
  for(p=q;p->sonraki!=NULL;p=p->sonraki)
  {
   if(p->deger==aranacak)
   {
    printf("degeriniz mevcuttur.");
    break;
   }
   else{
    printf("degeriniz mevcut degildir.");
  
   }
  }
  
 system("pause");
 return 0;
}

Yorum Gönder

0 Yorumlar