Bağlı Liste Veri Yapısını Oluşturma

BigInteger kütüphanesini yazmaya kaldığımız yerden devam ediyoruz. İlk yazıda projemizin klasör yapısını oluşturup sonrasında makefile dosyasını yazmıştık. Bu yazıda ise BigInteger kütüphanesinde kullanacağımız bağlı liste veri yapısını oluşturacağız. Açıkçası teorik olarak bağlı liste yapısını ayrıntılı bir şekilde açıklamayacağım ama neden kullandığımıza dair bir açıklama getirelim. Bağlı liste düğümlerden oluşan bir yapıdır. Bu düğümler içerisinde hem data(veri) hem de bir diğer düğümü işaret eden pointer taşır. Benim amacım bu düğüme ait data değişkeninde bir sayının basamak değerini barındırmak. Ayrıca bağlı liste veri yapısı oldukça dinamik bir yapı, bu sebeple istediğimiz değişiklikleri kolayca gerçekleştirebiliriz bu yapı üzerinde.

Bağlı liste yapısı hakkında ayrıntılı olarak internet üzerinden bir sürü kaynak bulabilirsiniz. Aşağıda yazdığım bağlı liste, tek yönlü bağlı liste yapısıdır. LinkedList.h başlık dosyasından aşağıdaki kodları yazdım:
#ifndef LINKEDLIST_H
#define LINKEDLIST_H

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

class LinkedList{
    node *root;
    node *last;
    
    public:
        LinkedList();
        void append(int);
        void prepend(int);
        void deleteNode(int);
        void showList();
};

#endif
Düğüm yapısını struct olarak oluşturdum. LinkedList adında bir sınıf oluşturdum ve private üye değişkenleri olarak root ve last pointerları tanımladım. Bu göstericiler, liste yapısındaki baş düğümün ve son düğümün adresini tutmak için kullanılacak. public access modifer kapsamında bulunan beş tane fonksiyonumuz var. Bu fonksiyonların yaptığı işleri LinkedList.cpp kaynak kodunda yazacağız. Ancak fonksiyonları şu şekilde tanımlayalım:

  • LinkedList() → Kurucu fonksiyon.
  • void append(int) → Liste yapısının sonuna eleman eklemek için kullanılan fonksiyon.
  • void prepend(int) → Liste yapısının başına eleman eklemek için kullanılan fonksiyon.
  • void deleteNode(int) →  Listeden eleman silmek için kullanılan fonksiyon.
  • void showList() → Liste elemanlarını listelemek için kullanılan fonksiyon.
append ve prepend fonksiyonları her ne kadar sadece eleman eklemek için kullanılan fonksiyonlar olarak gözüküyor olsada BigInteger kütüphanesinde kullanacağımız fonksiyon kolaylık açısından... Açıkçası şu an hangisini kullanacağımı bilmiyorum o yüzden iki fonksiyonu da yazdım. Onu da ileride hallederiz artık.😐

LinkedList.cpp dosyasında fonksiyonlarımızın gövdelerini yazmaya başlayalım:
#include "../include/LinkedList.h"
#include <iostream>
Kullanılacak kütüphaneler yukarıda olduğu gibi include edilir. İlk olarak kurucu fonksiyon olan LinkedList() fonksiyonu yazılır:
LinkedList::LinkedList(){
    root = nullptr;
    last = nullptr;
}
root ve last en başta herhangi bir düğümü gösteremeyeceği için nullptr atanır.
void LinkedList::append(int value){
    node *temp = new node;
    temp->data = value;
    temp->next = nullptr;

    if(root == nullptr){ // liste boşsa
        root = temp;
        last = temp;
        return;
    }

    node *iter = root;
    while(iter->next != nullptr) // son düğüme ulaşana kadar dön
        iter = iter->next;
    iter->next = temp;
    last = iter->next;
}
Yukarıda listenin sonuna eleman eklemek için kullanılacak fonksiyon yazılmıştır. Eğer bağlı liste nedir, nasıl kullanılır biliyorsanız yukarıdaki kodu rahatlıkla anlarsınız. Aşağıdaki kodda ise liste başına eleman eklemek için kullanılacak fonksiyonu yazdım:
void LinkedList::prepend(int value){
    node *temp = new node;
    temp->data = value;
    temp->next = nullptr;

    if(root == nullptr){
        root = temp;
        last = temp;
    }
    temp->next = root;
    root = temp;
}
Listeden düğüm silme fonksiyonu aşağıdaki gibidir:
void LinkedList::deleteNode(int v){
    if(root == nullptr) // liste boşşsa
        return;
    if(root->data == v){ // liste başı silinecekse
        root = root->next;
    }
    node *iter = root;
    while(iter->next != nullptr){
        if(iter->next->data == v){
            iter->next = iter->next->next;
            return;
        }
        iter = iter->next;
    }
}
showList ile liste elemanları ekrana bastırılır. Bu fonksiyon gerekli değil ancak liste yapısının düzgün çalıştığından emin olmak için yazdım:
void LinkedList::showList(){
    if(root == nullptr){
        std::cout << "liste bos" << std::endl;
        return;
    }
    node *iter = root;
    while (iter->next != nullptr)
    {
        std::cout << iter->data << "-";
        iter = iter->next;
    }
    std::cout << std::endl;
}
Buraya kadar olan kısımda bağlı liste yapısını oluşturmuş olduk. Diğer yazıda BigInteger.cpp ve BigInteger.h dosyalarının kodlarını yazacağız.

Hiç yorum yok:

Yorum Gönderme