1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Linked List 7 - Sondaki Düğümü Silme

2022-05-24

Sondaki node bildiğimiz gibi kendisinden sonraki düğümü NULL olarak gösteririr aşağıda fonksiyonun kendisinin her satırının üstünde o satırın ne iş yaptığı yazmaktadır en altta ise önceki derslerle birleştirdiğimiz kodları toplu olarak atıyorum...Functionumuz ;


void removeLastData(){
    struct node * temp;
    if(head==NULL){
        printf("Linked list bos!!");
    }
    // ilk düğümümüz boş değilse gir
    else{
        // 2.düğümümüz null değilse gir
        if(head->next!=NULL){
            // baştaki düğümü geçici oluşturduğumuz düğüme at
            temp=head;
            // biz sondan önceki elemanı bulmak için aşağıdaki while conditionunu yazdık
            while(temp->next->next!=NULL){
                temp=temp->next;
            }
            // sondan önceki elemanı temp değişkenine üstte while döngüsü içinde bulup atadık , aşağıda ise onu bellekten uçuruyoruz yerini boşaltıyoruz
            free(temp->next);
            // artık sondan önceki elemanımız son eleman olacağı için next'i de NULL gösterir.
            temp->next=NULL;
        }else{
            // eğer ki 2.düğümümüz NULL yani boş ise , yoksa ilk tek bir eleman vardır onu da yukarıda yazdığımız fonksiyonu çağırarak uçuruyoruz :D
            removeHeadData();
        }
    }
    
    
}

 

Birleştirilmiş kodumuz :

 

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

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


// ilk dugumumuz
struct node * head=NULL;

void addDataToHead(int data){
    struct node * temp,*ptr;
    ptr=(struct node *) malloc(sizeof(struct node));
    ptr->data=data;
    
    if(head == NULL){
        // artik ilk dugum ekledigimiz dugum olacak eger ki liste boş ise
        head=ptr;
        head->next=NULL;
    }else{
        // ilk elemanımızı gecici pointerimiza atiyoruz cunku bu artik 2.eleman olacak
        temp=head;
        // ilk elemanımız artık yeni ekledigimiz eleman ptr olacak
        head=ptr;
        // artık yeni eklediğimiz elemanın next'i gecici yani bizim önceki head'imiz olacak.
        ptr->next=temp;
    }

}

void addData(int data){
    // temp gecici node ilerde kullanacagimiz , ptr ise eklenecek eleman
    struct node * temp,*ptr;
    // bellekten yerimizi ayırıyoruz
    ptr=(struct node *) malloc(sizeof(struct node));
    // datamizi yeni ekleyeceğimiz elemana aktariyoruz
    ptr->data=data;
    
    // head NULL yani eleman hiç yok ise yeni eklenen elemani atiyoruz
    if(head == NULL){
        head=ptr;
        head->next=NULL;    
    }
    // eğer ki eleman varsa
    else{
        temp=head;
        // en son düğümü buluyoruz
        while(temp->next!=NULL){
            temp=temp->next;
        }
        // son eleman yeni eklenen eleman ptr'ı gösterecek
        temp->next=ptr;
        // ptr son eleman olduğu için NULL gösterecek.
        ptr->next=NULL;
        
    }
}

void addToLocation(int locationData,int data){
    struct node *temp,*ptr;
    // bellekte yer ayırıyoruz
    ptr=(struct node *) malloc (sizeof(struct node));
    // datamızı aktarıyoruz
    ptr->data=data;
    // eğer ki ilk baştaki elemanın data'sından önce eklenecekse başa eleman eklemek oluyor o yüzden addDataToHead çağrıldı
    if(head!=NULL && head->data == locationData){
        addDataToHead(data);
    }else{
        // temp'e ilk düğümü attık
        temp=head;
        // artık ilk düğümden sonraki diğer düğümlerin datasını kontrol ediyoruz.Eşit olana kadar dön
        while(temp->next->data != locationData){
            temp=temp->next;
        }
        // ekleyeceğimiz elemanın next'i de temp ile bulunan elemandan hemen sonraki elemanı gösterir çünkü araya ekledik.
        ptr->next=temp->next;
        // bulunan eleman ekleyeceğimiz elemandan önce olacağı için next'i de ptr'ı gösterir
        temp->next=ptr;
    }
}


void removeHeadData()
{
    struct node *temp;

    if(head==NULL){
        printf("Linked list bos!!");
    }else{
        
        // baş düğümünden sonraki gelen düğüm artık ilk düğüm olacağı için sonraki düğümü(2.sıradaki düğüm 1.sıraya geçecek) ikinci düğümü geçici düğüme at
        temp=head->next;
        // ilk düğümü uçur/çıkar bellekten
        free(head);
        
        // artık ilk eleman geçiçi düğümdeki 2.düğüm olacak head'e ata
        head=temp;
    }
}

void removeLastData(){
    struct node * temp;
    if(head==NULL){
        printf("Linked list bos!!");
    }
    // ilk düğümümüz boş değilse gir
    else{
        // 2.düğümümüz null değilse gir
        if(head->next!=NULL){
            // baştaki düğümü geçici oluşturduğumuz düğüme at
            temp=head;
            // biz sondan önceki elemanı bulmak için aşağıdaki while conditionunu yazdık
            while(temp->next->next!=NULL){
                temp=temp->next;
            }
            // sondan önceki elemanı temp değişkenine üstte while döngüsü içinde bulup atadık , aşağıda ise onu bellekten uçuruyoruz yerini boşaltıyoruz
            free(temp->next);
            // artık sondan önceki elemanımız son eleman olacağı için next'i de NULL gösterir.
            temp->next=NULL;
        }else{
            // eğer ki 2.düğümümüz NULL yani boş ise , yoksa ilk tek bir eleman vardır onu da yukarıda yazdığımız fonksiyonu çağırarak uçuruyoruz :D
            removeHeadData();
        }
    }
    
    
}

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

}


int main(){
    int choice,data,location;
    while(1){
        printf("\n1)Sona Ekle\n2)Basa Ekle\n3)Araya Eleman Ekle\n4)Bastan Eleman Sil\n5)Sondan Eleman Sil\n6)Verileri Goruntule\nSeciminizi giriniz : ");
        scanf("%d",&choice);
        switch(choice){
            case 1: printf("Data degerini giriniz : ");scanf("%d",&data);addData(data);break;
            case 2: printf("Data degerini giriniz : ");scanf("%d",&data);addDataToHead(data);break;
            case 3: printf("Hangi elemandan önce : ");scanf("%d",&location);printf("Datayi giriniz : ");scanf("%d",&data);addToLocation(location,data);break;
            case 4: removeHeadData();break;
            case 5: removeLastData();break;
            case 6: display();break;
                
                
        
        }
    }
    
    
    
    return 0;
}