C Dilinde Veri Yapıları Günümüzde, veri yapısı dediğimiz şey, bilgisayar biliminde önemli bir konudur. Veri yapısı, bize verilerimizi düzenleme, saklama ve erişim imkanı sağlar. Veri yapıları, belirli programlama dillerinde kullanılır. Bu yazıda, C Dilinde Veri Yapılarından bahsedeceğiz. Diziler, yığınlar ve bağlı listeler, C programlama dilinde kullanılan en popüler veri yapılarıdır.
C Dilinde Veri Yapıları: Diziler
Dizi, aynı türdeki elemanların sıralı bir şekilde saklandığı bir veri yapısıdır. Her elemanı bir indeks numarasıyla belirtilir. C programlama dilinde diziler, verileri düzenlemek ve gruplamak için sıklıkla kullanılır. Diziler sabit boyutludur, bu nedenle eleman sayısı önceden belirlenir. Diziler, belirli bir boyutta hafıza kullanımı sağlar. İlk elemanın indeksi sıfırdır ve son elemanın indeksi, dizi boyutundan bir eksiğidir.
Aşağıdaki örnekte, 3 elemanlı bir dizi tanımlanmıştır:
int dizi[3] = {5, 10, 15};
Dizinin elemanlarına erişmek için, indeks numarasını kullanabiliriz:
printf("%d", dizi[0]); // Çıktı: 5
printf("%d", dizi[1]); // Çıktı: 10
printf("%d", dizi[2]); // Çıktı: 15
C Dilinde Veri Yapıları: Yığınlar
C Dilinde Veri Yapıları: Yığınlar; Yığın, elemanların son giren ilk çıkar (LIFO) prensibiyle düzenlenen bir veri yapısıdır. Yığınlar, verilerin arka arkaya eklenmesi ve çıkarılması gerektiğinde kullanışlıdır. Yığınların temel işlevi, belirli bir sıraya göre depolanan verilere erişimdir.
Yığınlar C programlama dilinde bir dizi kullanılarak oluşturulabilir. Yığının üst elemanına erişmek için, en son eklenen elemanın indeksi kullanılır. Yığına eleman eklemek için, yığının üstüne eleman eklenir. Yığından eleman çıkarmak için, yığının üstünden eleman çıkarılır.
Aşağıdaki örnekte, 3 elemanlı bir yığın tanımlanmıştır:
#define MAX_BOYUT 3 // yığının boyutu
int yigin[MAX_BOYUT]; // yığın tanımlaması
int ust = -1; // yığının en üst elemanının indeksi
void eleman_ekle(int eleman){
if(ust >= MAX_BOYUT-1){ // yığın dolu
printf("Yigin dolu.");
}
else{
ust++;
yigin[ust] = eleman;
}
}
int eleman_cikar(){
if(ust < 0){ // yığın boş
printf("Yigin bos.");
return -1;
}
else{
int eleman = yigin[ust];
ust--;
return eleman;
}
}
int main(){
eleman_ekle(5);
eleman_ekle(10);
eleman_ekle(15);
return 0;
}
Yukarıdaki kodda, öncelikle yığının boyutu MAX_BOYUT sabiti ile belirlenir ve yığın tanımlaması int yigin[MAX_BOYUT] şeklinde yapılır. Yığının en üst elemanının indeksi ust değişkeniyle takip edilir. Eleman ekleme işlemi, eleman_ekle() fonksiyonu kullanılarak gerçekleştirilir. Yığının doluluk durumu kontrol edildikten sonra, yığının en üst elemanının indeksi ust bir artırılır ve yeni eleman yığının en üstüne eklenir. Eleman çıkarma işlemi, eleman_cikar() fonksiyonu kullanılarak gerçekleştirilir. Yığının boş olup olmadığı kontrol edildikten sonra, yığının en üstündeki eleman alınır ve yığının en üst elemanının indeksi ust bir azaltılır.
C Dilinde Veri Yapıları: Bağlı liste
C Dilinde Veri Yapıları: Bağlı liste; C dilinde sıklıkla kullanılan bir veri yapısıdır. Bağlı liste, bir dizi gibi ardışık bellek bölgelerine sahip değildir. Bunun yerine, her düğüm (node) adı verilen bir yapı, verileri tutan bir alan ve bir sonraki düğümün adresini tutan bir işaretçi (pointer) içerir. Bu sayede, bağlı liste elemanları rastgele bellek adreslerinde saklanabilir ve istenildiği zaman bağlantılar sayesinde bir araya getirilebilir.
Örnek olarak, aşağıda tek yönlü bağlı liste ile 5 elemanlı bir liste tanımlanmıştır. Bu liste, integer (tam sayı) veri türünden elemanlar içermektedir.
#include <stdio.h>
#include <stdlib.h>
struct dugum{
int veri;
struct dugum *sonraki;
};
struct dugum *baslangic = NULL; // bağlı listenin başlangıç düğümü
void eleman_ekle(int veri){
struct dugum *yeni_dugum = (struct dugum*)malloc(sizeof(struct dugum));
yeni_dugum->veri = veri;
yeni_dugum->sonraki = NULL;
if(baslangic == NULL){ // liste boş
baslangic = yeni_dugum;
}
else{ // listenin sonuna ekle
struct dugum *gecici = baslangic;
while(gecici->sonraki != NULL){
gecici = gecici->sonraki;
}
gecici->sonraki = yeni_dugum;
}
}
void liste_yazdir(){
struct dugum *gecici = baslangic;
while(gecici != NULL){
printf("%d -> ", gecici->veri);
gecici = gecici->sonraki;
}
printf("NULL\n");
}
int main(){
eleman_ekle(5);
eleman_ekle(10);
eleman_ekle(15);
eleman_ekle(20);
eleman_ekle(25);
liste_yazdir();
return 0;
}
Yukarıdaki kodda, öncelikle struct dugum yapısı tanımlanır. Bu yapı, int tipinde bir veri alanı ve bir sonraki düğümün adresini tutan *sonraki işaretçisi içerir. Bağlı listenin başlangıç düğümü, struct dugum *baslangic işaretçisiyle tanımlanır. Eleman ekleme işlemi, eleman_ekle() fonksiyonu kullanılarak gerçekleştirilir. Öncelikle, yeni bir düğüm oluşturulur ve veri veri alanına kaydedilir. Daha sonra, bu düğüm listenin sonuna eklenir. Eğer listenin başlangıç düğümü boşsa, yeni düğüm başlangıç düğümü olarak atanır. Eğer listenin başlangıç kısmı dolu ise o verinin arkasına eklenir ve başlangıç verisinin next’ini eklenen veriye atar ve eklenen verinin next’ini de NULL değerine atanır.