Veri yapıları – Bağlı Liste II

Veri yapılarında bağlı liste yöntemi, verileri düzenli halde tutmanın en önemli yollarından biridir. Daha önce şu yazımda bağlı listenin ne olduğunu açıklamıştım ve bağlı liste oluşturmanın, bağlı listeye veri eklemenin nasıl olacağını gösteren bir kod dökümanı paylaşmıştım.

Bu yazıda ise bağlı listeden nasıl veri silineceğini gösteren küçük bir kod dökümanı paylaşacağım.

Tek yönlü bağlı listede, bir işaretçi yalnızca kendinden sonraki adresi gösterdiğinden, tek yönlü bağlı listede bir indis silmek bir geçici değişken gerektiriyor. Eğer her işaretçi kendinden önceki veriyi de gösteriyor olsaydı bu kesinlikle daha kolay olurdu.

while(ptr!=NULL)
{
    if(ilk->deger == value) // bas kismi silinecekse
    {
        ilk = ilk->sonraki;
        break;
    }
    else if(ilk->deger != value && ptr->sonraki->deger == value) // ortadan bir yerden silinecekse
    {
        bul = NULL;
        bul = ptr->sonraki->sonraki;
        free(ptr->sonraki);
        ptr->sonraki = bul;
        break;
    }
    else if(ptr->sonraki->deger == value && ptr->sonraki->sonraki == NULL) // son eleman silinecekse 
    {
        free(ptr->sonraki);
        break;
    }

    ptr = ptr->sonraki;
}

Çift yönlü bağlı liste konusunda tam çalışan bir kod dökümanım da bulunmakta ayrıca. “New” operatörü nedeniyle C++ eklentileri gerektirebilir. Bunun yerine “Malloc” da kullanılabilir. Aşağıdaki kodla oluşturulan bağlı liste, kuyruk yapısına uygun olarak çalışmaktadır.

#include <stdio.h>
#include <stdlib.h>

typedef struct Ogrenci
{
    int ogrenciNo;
    struct Ogrenci *sonraki;
    struct Ogrenci *onceki;
}ogrencitip;

void ekle(),sil(),listele();
Ogrenci *root,*ptr,*temp;

int main() {
    while(1) {
        int decision;
        //printf(" Ogrenci eklemek icin -> 1 \n Ogrenci silmek icin -> 2 \n Liste -> 3 \n Cikis icin -> 4\n");
        scanf("%d", &decision);
        switch(decision)
        {
            case 1:
                ekle();
                break;
            case 2:
                sil();
                break;
            case 3:
                listele();
                break;
            case 4:
                return 0;
            default:
                return 0;
        }
    }
}

void ekle()
{
    int ogrenciNo=0;
    printf("Ogrenci No giriniz: \n");
    scanf("%d",&ogrenciNo);
    if(root==NULL)
    {
        root = new ogrencitip;
        root->ogrenciNo = ogrenciNo;
        root->onceki=NULL;
        root->sonraki=NULL;
        ptr = root;
    }
    else
    {
        temp = new ogrencitip;
        temp->ogrenciNo = ogrenciNo;
        ptr->sonraki = temp;
        temp->onceki = ptr;
        ptr=ptr->sonraki;
    }
    
}

void sil()
{
    int silinecek;
    printf("Silinecek veriyi giriniz:\n");
    scanf("%d",&silinecek);
    ptr = root;
    while(ptr!=NULL)
    {
        if(ptr->ogrenciNo == silinecek)
        {
            if(ptr != root)
            {
                if(ptr->sonraki != NULL)
                {
                    struct Ogrenci *t2 = ptr->sonraki;
                    struct Ogrenci *t3 = ptr->onceki;
                    t3->sonraki = t2;
                    t2->onceki = t3;
                    break;
                }
                else
                {
                    ptr = ptr->onceki;
                    ptr->sonraki = NULL;
                    break;
                }
            }
            else if(ptr == root)
            {
                root = root->sonraki;
                root->onceki = NULL;
                break;
            }
        }
        ptr = ptr->sonraki;
    }
    
    if(ptr!=NULL)
    {
        while(ptr!=NULL)
        {
            ptr = ptr->sonraki;
        }
    }
}

void listele()
{
    ptr = root;
    while(ptr!= NULL)
    {
        printf("Ogrenci no -> %d \n",ptr->ogrenciNo);
        if(ptr->sonraki == NULL) break;
        ptr = ptr->sonraki;
    }
}