1~

Minter Coder's Blog

Veri Yapıları & Algoritmalar Linked List 10 - Doubly Linked List & Başa ve Sona Eleman Ekleme

2022-05-25

Double Linked List (İkili Bağlantılı Liste): Adından da anlaşılacağı üzere iki tane bağlantı bilgisi vardır.Düğümümüzün iki pointerindan birincisi önceki düğümü(previous pointer) diğeri ise sonraki düğümü gösterir(next pointer).Her zaman ilk nodemizin önceki düğümü(prev pointeri) null , son nodemizin sonraki değeri (next pointeri) null'u gösterir.

C dilindeki kodumuz şöyle olur;

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

struct Node * head=NULL;

Bir örnek ile ikili bağlı listeye giriş yapıp eleman eklemek için kodlarımızı görelim , yorum satırları eklenmiş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;
    }

}

 

//Listeleme işlemini yapıyoruz.
void listele(){
    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("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;
            
            
        }
    }        
        
    
    return 0;

}