Intrusive List: Kendi Container'ınıza Bağlı Yapılar Ekleme

Intrusive list, bir veri yapısının içine liste düğümünü doğrudan gömme tekniğidir. Klasik bağlı liste her eleman için ayrı bir düğüm nesnesi oluştururken, intrusive list'te düğüm verinin kendisinin parçasıdır. Bu sayede bellek parçalanması azalır ve cache vurma oranı artar.

Sorun şöyle: standart bir bağlı listede, her öğe için heap'ten ayrı bellek tahsis edersiniz. Verinin kendisi bir yerde, düğümün next/prev işaretçileri başka yerde bulunur. Bu pointer indirlemesi ve bellek sıçramaları performansı düşürür. Intrusive list'te ise düğümün tüm bilgisi (next, prev) doğrudan veri yapısının içinde yer alır.

Burada pratik bir örnek: bir oyun karakteri listesini yönetiyorsunuz. Her karakterin sağlığı, konumu ve liste düğümü bilgisi aynı bellek bloğunda.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1#include <stdio.h>
2#include <stdlib.h>
3
4typedef struct {
5int id;
6int health;
7struct node *next;
8struct node *prev;
9} Character;
10
11typedef struct {
12Character *head;
13Character *tail;
14} CharacterList;
15
16CharacterList* create_list() {
17CharacterList *list = malloc(sizeof(CharacterList));
18list->head = NULL;
19list->tail = NULL;
20return list;
21}
22
23void add_character(CharacterList *list, int id, int health) {
24Character *ch = malloc(sizeof(Character));
25ch->id = id;
26ch->health = health;
27ch->next = NULL;
28ch->prev = list->tail;
29
30if (list->tail) {
31list->tail->next = ch;
32} else {
33list->head = ch;
34}
35list->tail = ch;
36}
37
38void print_list(CharacterList *list) {
39for (Character *ch = list->head; ch; ch = ch->next) {
40printf("Karakter %d - Saglik: %d\n", ch->id, ch->health);
41}
42}
43
44void remove_character(CharacterList *list, Character *ch) {
45if (ch->prev) ch->prev->next = ch->next;
46else list->head = ch->next;
47
48if (ch->next) ch->next->prev = ch->prev;
49else list->tail = ch->prev;
50
51free(ch);
52}
53
54int main() {
55CharacterList *list = create_list();
56add_character(list, 1, 100);
57add_character(list, 2, 80);
58add_character(list, 3, 120);
59
60print_list(list);
61
62return 0;
63}

Beklenen çıktı:

1Karakter 1 - Saglik: 100
2Karakter 2 - Saglik: 80
3Karakter 3 - Saglik: 120

Burada Character yapısı kendi düğüm bilgisini (next, prev) taşır. Listeye eklediğinizde, ayrı bir düğüm nesnesi oluşturmanız gerekmez. Bellek daha kompakt ve erişim daha hızlı olur.

Sık yapılan hata: düğüm işaretçilerini yönetirken NULL kontrolü atlamak. Özellikle remove işleminde head ve tail durumlarını iyi kontrol etmelisiniz. Aksi takdirde dangling pointer'larla karşılaşırsınız.

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