C
Veri modeli
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.
Ö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;
}
}
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;
}
Kendini test et
-
Fonksiyonları amacına eşle
- task_new
- Yeni görev
- task_push_front
- Başa ekle
- task_print
- Listeyi yazdır
- malloc
- Bellek ayır
-
İ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
Cevabı göster
Eklemenin tersi — Başa ekleme LIFO'dur; son eklenen ilk yazdırılır.
-
task_new çağrısını tamamla
task_push_front(&g_list, task_new("____", 3));
Cevabı göster
task_push_front(&g_list, task_new("Paketle", 3));
Sıradaki ders: Fonksiyonel mantık