c 如何实现类似python的dict
时间: 2024-04-29 17:18:38 浏览: 157
在 C 语言中,可以使用结构体和指针实现类似 Python 的字典(dict)。
具体实现方式为,定义一个结构体作为字典中的元素,该结构体包含两个成员,一个是 key,另一个是 value。同时定义一个指向该结构体的指针数组,用于存储所有元素。
当需要往字典中添加一个元素时,可以先判断该元素的 key 是否已经存在于字典中,如果不存在,则动态分配内存给该元素,并将其添加到指针数组中;如果存在,则更新该元素的 value。
当需要从字典中删除一个元素时,可以根据 key 查找该元素的位置,并将其从指针数组中删除,并释放内存。
当需要访问字典中的某个元素时,可以根据 key 查找该元素,并返回其 value。
以下是一份简单的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义字典元素的结构体
typedef struct {
char *key;
int value;
} DictEntry;
// 定义字典的结构体
typedef struct {
int size;
DictEntry **entries;
} Dict;
// 创建一个新的字典
Dict *dict_new() {
Dict *dict = (Dict *)malloc(sizeof(Dict));
dict->size = 0;
dict->entries = NULL;
return dict;
}
// 销毁一个字典
void dict_free(Dict *dict) {
if (dict == NULL) {
return;
}
for (int i = 0; i < dict->size; i++) {
DictEntry *entry = dict->entries[i];
free(entry->key);
free(entry);
}
free(dict->entries);
free(dict);
}
// 根据 key 查找字典中的元素
DictEntry *dict_find(Dict *dict, char *key) {
for (int i = 0; i < dict->size; i++) {
DictEntry *entry = dict->entries[i];
if (strcmp(entry->key, key) == 0) {
return entry;
}
}
return NULL;
}
// 向字典中添加或更新一个元素
void dict_set(Dict *dict, char *key, int value) {
DictEntry *entry = dict_find(dict, key);
if (entry == NULL) {
// 元素不存在,需要动态分配内存
entry = (DictEntry *)malloc(sizeof(DictEntry));
entry->key = strdup(key);
entry->value = value;
// 将元素添加到指针数组中
dict->size++;
dict->entries = (DictEntry **)realloc(dict->entries, dict->size * sizeof(DictEntry *));
dict->entries[dict->size - 1] = entry;
} else {
// 元素已经存在,直接更新其 value
entry->value = value;
}
}
// 从字典中删除一个元素
void dict_delete(Dict *dict, char *key) {
DictEntry *entry = dict_find(dict, key);
if (entry != NULL) {
// 将元素从指针数组中删除
for (int i = 0; i < dict->size; i++) {
if (dict->entries[i] == entry) {
for (int j = i; j < dict->size - 1; j++) {
dict->entries[j] = dict->entries[j + 1];
}
dict->size--;
break;
}
}
// 释放内存
free(entry->key);
free(entry);
}
}
// 根据 key 访问字典中的某个元素
int dict_get(Dict *dict, char *key) {
DictEntry *entry = dict_find(dict, key);
if (entry != NULL) {
return entry->value;
} else {
return -1; // 表示未找到
}
}
int main() {
// 创建一个新的字典
Dict *dict = dict_new();
// 往字典中添加几个元素
dict_set(dict, "foo", 42);
dict_set(dict, "bar", 69);
// 访问字典中的某个元素
printf("%d\n", dict_get(dict, "foo"));
// 删除字典中的某个元素
dict_delete(dict, "foo");
// 销毁字典
dict_free(dict);
return 0;
}
```
阅读全文