C:
การใช้แอเรย์สมาชิก

วิธีการ:

ภาษา C ไม่มีการสนับสนุนอาร์เรย์แบบผูกพันอย่างในตัวเหมือนภาษาระดับสูงอื่นๆ แต่คุณสามารถจำลองได้โดยใช้โครงสร้างและการแฮช ด้านล่างเป็นตัวอย่างง่ายๆ โดยใช้การรวมกันของ struct และฟังก์ชันแฮชที่ง่ายเพื่อสร้างอาร์เรย์แบบผูกพันสำหรับการจัดเก็บและเข้าถึงเลขจำนวนเต็มโดยใช้คีย์แบบสตริง

ก่อนอื่น, กำหนดโครงสร้างเพื่อแทนคู่คีย์-ค่าหนึ่งคู่และอีกอันหนึ่งเพื่อแทนอาร์เรย์แบบผูกพันเอง:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABLE_SIZE 128

typedef struct {
    char* key;
    int value;
} KeyValuePair;

typedef struct {
    KeyValuePair* items[TABLE_SIZE];
} AssocArray;

unsigned int hash(char* key) {
    unsigned long int value = 0;
    unsigned int i = 0;
    unsigned int key_len = strlen(key);

    for (; i < key_len; ++i) {
        value = value * 37 + key[i];
    }

    value = value % TABLE_SIZE;

    return value;
}

void initArray(AssocArray* array) {
    for (int i = 0; i < TABLE_SIZE; ++i) {
        array->items[i] = NULL;
    }
}

void insert(AssocArray* array, char* key, int value) {
    unsigned int slot = hash(key);

    KeyValuePair* item = (KeyValuePair*)malloc(sizeof(KeyValuePair));
    item->key = strdup(key);
    item->value = value;

    array->items[slot] = item;
}

int find(AssocArray* array, char* key) {
    unsigned int slot = hash(key);

    if (array->items[slot]) {
        return array->items[slot]->value;
    }
    return -1;
}

int main() {
    AssocArray a;
    initArray(&a);

    insert(&a, "key1", 1);
    insert(&a, "key2", 2);

    printf("%d\n", find(&a, "key1")); // ผลลัพธ์: 1
    printf("%d\n", find(&a, "key2")); // ผลลัพธ์: 2

    return 0;
}

ตัวอย่างนี้สาธิตการดำเนินการพื้นฐาน: เริ่มต้นอาร์เรย์แบบผูกพัน, การแทรกคู่คีย์-ค่า, และหาค่าโดยใช้คีย์ โปรดทราบว่าโค้ดนี้ขาดการจัดการการชนกันและมีจุดประสงค์เพื่อการศึกษา

ศึกษาลึกซึ้ง

แนวคิดของอาร์เรย์แบบผูกพันมีมาก่อนภาษา C, แต่ลักษณะที่เป็นภาษาระดับต่ำของมันไม่ให้การสนับสนุนโดยตรงเป็นประเภทในตัว นี่ทำให้เกิดการเข้าใจลึกซึ้งยิ่งขึ้นเกี่ยวกับโครงสร้างข้อมูลและอัลกอริทึม รวมถึงกลไกแฮชสำหรับการแมปคีย์-ค่าอย่างมีประสิทธิภาพ หลายไลบรารีและเฟรมเวิร์กของภาษา C นำเสนอวิธีการที่สมบูรณ์ยิ่งขึ้นสำหรับการสร้างอาร์เรย์แบบผูกพัน เช่น GHashTable ของ GLib ซึ่งให้การสนับสนุนการจัดการการชนกัน, การปรับขนาดไดนามิก, และสนับสนุนประเภทคีย์และค่าที่หลากหลาย

แม้ว่าการสร้างอาร์เรย์แบบผูกพันด้วยตัวเองในภาษา C อาจดูเหมือนลำบากเมื่อเปรียบเทียบกับภาษาที่มีการสนับสนุนในตัว แต่สิ่งนี้ให้ความเข้าใจอย่างลึกซึ้งเกี่ยวกับกลไกภายในของโครงสร้างข้อมูล ช่วยให้นักโปรแกรมเมอร์มีทักษะทางการแก้ปัญหาและการปรับปรุงประสิทธิภาพที่ดียิ่งขึ้น อย่างไรก็ดี, สำหรับโค้ดการผลิตหรือโปรแกรมที่ซับซ้อนมากขึ้น, การใช้ไลบรารีที่มีอยู่เช่น GLib มักเป็นวิธีที่ปฏิบัติและประหยัดเวลามากขึ้น