1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Linked List 15 - Çift Yönlü Circular(Dairesel) Baştan ve Sondan Eleman Silme

2022-05-25

Baştan düğüm silerken düşünülmesi gereken senaryo şudur :  2.düğümümüz artık 1.düğüm olacak ve 2.düğümümüzün prev'i artık sondaki düğümü gösterecek ve sondaki düğümümüzün nexti artık 2.düğümümüzü gösterecek.

Sondan eleman silerken ise sondan önceki düğümümüzün nexti artık baştaki düğümü baştaki düğümüz prev'i ise artık sondan önceki düğümü gösterecek.

 


void bastanElemanSil(){
    if(head==NULL){
        printf("List is empty!!\n");
    }
    // eğer ki sadece tek bir düğüm var ise:
    else if(head->next==head){
        // baştaki buluyoruz NULL'a atıyoruz
        head=NULL;
        // ve bellekten uçuruyoruz....
        free(head);    
    }
    // birden fazla düğüm var ise
    else{
        temp=head;
        // sondaki düğümü buluyoruz
        while(temp->next!=head){
            temp=temp->next;
        }
        // artık sondaki düğüm baştaki düğümden sonraki düğüm olan 2.düğümü gösterecek
        temp->next=head->next;
        // 2.düğümün prev'i sondaki düğümü gösterecek ve head'i boşa salcaz.
        head->next->prev=temp;
        // baştaki düğümü uçurduk
        free(head);
        // artık sondaki düğümden sonraki düğümümüz bizim baştaki düğümümüz olacak.
        head=temp->next;
    }
}

void sondanElemanSil(){
    if(head==NULL){
        printf("List is empty!!");
    }
    // sadece tek bir düğüm var ise :
    else if(head->next==head){
        head=NULL;
        free(head);
    }
    // birden fazla düğüm var ise
    else{
        temp=head;
        // sondaki düğümden önceki düğümü buluyoruz
        while(temp->next->next!=head){
            temp=temp->next;
        }
        // sondaki düğümü uçuruyoruz..
        free(temp->next);
        // sondaki düğümden önceki düğümümüz artık baştaki düğümü gösterecek çünkü son düğüm oldu.
        temp->next=head;
        // baştaki düğümümüz de artık temp'i gösterecek.
        head->prev=temp;
        
    }
}

 

 

İlk ders ile birlikte kodların bütünü...

 

#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 bastanElemanSil(){
    if(head==NULL){
        printf("List is empty!!\n");
    }
    // eğer ki sadece tek bir düğüm var ise:
    else if(head->next==head){
        // baştaki buluyoruz NULL'a atıyoruz
        head=NULL;
        // ve bellekten uçuruyoruz....
        free(head);    
    }
    // birden fazla düğüm var ise
    else{
        temp=head;
        // sondaki düğümü buluyoruz
        while(temp->next!=head){
            temp=temp->next;
        }
        // artık sondaki düğüm baştaki düğümden sonraki düğüm olan 2.düğümü gösterecek
        temp->next=head->next;
        // 2.düğümün prev'i sondaki düğümü gösterecek ve head'i boşa salcaz.
        head->next->prev=temp;
        // baştaki düğümü uçurduk
        free(head);
        // artık sondaki düğümden sonraki düğümümüz bizim baştaki düğümümüz olacak.
        head=temp->next;
    }
}

void sondanElemanSil(){
    if(head==NULL){
        printf("List is empty!!");
    }
    // sadece tek bir düğüm var ise :
    else if(head->next==head){
        head=NULL;
        free(head);
    }
    // birden fazla düğüm var ise
    else{
        temp=head;
        // sondaki düğümden önceki düğümü buluyoruz
        while(temp->next->next!=head){
            temp=temp->next;
        }
        // sondaki düğümü uçuruyoruz..
        free(temp->next);
        // sondaki düğümden önceki düğümümüz artık baştaki düğümü gösterecek çünkü son düğüm oldu.
        temp->next=head;
        // baştaki düğümümüz de artık temp'i gösterecek.
        head->prev=temp;
        
    }
}


void listele(){
    if(head==NULL){
        printf("List is 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("3)Baştan eleman sil\n");
        printf("4)Sondan eleman sil\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;
            case 3:bastanElemanSil();listele();break;
            case 4:sondanElemanSil();listele();break;
        }
    }
    
    return 0;
}