C
Birleştirme
Tüm parçaları birleştirerek çalışan bir uygulama yazarsın.
Birleştirme
Son derste tüm parçaları birleştirirsin. task_free fonksiyonu, bağlı listenin tüm düğümlerini serbest bırakır. main ise oluşturma, kaydetme, yükleme, yazdırma, sayma ve temizleme adımlarını sırayla yapar.
task_free, listede dolaşır ve her düğümü free ile iade eder; sonunda *list = NULL yapar. main iki görev ekler, dosyaya kaydeder, listeyi serbest bırakır, dosyadan yükler, listeyi yazdırır, yüksek öncelikli sayısını hesaplar ve temizler. Bu, gerçek bir konsol uygulamasının iskeletidir: veri oluştur, kalıcı depola, geri yükle, göster ve temizle. Proje tamamlandığında orta seviye C becerilerin sentezlenmiş olur.
Uygulama Tüm parçaları birleştir
void task_free(Task **list) yaz; listede dolaş, her düğümü free et, *list = NULL yap. main içinde: iki görev ekle, task_save(g_list, "tasks.txt"); çağır, task_free(&g_list); yap, task_load(&g_list, "tasks.txt"); çağır, printf("liste:\n"); yaz, task_print(g_list); çağır, yüksek sayısını yazdır, task_free(&g_list); yap, printf("bitti\n"); yaz.
Örnek çözümü göster
#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;
}
}
typedef int (*TaskFilter)(const Task *);
int is_high_priority(const Task *t) {
return t->priority >= 3;
}
int task_count_if(const Task *list, TaskFilter filter) {
int count = 0;
const Task *cur = list;
while (cur) {
if (filter(cur)) count++;
cur = cur->next;
}
return count;
}
int task_save(const Task *list, const char *path) {
FILE *f = fopen(path, "w");
if (!f) return 0;
const Task *cur = list;
while (cur) {
fprintf(f, "%s %d\n", cur->name, cur->priority);
cur = cur->next;
}
fclose(f);
return 1;
}
int task_load(Task **list, const char *path) {
FILE *f = fopen(path, "r");
if (!f) return 0;
char name[32];
int priority;
while (fscanf(f, "%31s %d", name, &priority) == 2) {
task_push_front(list, task_new(name, priority));
}
fclose(f);
return 1;
}
void task_free(Task **list) {
Task *cur = *list;
while (cur) {
Task *n = cur->next;
free(cur);
cur = n;
}
*list = NULL;
}
int main(void) {
task_push_front(&g_list, task_new("Ödeme", 1));
task_push_front(&g_list, task_new("Paketle", 3));
task_save(g_list, "tasks.txt");
task_free(&g_list);
task_load(&g_list, "tasks.txt");
printf("liste:\n");
task_print(g_list);
int high = task_count_if(g_list, is_high_priority);
printf("yüksek: %d\n", high);
task_free(&g_list);
printf("bitti\n");
return 0;
}
Proje tamamlandı
Tebrikler! Beş derslik görev yöneticisi projesini tamamladın. Bu projede struct, bağlı liste, fonksiyon işaretçisi ve dosya I/O kavramlarını birleştirdin.
Program artık görev oluşturuyor, listeye ekliyor, dosyaya kaydediyor, geri yüklüyor, yazdırıyor, filtreliyor ve belleği temiz bir şekilde serbest bırakıyor. Bu, orta seviye C programcısının bilmesi gereken tüm temel becerileri kapsar. İleri seviyede sistem programlama, çoklu işlem ve çekirdek temelleri seni bekliyor. Sağlam bir temel attın; bundan sonraki adımlar daha derin ve daha güçlü olacak.
Kendini test et
-
task_free ne yapar?
- Listeye yeni görev ekler
- Listedeki tüm düğümleri serbest bırakır
- Listeyi dosyaya kaydeder
- Listeyi yazdırır
Cevabı göster
Listedeki tüm düğümleri serbest bırakır — task_free her düğümü free ile iade eder ve listeyi NULL yapar.
-
Birleştirme adımlarını eşle
- task_push_front
- Görev ekle
- task_save
- Dosyaya kaydet
- task_load
- Dosyadan yükle
- task_free
- Belleği temizle
-
task_free gövdesini tamamla
free(____);
Cevabı göster
free(cur);
Sıradaki ders: Orta seviye bölüm sınavı