1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Linked List 12 - Tek Yönlü Circular(Dairesel) Başa ve Sona Eleman Ekleme

2022-05-25

Tek Yönlü Dairesel Bağlı Listelerde listenin son düğümü tek yönlü doğrusal linked listteki gibi null'u değil de artık baştaki head düğümümüzü gösterir.Dairesel Bağlı Listenin son düğümüne ulaşmak için artık temp->next!=NULL değil de artık nexti head'i göstereceği için temp->next!=head şeklinde yazarak sön düğümü bulacağız.

Dairesel Bağlı Listemizin de C dilinde yapısı şu şekilde olur;


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

struct Node * head;

 

Bu derste circular linked listte başa ve sona eleman eklemeyi göreceğiz her birini tek tek yorum satırlarıyla anlaşılır bir şekilde koda yazdım aşağıda hepsi bulunmakta..

 

#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 listele(){
    if(head==NULL){
        printf("List is empty!!");
    }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("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;
        }
    }    
    
    
    return 0;    
}