Ekleme, Arama, Silme
Temel işlemler
Ekleme, Arama, Silme, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Üç Temel İşlem
Her özet tablosu üç işlemi destekler: ekleme, arama ve silme. İyi bir özet ve makul bir doluluk oranıyla bu üç işlemin ortalama çalışma süresi O(1)'dir.
Zincirleme tabanlı bir tabloyu adım adım oluşturacağız.
Tablo ve Düğüm Türleri
Kopyalanmış bir anahtar dizisi ve tamsayı değer tutan bir düğüm tanımlıyoruz; ayrıca kova dizisini ve kapasitesini tutan bir tablo yapısı tanımlıyoruz.
#include <stdio.h>
typedef struct Node {
char *key;
int value;
struct Node *next;
} Node;
typedef struct {
Node **buckets;
unsigned capacity;
unsigned size;
} HashTable;
int main(void) {
printf("types defined\n");
return 0;
}Tabloyu Oluşturma
Tabloyu ve sıfırlanmış bir kova dizisini calloc ile ayırın; böylece her kova başlangıçta NULL olur.
#include <stdio.h>
#include <stdlib.h>
typedef struct Node { char *key; int value; struct Node *next; } Node;
typedef struct { Node **buckets; unsigned capacity, size; } HashTable;
HashTable *ht_create(unsigned cap) {
HashTable *t = malloc(sizeof *t);
t->buckets = calloc(cap, sizeof(Node *));
t->capacity = cap; t->size = 0;
return t;
}
int main(void) {
HashTable *t = ht_create(16);
printf("capacity=%u size=%u\n", t->capacity, t->size);
return 0;
}Özet Yardımcısı
DJB2'yi yeniden kullanıp sonucunu bir kova dizinine indiriyoruz. Bu yardımcı, üç işlemin tamamında kullanılır.
#include <stdio.h>
unsigned long djb2(const char *s) {
unsigned long h = 5381; int c;
while ((c = (unsigned char)*s++)) h = ((h << 5) + h) + c;
return h;
}
unsigned bucket_of(const char *key, unsigned cap) {
return (unsigned)(djb2(key) % cap);
}
int main(void) {
printf("%u\n", bucket_of("name", 16));
return 0;
}Ekleme: Güncelleme veya Başa Ekleme
Ekleme sırasında önce kovayı arayın. Anahtar varsa değerini güncelleyin. Yoksa yeni bir düğüm ayırın (strdup ile anahtarın kopyasını oluşturarak) ve bunu listenin başına ekleyin.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node { char *key; int value; struct Node *next; } Node;
Node *insert(Node *head, const char *key, int val) {
for (Node *p = head; p; p = p->next)
if (strcmp(p->key, key) == 0) { p->value = val; return head; }
Node *n = malloc(sizeof *n);
n->key = strdup(key); n->value = val; n->next = head;
return n;
}
int main(void) {
Node *b = NULL;
b = insert(b, "a", 1);
b = insert(b, "a", 99); /* update */
printf("%s=%d\n", b->key, b->value);
return 0;
}Arama
Arama işlemi anahtarı özetler, ardından kova listesini dolaşarak anahtarları strcmp ile karşılaştırır. Değerin işaretçisini döndürür (anahtar yoksa NULL döndürür).
#include <stdio.h>
#include <string.h>
typedef struct Node { char *key; int value; struct Node *next; } Node;
int *lookup(Node *head, const char *key) {
for (Node *p = head; p; p = p->next)
if (strcmp(p->key, key) == 0) return &p->value;
return NULL;
}
int main(void) {
Node n2 = {"y", 20, NULL};
Node n1 = {"x", 10, &n2};
int *v = lookup(&n1, "y");
printf("%d\n", v ? *v : -1);
return 0;
}Silme: Listeyi Yeniden Bağlama
Silme işlemi, önceki düğümün işaretçisini tutarak kovayı dolaşır; ardından hedef düğümün çevresindeki bağlantıları yeniden kurar ve düğümü (hem kopyalanmış anahtarı hem de düğümün kendisini) serbest bırakır.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node { char *key; int value; struct Node *next; } Node;
Node *delete_key(Node *head, const char *key) {
Node *prev = NULL, *cur = head;
while (cur) {
if (strcmp(cur->key, key) == 0) {
if (prev) prev->next = cur->next; else head = cur->next;
free(cur->key); free(cur);
return head;
}
prev = cur; cur = cur->next;
}
return head;
}
int main(void) {
Node *b = malloc(sizeof *b);
b->key = strdup("a"); b->value = 1; b->next = NULL;
b = delete_key(b, "a");
printf("%s\n", b ? "left" : "empty");
return 0;
}Hepsini Birleştirme
Tam bir tablo, önce kovayı hesaplayıp ardından liste yardımcılarına devrederek bu işlemleri kapsar. Burada çalışan eksiksiz bir mini tablo bulunmaktadır.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node { char *key; int value; struct Node *next; } Node;
unsigned long djb2(const char *s){unsigned long h=5381;int c;while((c=(unsigned char)*s++))h=((h<<5)+h)+c;return h;}
#define CAP 16
Node *table[CAP];
void put(const char *k, int v) {
unsigned i = djb2(k) % CAP;
Node *n = malloc(sizeof *n);
n->key = strdup(k); n->value = v; n->next = table[i];
table[i] = n;
}
int get(const char *k) {
for (Node *p = table[djb2(k) % CAP]; p; p = p->next)
if (!strcmp(p->key, k)) return p->value;
return -1;
}
int main(void) {
put("age", 30); put("score", 95);
printf("age=%d score=%d\n", get("age"), get("score"));
return 0;
}Anahtarı Neden Kopyalamalıyız
Anahtarları strdup ile saklarız; böylece tablo kendi kopyasına sahip olur. Çağıranın işaretçisini saklasaydık anahtar, biz kullanırken değiştirilebilir veya serbest bırakılabilirdi; bu da aramaları bozardı.
Bu nedenle silme işlemi kopyalanmış anahtarı free ile serbest bırakmalıdır.
Zaman Karmaşıklığı
Tekdüze bir özet ve 0.75 civarında tutulan bir doluluk oranıyla:
- Ekleme: ortalama O(1)
- Arama: ortalama O(1)
- Silme: ortalama O(1)
En kötü durum, tüm anahtarların tek bir kovada çakışmasıyla O(n)'dir.
Tablonun Tamamını Serbest Bırakma
Bellek sızıntılarını önlemek için her kovadaki tüm düğümleri, ardından kova dizisini ve son olarak tablo yapısını serbest bırakın.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node { char *key; int value; struct Node *next; } Node;
void free_bucket(Node *head) {
while (head) { Node *nx = head->next; free(head->key); free(head); head = nx; }
}
int main(void) {
Node *b = malloc(sizeof *b);
b->key = strdup("k"); b->value = 1; b->next = NULL;
free_bucket(b);
printf("freed\n");
return 0;
}Kısa Kontrol
Temel işlemler hakkındaki anlayışınızı sınayın.
Özet
Üç temel özet tablosu işlemini zincirleme yöntemiyle uyguladınız.
- Ekleme, bir düğümü günceller veya listenin başına ekler
- Arama, kova listesini
strcmpile dolaşır - Silme, bağlantıları yeniden kurar ve hem anahtarı hem düğümü serbest bırakır
strdupile anahtarlarınızın sahibi olun ve sonlandırma sırasında her şeyi serbest bırakın
Sıkça Sorulan Sorular
“Ekleme, Arama, Silme” dersi ücretsiz mi?
Evet — “Ekleme, Arama, Silme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Ekleme, Arama, Silme” dersinde ne öğreneceğim?
Temel işlemler C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Ekleme, Arama, Silme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Özetleme İşlevleri
- Çakışma İşleme
- Ekleme, Arama, Silme
- Yeniden Boyutlandırma ve Doluluk Oranı