1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Linked List 6 - Baştaki Düğümü Silme

2022-05-24

Arkadaşlar head node'mızı silmek için yazılan fonksiyonu yorum satırlarıyla donattım hemen hemen her satırında hangisi ne iş yapar onu gösterdim umarım yararlı olmuştur.En altta ise ilk dersten bu yana eklediğimiz fonksiyonların hepsinin birleştirilmiş hali bulunmaktadır.


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

 

Birleştirilmiş Hali ---

 

#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 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)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: display();break;
                
                
        
        }
    }
    
    
    
    return 0;
}