Listeye ekleme
- C kursu
- Orta seviye
- Ders 71/116
- 5 dk
Bağlı listeye eleman eklemeyi öğrenirsin.
Listeye ekleme
Listeye düğüm eklemenin en kolay yolu başa eklemedir (prepend). Yeni düğüm ayrılır, next'i eski başı gösterir ve yeni düğüm yeni baş olur.
İşlev imzası: Node *list_push_front(Node *head, int value). İçeride Node *n = malloc(sizeof(Node)); n->data = value; n->next = head; return n; yazılır. head başlangıçta NULL ise ilk düğüm eklenir; n->next = NULL olur. Bu yöntem O(1) sürede çalışır; listenin sonunu aramak gerekmez. Çağıran taraf yeni başı head = list_push_front(head, 10); biçiminde geri almalıdır.
Geri dönüş değeri ve baş
Başa ekleme, başın değişmesine neden olur. Bu yüzden fonksiyon yeni başı döndürür ve çağıran onu geri alır. Bu, C'deki deyim: işaretçiyi değere göre geçir.
Çağrı: head = list_push_front(head, 20);. Eğer head'i doğrudan fonksiyona gönderip geri almadan kullanırsan, eski başı kullanmaya devam edersin ve yeni düğüm listeden kopuk kalır. Birden çok ekleme zincirleme yapılabilir: önce head = list_push_front(head, 10);, sonra head = list_push_front(head, 20);. Bu, listeyi 20 -> 10 -> NULL biçiminde kurar. Son eklenen her zaman baştadır.
Uygulama İki düğümlü liste
Node *list_push_front(Node *head, int value) fonksiyonunu yaz: malloc(sizeof(Node)) ile ayır, n->data = value;, n->next = head;, return n;. main'de Node *head = NULL; ile başla, önce 10 sonra 20 ekle. printf("%d %d\n", head->data, head->next->data); ile yazdır. Her iki düğümü free ile iade et.
Başlangıç kodu
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
// list_push_front: başa düğüm ekle, yeni başı döndür
// main: NULL başa 10, sonra 20 ekle; baş ve sonraki data'yı yazdır
int main(void) {
// buraya yaz
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *list_push_front(Node *head, int value) {
Node *n = malloc(sizeof(Node));
n->data = value;
n->next = head;
return n;
}
int main(void) {
Node *head = NULL;
head = list_push_front(head, 10);
head = list_push_front(head, 20);
printf("%d %d\n", head->data, head->next->data);
free(head->next);
free(head);
return 0;
}Beklenen çıktı
20 10
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Yeni düğümün next'i
n->next = ____;
n->next = head;
Açıklama: Yeni düğümün next'i eski başı gösterir.
2 Başa ekleme adımları
| Kavram | Anlamı |
|---|---|
1. adım |
malloc ile ayır |
2. adım |
data'yı ata |
3. adım |
next = head |
4. adım |
return n |
3 list_push_front çağrısından sonra ne yapılmalı?
- head'i NULL yap
- free(head) çağır
- data'yı sil
- head'i geri al Doğru cevap
Açıklama: head = list_push_front(head, x) ile yeni baş geri alınır.