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
#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
#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
task_push_front(&g_list, task_new("____", 3));
task_push_front(&g_list, task_new("Paketle", 3));
Açıklama: task_new("Paketle", 3) yeni bir görev oluşturur.