C'de Linked List: Sıfırdan Veri Yapısı Kurma

Linked list, verileri dinamik olarak depolayan ve bellekte ardışık olmayan düğümlerden oluşan temel bir veri yapısıdır. Her düğüm bir veri ve bir sonraki düğüme işaret eden pointer içerir. C'de bu yapıyı sıfırdan kurmak hem bellek yönetimini hem de pointer mantığını anlamak için iyi bir alıştırmadır.

Öncelikle bir düğüm (node) yapısı tanımla. Her düğüm bir tam sayı ve bir sonraki düğüme işaret eden pointer tutacak. Ardından ekleme, silme ve liste yazdırma işlevlerini yaz.

1 <stdio.h>
2 <stdlib.h>
3
4struct Node {
5int data;
6struct Node* next;
7};
8
9typedef struct Node Node;
10
11// Yeni düğüm oluştur
12Node* createNode(int data) {
13Node* newNode = (Node*)malloc(sizeof(Node));
14newNode->data = data;
15newNode->next = NULL;
16return newNode;
17}
18
19// Listenin başına eleman ekle
20Node* insertAtBegin(Node* head, int data) {
21Node* newNode = createNode(data);
22newNode->next = head;
23return newNode;
24}
25
26// Listenin sonuna eleman ekle
27Node* insertAtEnd(Node* head, int data) {
28Node* newNode = createNode(data);
29if (head == NULL) return newNode;
30
31Node* temp = head;
32while (temp->next!= NULL) {
33temp = temp->next;
34}
35temp->next = newNode;
36return head;
37}
38
39// Listeyi yazdır
40void displayList(Node* head) {
41Node* temp = head;
42while (temp!= NULL) {
43printf("%d -> ", temp->data);
44temp = temp->next;
45}
46printf("NULL\n");
47}
48
49// Belleği temizle
50void freeList(Node* head) {
51while (head!= NULL) {
52Node* temp = head;
53head = head->next;
54free(temp);
55}
56}
57
58int main() {
59Node* head = NULL;
60
61head = insertAtEnd(head, 10);
62head = insertAtEnd(head, 20);
63head = insertAtEnd(head, 30);
64head = insertAtBegin(head, 5);
65
66displayList(head);
67
68freeList(head);
69return 0;
70}

Beklenen Çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
15 -> 10 -> 20 -> 30 -> NULL

Kodda `malloc()` ile dinamik bellek ayırıyoruz. `createNode()` yeni bir düğüm oluşturup başlatır. `insertAtBegin()` başa, `insertAtEnd()` sona eleman ekler. `displayList()` tüm listeyi gezip yazdırır. En önemli nokta: her `malloc()` için mutlaka `free()` çağrı; aksi halde bellek sızıntısı oluşur. `freeList()` programdan çıkmadan önce tüm düğümleri serbest bırakır.

Sık yapılan hata: NULL pointer kontrolü atlamak. Boş listeye eleman eklerken `head == NULL` durumunu mutlaka kontrol et, yoksa segmentation fault alırsın.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz