1~

Minter Coder's Blog

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

2022-05-25

Aşağıda baştan ve sondan eleman silmek için fonksiyonlarımız bulunmakta : Yorumlarda her şey belirtildi.


void bastanElemanSil(){
    if(head==NULL){
        printf("List is empty!!\n");
    }else if(head->next==head){
        head=NULL;
        free(head);
    }else{
        //2.düğümümüzü temp'e attık
        temp=head;
        // son düğümü bulacaz.
        while(temp->next!=head){
            temp=temp->next;
        }
        // artık son düğümden sonraki düğüm artık 2.düğümümüzü gösterecek çünkü 2.düğüm artık 1.düğüm olacak
        temp->next=head->next;
        // 1.düğümü uçurduk bellekten
        free(head);
        // artık 2.düğümümüzü 1.düğüm yaptık
        head=temp->next;
    }
}

void sondanElemanSil(){
    if(head==NULL){
        printf("List is empty!!!\n");
    }else{
        // eğer ki 1 düğüm tek varsa bastanElemanSil fonksiyonunu çağırdık direk
        if(head->next==head){
            bastanElemanSil();
        }
        // eğer ki 1'den fazla düğüm var ise :
        else{
            // baştaki düğümü geçici düğüme attık
            temp=head;
            // sondan bir önceki düğümü bulduk çünkü artık o bizim son düğümümüzü olacak ve
            while(temp->next->next!=head){
                temp=temp->next;
            }
            // son düğümü bellekten uçuruyoruz
            free(temp->next);
            // sondan bir önceki düğümümüzü temp'e atmıştık while içerisinde ve sonraki düğümü artık baştaki düğümü gösterecek
            temp->next=head;
        }
        
    }

}

 

 

 

Önceki dersle kodların birleştirildiği durum :

 

#include<stdio.h>
#include<stdlib.h>


struct Node {
    int data;
    struct Node * next;
};

struct Node * head=NULL;
struct Node * temp=NULL;

void basaElemanEkle(int data){
    // eklenecek düğüm için bellekten yer ayırıyoruz
    struct Node * ptr;
    ptr = (struct Node * ) malloc (sizeof(struct Node));
    // datamızı aktarıyoruz
    ptr->data=data;
    // eğer ki başta düğüm yok ise
    if(head==NULL){
        // baştaki düğümümüz yeni eklenecek düğüm olacak ve
        head=ptr;
        // next'i kendisini gösterecek circular linked list olduğu için
        ptr->next=ptr;
    }
    // başta düğüm var ise
    else{
        // baştaki düğümü geçici düğümümüze atıyoruz çünkü
        temp=head;
        // sondaki düğümü bulabilmek için ve while'de sondaki düğümü de temp'e atıyoruz
        while(temp->next!=head){
            temp=temp->next;
        }
        // artık yeni eklediğimiz node'nin next'i şuan baştaki node'yi gösterecek
        ptr->next=head;
        // sondaki düğümün next'i yeni eklediğimiz boştaki düğümü gösterecek
        temp->next=ptr;
        // ve baştaki düğümümüz artık yeni eklediğimiz düğüm olan ptr olacak
        head=ptr;
    }

}

void sonaElemanEkle(int data){
    // eklenecek düğüm için bellekten yer ayırıyoruz
    struct Node * ptr;
    ptr = (struct Node * ) malloc (sizeof(struct Node));
    // datamızı aktarıyoruz
    ptr->data=data;
    // eğer ki başta düğüm yok ise
    if(head==NULL){
        // sondaki düğümümüz yeni eklenecek düğüm olacak ve
        head=ptr;
        // next'i kendisini gösterecek circular linked list olduğu için
        ptr->next=ptr;
    }
    // başta düğüm var ise
    else{
        // baştaki düğümü geçici düğümümüze atıyoruz çünkü
        temp=head;
        // sondaki düğümü bulabilmek için ve while'de sondaki düğümü de temp'e atıyoruz
        while(temp->next!=head){
            temp=temp->next;
        }
        // artık yeni ekleyeceğimiz düğümümüz şuan sondaki düğüm olan temp'in next'i yani baştaki düğümü gösterecek
        ptr->next=temp->next;
        // ve temp düğümümüz sondaki düğüm artık yeni eklenen ptr düğümünü gösterecek çünkü ptr artık son düğüm oldu.
        temp->next=ptr;        
    }

}

void bastanElemanSil(){
    if(head==NULL){
        printf("List is empty!!\n");
    }else if(head->next==head){
        head=NULL;
        free(head);
    }else{
        //2.düğümümüzü temp'e attık
        temp=head;
        // son düğümü bulacaz.
        while(temp->next!=head){
            temp=temp->next;
        }
        // artık son düğümden sonraki düğüm artık 2.düğümümüzü gösterecek çünkü 2.düğüm artık 1.düğüm olacak
        temp->next=head->next;
        // 1.düğümü uçurduk bellekten
        free(head);
        // artık 2.düğümümüzü 1.düğüm yaptık
        head=temp->next;
    }
}

void sondanElemanSil(){
    if(head==NULL){
        printf("List is empty!!!\n");
    }else{
        // eğer ki 1 düğüm tek varsa bastanElemanSil fonksiyonunu çağırdık direk
        if(head->next==head){
            bastanElemanSil();
        }
        // eğer ki 1'den fazla düğüm var ise :
        else{
            // baştaki düğümü geçici düğüme attık
            temp=head;
            // sondan bir önceki düğümü bulduk çünkü artık o bizim son düğümümüzü olacak ve
            while(temp->next->next!=head){
                temp=temp->next;
            }
            // son düğümü bellekten uçuruyoruz
            free(temp->next);
            // sondan bir önceki düğümümüzü temp'e atmıştık while içerisinde ve sonraki düğümü artık baştaki düğümü gösterecek
            temp->next=head;
        }
        
    }

}

void listele(){
    if(head==NULL){
        printf("List is empty!!\n");
    }else{
        temp=head;
        printf("\n****************************************\n");
        while(temp->next!=head){
            printf("%d\t",temp->data);
            temp=temp->next;
        }
        printf("%d\t",temp->data);
        printf("\n****************************************\n");
    }
}

 

int main(){
    int data,choice;
    while(1){
        printf("1)Basa 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;    
}