1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Linked List 11 - Doubly Linked List & Baştan ve Sondan Eleman Silme

2022-05-25

Arkadaşlar baştan düğüm silerken 2.düğümümüz bizim artık 1.düğümümz olacak bunu dikkate alalım ve son olarak da sondan düğümü silmek için ise sondan önceki düğümü buluyoruz çünkü o artık bizim son düğümümüz olacak bütün kodlar aşağıda yorumlarla birlikte düzenli bir şekilde verilmiştir.

 

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


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

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

void basaElemanEkle(int data){
    // eklenecek elemani oluşturup bellekte yer ayırıyoruz
    struct Node *ptr;
    ptr = (struct Node *) malloc ( sizeof(struct Node) );
    // verilen datayı da aktardık
    ptr->data=data;
    // eğer ki başta eleman yok ise
    if(head==NULL){
        // baştaki elemanimiz yeni eklenecek eleman olur previous pointeri null
        ptr->prev=NULL;
        // sonraki değeri de null olur çünkü ilk eleman ve son eleman olmuş olur.
        ptr->next=NULL;
        // baştaki elemana yeni eklenmiş elemanı atıyoruz
        head=ptr;
    }
    // eğer ki başta eleman var ise
    else{
        // geçici düğümümüze baştaki düğümü atıyoruz.Depolamak için çünkü baştaki eleman artık 2.eleman olcak
        temp=head;
        // baştaki elemanımızın artık önceki değeri yeni eklenecek eleman olacak
        temp->prev=ptr;
        // yeni eklenecek elemanın next'i yani sonraki değeri temp'i gösterecek çünkü temp'e atadığımız 1.düğüm artık 2.düğüm oldu
        ptr->next=temp;
        // baştaki düğümümüz null'u gösterecek.
        ptr->prev=NULL;
        // baştaki düğüme artık yeni atadığımız düğümü atadık.
        head=ptr;
    }
}


void sonaElemanEkle(int data){
    // eklenecek elemani oluşturup bellekte yer ayırıyoruz
    struct Node *ptr;
    ptr = (struct Node *) malloc ( sizeof(struct Node) );
    // verilen datayı da aktardık
    ptr->data=data;
    if(head==NULL){
        // baştaki elemanimiz yeni eklenecek eleman olur previous pointeri null
        ptr->prev=NULL;
        // sonraki değeri de null olur çünkü ilk eleman ve son eleman olmuş olur.
        ptr->next=NULL;
        // baştaki elemana yeni eklenmiş elemanı atıyoruz
        head=ptr;
    }
    // eğer ki başta eleman var ise
    else{
        // geçici düğümümüze baştaki düğümü atıyoruz.
        temp=head;
        //Tek tek düğümleri dolaşıp son düğümü buluyoruz.
        while(temp->next!=NULL){
            temp=temp->next;
        }
        // artık temp son düğümmüz oldu bunun next'i artık yeni sona eklenen düğüm olan ptr'i gösterecek
        temp->next=ptr;
        // ptr son düğüm olduğu için previous pointeri temp'i gösterecek
        ptr->prev=temp;
        // son düğümün next pointeri de null'u gösterecek.
        ptr->next=NULL;
    }

}

void bastanElemanSil(){
    if(head==NULL){
        printf("List is empty!!\n");
    }else if(head->next==NULL){
        head=NULL;
        free(head);
    }else{
        // 2.düğümü temp'e attık
        temp=head->next;
        // baştaki elemanı uçurduk
        free(head);
        // 2.düğümümüz 1.düğüm oldu ilk düğümün prev'i NULL'u gösteriyor
        temp->prev=NULL;
        // head'e ilk 2.düğümümüzü artık atadık 1.düğümümüz oldu.
        head=temp;
    }
}

void sondanElemanSil(){
    struct Node * ptr;
    if(head==NULL){
        printf("List is empty!!\n");
    }else if(head->next==NULL){
        // tek eleman var ise
        bastanElemanSil();
    }else{
        temp=head;
        // sondan bir önceki düğümü buluyoruz.Çünkü artık o son düğüm olacak
        while(temp->next->next!=NULL){
            temp=temp->next;
        }
        // Son eleman
        ptr=temp->next;
        // uçtu
        free(ptr);
        // son düğüm null gösterir.
        temp->next=NULL;
        
    }
    
}

 

//Listeleme işlemini yapıyoruz.
void listele(){
    if(head==NULL){
        printf("!!!!List is empty!!\n");    
    }
    else{
        temp=head;
        printf("\n*******************************\n");
        while(temp->next!=NULL){
            printf("%d\t",temp->data);
            temp=temp->next;
        }
        printf("%d",temp->data);
        printf("\n*******************************\n");
    }
    

}

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("Seçiminiz : ");
        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;

}