1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Linked List 9 - Singly Linked List Bütün Kodları

2022-05-24

#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 removeDataFromLocation(int data){
    struct node *temp,*ptr;
    if(head==NULL){
        printf("Linked list is empty");    
    }else{
        // baştaki düğümü geçici düğüme atadık
        temp=head;
        if(temp->data==data){
            removeHeadData();
        }else{
            // temp'in önündeki düğümün datası verilen dataya eşit olmadığı sürece döngüye eşit olana kadar gir
            while(temp->next->data!=data){
                temp=temp->next;
            }
            // ptr bizim temp'ten sonraki bulduğumuz düğümden sonraki düğümü alır ve bu düğüm silinecek düğümden sonraki düğümdür
            ptr=temp->next->next;
            // bulunan düğümü uçuruyoruz
            free(temp->next);
            // artık temp'in nexti bizim bellekten sildiğimiz düğümden sonraki düğümü gösterir
            temp->next=ptr;
        }
    }
}


void reverse(){
    struct node *temp,*temp2=NULL,*prev=NULL;
    if(head == NULL){
        printf("List bos!!");
    }
    else{
        temp=head; // 15
        while(temp!=NULL){
            temp2=temp->next;
            temp->next=prev;
            prev=temp;
            temp=temp2;
        }
        head=prev;
        
        
    }

}

void count(){
    struct node * temp=head;
    int adet = 0;
    
    while(temp->next!=NULL){
        adet++;
        temp=temp->next;
    }
    adet++;
    printf("\nAdet : %d\n",adet);

}

void sum(){
    struct node *temp=head;
    int toplam=0;
    while(temp->next!=NULL){
        toplam+=temp->data;
        temp=temp->next;
    }
    toplam+=temp->data;
    printf("\nToplam: %d\n",toplam);
}


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)Locationdan Eleman Sil\n7)Dugumleri Ters Cevir\n8)Eleman Sayisi\n9)Verilerin Toplami\n10)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: printf("Silinecek data : ");scanf("%d",&location);removeDataFromLocation(location);break;
            case 7: reverse();break;
            case 8: count();break;
            case 9: sum();break;
            case 10: display();break;
                
                
        
        }
    }
    
    
    
    return 0;
}