Kapat
Anasayfa 399 0

Veri Yapılarına Dair #2

Veri yapılarına dair #2 yazımızda bağlı listeler konusunu inceleyeceğiz. Bağlı listelerde düğüm noktaları vardır. Düğümler algoritmadan gelen ve çıkan verileri depolamaya yarar. Genel olarak bağlı listeleri şu şekilde sıralayabiliriz

Tek-Yönlü Bağlı Liste (Singly Linked List)

Çift-Yönlü Bağlı Liste (Doubly Linked List)

Dairesel Listeler (Circular Lists)

BAĞLI LİSTELER

Doğrusal Veri Yapıları 2 - Bağlı Liste (Linked List) | by Tolgahan Çepel |  Medium

Bağlı Liste ise, aynı kümeye ait verilerin birbirlerine bellek üzerinde sanal bağlanmasıyla oluşturulmaktadır. Veri(data) kısmında saklanacak bilgiler, bağlantı (link-next) kısmında ise bir sonraki düğümün tutulduğu adres bilgisi yer almaktadır.

Bağlı listenin başlangıç noktası (ilk düğümün adresi) bir değişkende tutulur. İlk eleman çoğunlukla head olarak adlandırılmaktadır.
Bağlı liste üzerindeki ara elemanlara doğrudan erişilemez. Ara elemanlara erişebilmek için ilk elemandan yola çıkılmalıdır. Bu durum bağlı listelerin dizilere göre dezavantajıdır. Bağlı listelerin kullanım amacı sıralı verilerin bellekte erişilebilir bir düzende tutulmasıdır. Dezavantajı ise verilere sıralı erişildiği için belirli bir veriye erişimin dizilerden daha çok zaman almasıdır. Liste uzunluğu arttıkça bu zaman da artar. Ama genelde kullanımı özel bir veriye erişim değil, listedeki tüm verilere sıralı erişim şeklindedir.

Bağlı listeler üzerinde;

  1. Liste oluşturma,
  2. Listeye eleman ekleme,
  3. Listeden eleman silme,
  4. Arama yapma,
  5. Listenin elemanlarını yazma,
  6. Listenin elemanlarını sayma vb. gibi ve kuşkusuz daha fazla işlemler yapılabilir

Tek-Yönlü Bağlı Liste (Singly Linked List)

Her düğüm yalnızca bir sonraki düğümün adresi barındırır bunun sonucu olarak tek yönde okuma yapılabilir, bir düğümden önceki düğüme erişilemez. Düğüm yapısı C programlama dilinde struct kullanılarak yapılır. Bir sonraki düğümün adresini tutar.

Bağlı listeler üzerinde yapılan temel işlemler; listeleme, arama, ekleme ve silmedir.

C programlama dilinde dugum isimli bir yapı tanımlarız. Böyle bir yapıda istenilen türde istenildiği kadar eleman tanımlanabilir. Tamsayı türünde veri isimli tek bir eleman tanımlanmıştır. Tanımlanan yapıda veri isimli elemanın tanımından sonra gelen ifadede ile sonrakiDugum isimli bir işaretçi (pointer) türünde bir yapı değişkeninin tanımlandığı görülmektedir. sonrakiDugum isimli bu işaretçi bir sonraki düğümü işaret edecektir.

Tek Yönlü Bağlı Listeye Eleman Ekleme, Silme, Arama, Listeleme 

Tüm işlemleri bir projede birleştirdim. Yorum satırları ile açıklamaları yaptım. Kodları çalıştırdığınız zaman mantığı daha iyi kavranacağını düşünüyorum. Eleman ekleme, silme ,arama ,listeleme, silme işlemlerini renklendirerek göstermeyi tercih ettim

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

typedef struct list {
    int sayi; // sayi tanýmlýyoruz.
    struct list *sonraki;
} liste;
liste *ilk = NULL, *son = NULL, *yeni, *silGecici, *gecici;

void menu(); // islem yapabilmek icin gerekli
void ekle();
void sil(int );
void listele();
void arama(int );
void ekranTemizle();
void bekle();

int main() {  // program çalýþýrken menu kýsmýnýn döngüsü için while kullanýyoruz.
    while (1) {
        menu();
    }
    return 0;
}

void ekle(int veri) {  // eleman ekle

    yeni = (liste *) malloc(sizeof (liste));
    yeni->sayi = veri;
    yeni->sonraki = NULL;

    if (ilk == NULL) { //ilk düğümde eleman olup olmadığını kontrol et.
        ilk = yeni;
        son = ilk;
    } else { //İlk düğümde eleman varsa bu işlemleri yap.
        son->sonraki = yeni;
        son = son->sonraki;
    }
}


void sil(int veri) { // silme iþlemleri
    int kontrol = 0;
    if (ilk->sayi == veri) {
        silGecici = ilk;
        ilk = ilk->sonraki;
        free(silGecici);
        kontrol = 1;
    } else {
        gecici = ilk;
        while (gecici->sonraki != NULL) { //gecici değişken ile liste üzerinde dolaşım sağlanıyor.


            if (gecici->sonraki->sayi == veri) {
                kontrol = 1;
                silGecici = gecici->sonraki; //Silinecek düðüm sil adında değişkene atılıyor.

                if (silGecici == son) //Silinecek düðüm son düðüm ise "son" un kaybolmaması için bir geriye atanır.
                    son = gecici;
                gecici->sonraki = silGecici->sonraki; //Liste kaybolmasın diye aradaki bağ düzenlenir.
                free(silGecici); //Sil düðümü bellekten silinir.
                break;

            }
            gecici = gecici->sonraki;
        }
    }
    if (kontrol == 0)
        printf("Silmek Istediginiz Eleman Listede Yoktur...\n");
    else
        printf("%d sayisi listeden silinmiştir...\n", veri);
}

void listele() {  // işlem yaptığımız listeyi görmemizi saðlar
    gecici = ilk;
    while (gecici != NULL) {
        printf("%d\n", gecici->sayi);
        gecici = gecici->sonraki;

    }
}


void arama(int aranan) { // eleman arama var mı yok mu kontrol etme
    int kontrol = 0;
    gecici = ilk;


    while (gecici != NULL) {
        if (aranan == gecici->sayi) {
            kontrol = 1;
        }
        gecici = gecici->sonraki;
    }

    if (kontrol == 1)
        printf("\n%d Sayisi Bulunmustur..\n", aranan);
    else
        printf("\nAranan Sayi Bulunamamistir...\n");
}


void menu() {
    int secim, sayi;

    printf("1-Ekleme\n");
    printf("2-Listeleme\n");
    printf("3-Arama\n");
    printf("4-Silme\n");
    printf("5-Cikis\n");
    printf("Lutfen Secim Yapiniz --> ");
    scanf("%d", &secim);

    switch (secim) {  // switch case ile menü secim kısımlarının kontrolünü yapmaktayız
        case 1:
            ekranTemizle();
            printf("Sayi Giriniz: ");
            scanf("%d", &sayi);
            ekle(sayi);
            printf("%d sayisi listeye eklendi\n",sayi);
            bekle();
            break;
        case 2:
            ekranTemizle();
            if (ilk == NULL) {
                printf("Liste Bostur. Lutfen eleman ekledikten sonra listeleme yapiniz..\n");
                bekle();
                break;
            }
            listele();
            bekle();
            break;
        case 3:
            ekranTemizle();
            if (ilk == NULL) {
                printf("Liste Bostur. Lutfen eleman ekledikten sonra arama yapiniz..\n");
                bekle();
                break;
            }
            printf("Sayi Giriniz: ");
            scanf("%d", &sayi);
            arama(sayi);
            bekle();
            break;
        case 4:
            ekranTemizle();
            if (ilk == NULL) {
                printf("Liste Bostur. Lutfen eleman ekledikten sonra silme yapiniz..\n");
                bekle();
                break;
            }
            printf("Sayi Giriniz: ");
            scanf("%d", &sayi);
            sil(sayi);
            bekle();
            break;
        case 5:
            ekranTemizle();
            printf("Program Bitti!\n");
            exit(0);
            break;
        default:
            ekranTemizle();
            printf("Hatali Secim\n");
            bekle();
    }
}

void ekranTemizle() {
    //Windows icin
    system("cls");

    //Linux icin
    //system("clear");
}

void bekle() {
    char temp;
    printf("Devam etmek icin Enter'a basiniz!\n"); //klavyeden okuma atlamasinin onune gecmek icin 2 kere yazildi
    temp = getchar();
    temp = getchar();
    ekranTemizle();
}

Veri Yapılarına Dair yazımızı okuyarak genel bilgiye sahip olabilirsiniz.

Yazılarımı okumak isterseniz buraya tıklayınız.

[Toplam: 1   Ortalama: 5/5]
Hatice Nur Kaya

Hatice Nur Kaya {Hatice Nur Kaya}