CodeBlanks Logo Icon CodeBlanks

Listeyi gezme

  • C kursu
  • Orta seviye
  • Ders 72/116
  • 5 dk

Bağlı listeyi döngüyle gezmeyi öğrenirsin.

Listeyi gezme

Bir listeyi gezmek, baştan sona her düğümü sırayla ziyaret etmektir. Bir imleç (cursor) değişkeni baştan başlar ve her adımda bir ilerler.

Örnek: Node *cur = head; while (cur != NULL) { printf("%d ", cur->data); cur = cur->next; }. cur != NULL koşulu, listenin sonuna geldiğimizde döngüyü durdurur. cur = cur->next adımı imleci bir sonraki düğüme taşır. Bu döngü O(n) sürede çalışır; n listedeki düğüm sayısıdır. Gezerken düğümleri değiştirmez, yalnızca okuruz.

list_print işlevi

Gezme, listeyi yazdıran bir list_print işlevine dönüşür. İşlev, başı alır ve her düğümün data alanını yazdırır.

Tanım: void list_print(Node *head) { Node *cur = head; while (cur != NULL) { printf("%d ", cur->data); cur = cur->next; } printf("\n"); }. Her değerden sonra boşluk bırakılır; döngü bitince yeni satır yazılır. Bu, çıktının düzenli görünmesini sağlar. İşlev void döndürür çünkü bir şey hesaplamaz, yalnızca yazdırır. Listede hiç düğüm yoksa (head == NULL) döngü hiç dönmez ve yalnızca yeni satır yazılır.

Uygulama list_print ile yazdır

void list_print(Node *head) yaz: Node *cur = head; ile başla, while (cur != NULL) döngüsünde printf("%d ", cur->data); ve cur = cur->next; yap, döngü sonunda printf("\n");. main'de 30, 20, 10 değerlerini başa ekle, list_print(head); çağır, sonra tüm düğümleri free et.

Başlangıç kodu

main.c
#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;
}

// list_print: while döngüsüyle her düğümün datasını yazdır, sonunda newline
// main: 30, 20, 10 ekle (başa), list_print çağır, tüm düğümleri free et

int main(void) {
    // buraya yaz
    return 0;
}

Örnek çözüm

main.c
#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;
}

void list_print(Node *head) {
    Node *cur = head;
    while (cur != NULL) {
        printf("%d ", cur->data);
        cur = cur->next;
    }
    printf("\n");
}

int main(void) {
    Node *head = NULL;
    head = list_push_front(head, 30);
    head = list_push_front(head, 20);
    head = list_push_front(head, 10);
    list_print(head);
    while (head) { Node *t = head; head = head->next; free(t); }
    return 0;
}

Beklenen çıktı

10 20 30

Soru ve cevaplar

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

1 Gezme deyimleri

Kavram Anlamı
cur = head imleci başlat
cur != NULL döngü koşulu
cur->data değeri oku
cur = cur->next bir ilerle

2 while (cur != NULL) döngüsü ne zaman durur?

  • cur NULL olduğunda Doğru cevap
  • cur head olduğunda
  • data 0 olduğunda
  • next NULL olmadığında

Açıklama: cur NULL olduğunda listenin sonuna gelinmiş olur.

3 İmleci ilerlet

Soru
cur = cur->____;
Cevap
cur = cur->next;

Açıklama: cur->next imleci bir sonraki düğüme taşır.

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