11 Eylül 2010 Cumartesi

Çift Bağlı Listeler(Doubly Linked Lists)

Tekrardan selamlar herkese,

Şimdi ise Çift Bağlı Listelere bakacağız. http://gurkanalkan.blogspot.com/2010/09/tek-bagl-listelerlinked-lists.html adresinde anlatmış olduğumuz tek bağlı listeden farkı, kendisinden önceki elemana da gidebiliyor olmasıdır. Yani liste elemanları arasındaki geçişi daha rahat yapabileceğiz ki bu da bize daha rahat bir yönetim sağlar.

Çift Bağlı Listenin bir elemanı üç kısımdan oluşur. Veri, Önceki Elemanın Adresini Tutan İşaretçi, sonraki Elemanın Adresini Tutan İşaretçi. İlk eleman, kendinden önce elemana sahip olmadığından, bir işaretçisi NULL olacaktır. Keza aynı şekilde son eleman, kendisinden sonra elemana sahip olmadığından, bir işaretçisi NULL olacaktır.

Yine tembelliğim ağır basıyor ve resmi internetten düşürüyorum. :)



Gördüğünüz gibi 12 verisine sahip eleman, listenin ilk elemanı. Dolayısıyla kendisinden önce eleman yok ve bu yüzden sol işaretçisi NULL'ı gösteriyor. Yani soldaki kutunun içine NULL da yazabiliriz, böyle okla göstermek yerine... 12 değerine sahip elemanın sağdaki işaretçisi, 99 verisine sahip elemanın sol işaretçisinin adresini tutuyor, yani orayı gösteriyor. Aynı şekilde 99 verisine sahip elemanın sol işaretçisi de, 12 verisine sahip elemanın sağ işaretçisinin adresini tutuyor, yani onu gösteriyor.. Mantık Tek Bağlı Liste ile benzer yani, sadece geriye de gidebiliyoruz bu listede. Son elemanın sağdaki işaretçisine dikkat buyurun şimdi de. Kendisinden sonra eleman olmadığı için NULL değerini taşımakta...

Tek Bağlı Liste'yi anlatırken kod yazmıştık biraz, seriyi bozmayalım kısa bir kod da bu konu için yazalım:

struct ListNode
{
int data;
struct ListNode *nextPtr;
struct ListtNode *previousPtr;
};
typedef struct ListNode ListNode;
typedef ListNode *ListNodePtr;


Önce bir çift bağlı liste için strcut tanımladık. Integer veri tutan ve iki adet işaretçisi olan bir yapısı var haliyle...

Yine aynı şekilde eleman ekleme kodunu yazayım ama bu biraz daha uzun kod olacak sanırım. :S Bu kez üşenmeyeceğim. :)

void insertList(ListNodePtr *startPtr,int datam)
{
ListNodePtr currentPtr, previousPtrm, newPtr;
newPtr=(ListNodePtr)malloc(sizeof(ListNode));
newPtr->data=datam;
currentPtr=(*startPtr);
previousPtrm=NULL;

while(currentPtr!=NULL && currentPtr->data{
previousPtrm=currentPtr;
currentPtr=currentPtr->nextPtr;
}

if(previousPtrm==NULL)
{
newPtr->nextPtr=(*startPtr);
newPtr->previousPtr=NULL;
(*startPtr)=newPtr;
}

else
{
newPtr->nextPtr=currentPtr;
newPtr->previousPtr=previousPtrm;
previousPtrm->nextPtr=newPtr;
if(currentPtr!=NULL){currentPtr->previousPtr=newPtr;}
}
}


Şimdi kodu nasıl anlatacağımı düşünüyorum. :D Özetlemek gerekirse.. :) Arkadaşlar sadece NULL kontrolleri yaptım ve ona göre sıraladım sadece. :) Az kasarsak kısa ve derli toplu kod yazılabilir muhtemelen ama konuyu hiç de fena anlatmıyor bu kod da. :)

Görüşmek üzere..

Hiç yorum yok: