CodeBlanks Logo Icon CodeBlanks

Veri modeli

  • C kursu
  • Orta seviye
  • Ders 113/116
  • 6 dk

Struct ve bağlı liste ile veri modelini kurarsın.

Görev oluşturma

İkinci ders, görev oluşturma ve listeye ekleme fonksiyonlarını tanımlar. task_new, dinamik bellek ile yeni bir görev yaratır; task_push_front, listeye baştan ekler.

task_new, malloc ile bellek ayırır, strncpy ile adı kopyalar ve next'i NULL yapar. task_push_front, yeni düğümü g_list'in başına koyar. task_print, listeyi baştan sona gezer ve her görevi yazdırır. Bu üç fonksiyon, bağlı listenin temel işlem kümesidir: oluştur, ekle, göster. Önceki dersin iskeleti bu dersin başlangıç koduna dahildir.

Bağa ekleme

task_push_front, yeni düğümü listenin başına koyar. Bu, bağlı listeye eklemenin en hızlı yoludur; çünkü baş işaretçisi zaten elimizdedir.

Uygulama: t->next = *list; *list = t;. Önce yeni düğümün next'i eski başı gösterir; sonra baş, yeni düğüme bağlanır. İki adımda ekleme tamamlanır. Listeye iki görev eklersen, ikinci eklenen başa gelir; bu yüzden yazdırma sırası eklemenin tersidir. Bu davranış, yığın (stack) veri yapısının da temelidir; son giren first çıkar (LIFO).

Uygulama Görev oluşturma ve listeleme

Task *task_new(const char *name, int priority) fonksiyonunu yaz; malloc ile bellek ayır, strncpy ile adı kopyala. void task_push_front(Task **list, Task *t) yaz; başa ekle. void task_print(const Task *list) yaz; listede dolaş ve yazdır. main içinde task_push_front(&g_list, task_new("Ödeme", 1)); ve task_push_front(&g_list, task_new("Paketle", 3)); ekle, task_print(g_list); çağır.

Başlangıç kodu

main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Task {
    char name[32];
    int priority;
    struct Task *next;
} Task;

Task *g_list = NULL;

// task_new fonksiyonunu yaz
// task_push_front fonksiyonunu yaz
// task_print fonksiyonunu yaz
// main'de iki görev ekle ve yazdır

int main(void) {
    printf("Görev yöneticisi hazır\n");
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Task {
    char name[32];
    int priority;
    struct Task *next;
} Task;

Task *g_list = NULL;

Task *task_new(const char *name, int priority) {
    Task *t = malloc(sizeof(Task));
    strncpy(t->name, name, 31);
    t->name[31] = '\0';
    t->priority = priority;
    t->next = NULL;
    return t;
}

void task_push_front(Task **list, Task *t) {
    t->next = *list;
    *list = t;
}

void task_print(const Task *list) {
    const Task *cur = list;
    while (cur) {
        printf("%s: %d\n", cur->name, cur->priority);
        cur = cur->next;
    }
}

int main(void) {
    task_push_front(&g_list, task_new("Ödeme", 1));
    task_push_front(&g_list, task_new("Paketle", 3));
    task_print(g_list);
    return 0;
}

Beklenen çıktı

Paketle: 3
Ödeme: 1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Fonksiyonları amacına eşle

Kavram Anlamı
task_new Yeni görev
task_push_front Başa ekle
task_print Listeyi yazdır
malloc Bellek ayır

2 İki görev başa eklenirse yazdırma sırası ne olur?

  • Yalnızca son görev
  • Rastgele
  • Ekleme sırasıyla aynı
  • Eklemenin tersi Doğru cevap

Açıklama: Başa ekleme LIFO'dur; son eklenen ilk yazdırılır.

3 task_new çağrısını tamamla

Soru
task_push_front(&g_list, task_new("____", 3));
Cevap
task_push_front(&g_list, task_new("Paketle", 3));

Açıklama: task_new("Paketle", 3) yeni bir görev oluşturur.

Orta seviye bölümündeki tüm dersler