1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Linked List 14 - Çift Yönlü Circular(Dairesel) Başa ve Sona Eleman Ekleme

2022-05-25

Ç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;
}