C programlama öğrenirken "Diziler" (Arrays) konusu genelde kolay başlar ama işin içine diziyi değiştirmek veya pointer ile yönetmek girdiğinde işler biraz karışır.
Kendi öğrenme yolculuğumda (GitHub'da paylaşıyorum: C-Learning-Journey), dizilerin aslında bellekte yan yana duran kutucuklar olduğunu ve Pointer kullanarak bu kutucuklar üzerinde istediğimiz gibi gezinebileceğimizi fark ettiğimde taşlar yerine oturdu.
Bugün, mülakatlarda da sıkça sorulan klasik bir problemi inceleyeceğiz: Bir diziyi tersine çevirmek (Array Reverse).
🤔 Problem Nedir?
Elimizde şöyle bir dizi olsun:
int sayilar[] = {1, 2, 3, 4, 5};
Biz bunu şu hale getirmek istiyoruz:
{5, 4, 3, 2, 1}
Bunu yapmanın "kolay" yolu ikinci bir boş dizi oluşturup elemanları sondan başa doğru oraya kopyalamaktır. Ama ya belleğimiz kısıtlıysa? Ya "In-Place" (Yerinde) yani ekstra dizi kullanmadan yapmamız istenirse?
💡 Çözüm: İki Pointer Tekniği
Burada mantık aslında çok basit bir oyun gibi:
- Sol elini dizinin başına (
start), sağ elini dizinin sonuna (end) koy. - İki elindeki sayıları birbiriyle değiştir (Swap).
- Sol elini bir adım sağa, sağ elini bir adım sola kaydır.
- Eller birbirine değene veya geçene kadar devam et.
İşte yazdığım kod (dizi_ters_cevirme.c):
💻 Kod ve Uygulama
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void) {
int n;
int *dizi;
printf("kac sayi gireceksiniz :");
scanf("%d",&n);
dizi = (int*) malloc(n*sizeof(int));
if (dizi == NULL) {
printf("Malloc failed !");
}
for (int i = 0; i < n; i++) {
printf("%d. sayiyi giriniz :" , i+1);
scanf("%d", &dizi[i]);
}
int temp ;
for (int i = 0; i < n/2; i++) {
temp = dizi[i];
dizi[i] = dizi[n-1-i];
dizi[n-1-i] = temp;
}
printf("sonuc = ");
for (int i = 0; i < n; i++) {
printf("%d ", dizi[i]);
}
free(dizi);
}
Umarım beğenirsiniz :-)
Top comments (0)