Çift Yönlü Dairesel Bağlı Liste (Cİrcular Doubly Linked List ): Arkadaşlar çift yönlü doğrusal bağlı listeden farklı olarak baştaki düğümün prev'i artık NULL değil sondaki düğümü , sondaki düğümün next'i ise artık NULL değil baştaki düğümü gösterecek.
C dilinde basic kodlaması aşağıdaki gibidir.
/ Double circular linked list
struct Node {
int data;
struct Node * prev;
struct Node * next;
};
struct Node * head;
Şimdi ise arkadaşlar başa ve sona eklemek için yazdığım kodları aşağıya sizin için bırakıyorum..
#include<stdio.h>
#include<stdlib.h>
// Double circular linked list
struct Node {
int data;
struct Node * prev;
struct Node * next;
};
struct Node * head=NULL;
struct Node * temp=NULL;void basaElemanEkle(int data){
// eklenecek düğüm için bellekten yer ayırdık
struct Node * ptr = (struct Node *) malloc (sizeof(struct Node));
// düğümün datasına değerimizi aktardık
ptr->data=data;
// eğer ki listede hiç eleman yok ise
if(head==NULL){
// bellekten yer ayrılan düğümün önceki düğümü de kendisini
ptr->prev=ptr;
// sonraki de kendisini gösterir çünkü tek eleman olacak
ptr->next=ptr;
// artık ilk elemanımız eklenen ptr oldu
head=ptr;
}
// eğer ki listede eleman var ise
else{
// head düğümü temp'e atandı
temp=head;
// sondaki düğümü buluyoruz
while(temp->next!=head){
temp=temp->next;
}
// sondaki düğümün next'i yeni eklenen elemanı gösterecek
// baştaki düğümün prev'i artık yeni eklenen elemanı gösterecek çünkü eklenen eleman baş düğüm olcak
temp->next=head->prev=ptr;
// yeni eklenen eleman önceki baş düğümü gösterecek çünkü önceki baş düğüm head
ptr->next=head;
// şimdi baş düğümümüz ptr oldu.
head=ptr;
}
}
void sonaElemanEkle(int data){
struct Node * ptr = (struct Node * ) malloc (sizeof(struct Node));
ptr->data=data;
if(head==NULL){
basaElemanEkle(data);
}else{
// ilk düğümü geçici düğüme atadık
temp=head;
// sondaki düğümü bulduk
while(temp->next!=head){
temp=temp->next;
}
// şuanda ki sondaki düğümün next'i artık baştaki düğümü değil sona yeni eklenecek düğümü gösterecek
temp->next=ptr;
// artık sona eklenecek ptr'ın next'i baştaki düğümü gösterecek
ptr->next=head;
// baştaki düğümün önceki değeri artık sona eklenen yeni ptr'ı gösterecek.
head->prev=ptr;
}}
void listele(){
if(head==NULL){
printf("List empty!!");
}else{
temp=head;
while(temp->next!=head){
printf("%d\t",temp->data);
temp=temp->next;
}
printf("%d\n",temp->data);
}
}int main(){
int choice,data;
while(1){
printf("1)Başa eleman Ekle\n");
printf("2)Sona eleman Ekle\n");
printf("Seciminiz : ");
scanf("%d",&choice);
switch(choice){
case 1:printf("Data : ");scanf("%d",&data);basaElemanEkle(data);listele();break;
case 2:printf("Data : ");scanf("%d",&data);sonaElemanEkle(data);listele();break;
}
}
return 0;
}