21xrx.com
2024-09-20 06:08:13 Friday
登录
文章检索 我的文章 写文章
C语言实现字典数据结构
2023-06-17 21:08:14 深夜i     --     --
C语言 数据结构 字典

C语言作为一种广泛使用的编程语言,常用于实现各种数据结构。其中,字典数据结构也是很常见的一种。字典数据结构可以用于存储键值对数据,通过键(key)来快速查询对应的值(value)。本文章将介绍如何使用C语言实现字典数据结构。首先,我们需要定义一个结构体来表示键值对。


typedef struct {

  char *key;

  void *value;

} DictEntry;

在结构体中,我们定义了两个成员变量:key和value。key保存了键的值,value保存了对应的值。这里,key的类型为字符指针(char *),value的类型为void指针(void *)。这是因为我们希望字典数据结构可以存储任意类型的值。同时,我们还定义了一个DictEntry类型的结构体,用于表示键值对数据。接下来,我们定义一个字典数据结构,以存储多个键值对。


typedef struct {

  int size;

  int capacity;

  DictEntry *entries;

} Dict;

在字典数据结构中,我们定义了三个成员变量:size、capacity和entries。size表示当前字典中存储的键值对数量;capacity表示字典中最多可以存储的键值对数量;entries是一个DictEntry类型的数组,用于保存所有的键值对数据。字典数据结构的初始化函数可以定义如下。


void dict_init(Dict *dict, int capacity) {

  dict->size = 0;

  dict->capacity = capacity;

  dict->entries = calloc(capacity, sizeof(DictEntry));

}

在初始化函数中,我们使用calloc函数来分配一块内存,用于保存字典中所有键值对。我们同时将字典的大小(size)设置为0,容量(capacity)设置为传入的capacity值。接下来,我们可以实现一个函数,用于向字典中添加一个键值对。


void dict_set(Dict *dict, char *key, void *value) {

  int i;

  // 查找键是否已经存在,若存在则更新value

  for (i = 0; i < dict->size; i++) {

    if (strcmp(dict->entries[i].key, key) == 0) {

      dict->entries[i].value = value;

      return;

    }

  }

  // 若字典已满,则扩容一倍

  if (dict->size == dict->capacity) {

    dict->capacity *= 2;

    dict->entries = realloc(dict->entries, dict->capacity * sizeof(DictEntry));

  }

  // 否则,在字典末尾添加新的键值对

  dict->entries[dict->size].key = strdup(key);

  dict->entries[dict->size].value = value;

  dict->size++;

}

在添加键值对时,我们首先查找字典中是否已经存在相同的键。如果存在,则更新对应的值;如果不存在,则添加新的键值对。同时,如果字典已经满了,则通过realloc函数将字典的容量扩大一倍。最后,我们还需要实现一个函数,用于通过键获取对应的值。


void *dict_get(Dict *dict, char *key) {

  int i;

  for (i = 0; i < dict->size; i++) {

    if (strcmp(dict->entries[i].key, key) == 0) {

      return dict->entries[i].value;

    }

  }

  return NULL;

}

通过遍历字典中所有的键值对,我们可以在字典中查询是否存在获得对应键的值。如果找到了对应的键,则返回对应的值;否则,返回NULL。至此,我们使用C语言实现了字典数据结构。该数据结构可以存储任意类型的键值对数据,并且可以通过键快速查询对应的值。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复