Определение списка и внутреннего словаря в качестве значения словаря в c - PullRequest
0 голосов
/ 27 декабря 2018

Я очень новичок в c языке, и мне очень жаль, если мой вопрос слишком прост.

Я хочу определить словарь в c, в котором у меня есть список в качестве значениямои ключи.Другими словами, мне нравится иметь что-то вроде Python в c:

my_dictionary = {1:{'name':'john','items':['item1','item2']},2:{'name':'bob','items':['item3','item4']}}

Тогда мне нравится иметь доступ к моему определенному словарю, как это: my_item = my_dictionary[1]['items'].

Я знаю, что это очень легко в Python, но для c я не смог найти хороший пример для этого.Я могу определить простые словари, такие как:

typedef struct dict_t_struct {
    char *key;
    void *value;
    struct dict_t_struct *next;
} dict_t;

, и я могу легко добавлять, удалять или распечатывать элементы из этого словаря, используя следующие функции:

dict_t **dictAlloc(void) {
    return malloc(sizeof(dict_t));
}

void dictDealloc(dict_t **dict) {
    free(dict);
}

void *getItem(dict_t *dict, char *key) {
    dict_t *ptr;
    for (ptr = dict; ptr != NULL; ptr = ptr->next) {
        if (strcmp(ptr->key, key) == 0) {
            return ptr->value;
        }
    }

    return NULL;
}

void delItem(dict_t **dict, char *key) {
    dict_t *ptr, *prev;
    for (ptr = *dict, prev = NULL; ptr != NULL; prev = ptr, ptr = ptr->next) {
        if (strcmp(ptr->key, key) == 0) {
            if (ptr->next != NULL) {
                if (prev == NULL) {
                    *dict = ptr->next;
                } else {
                    prev->next = ptr->next;
                }
            } else if (prev != NULL) {
                prev->next = NULL;
            } else {
                *dict = NULL;
            }

            free(ptr->key);
            free(ptr);

            return;
        }
    }

, но проблема в том,что мне нужно иметь связанный список как значения моего словаря и внутренний словарь в моем словаре.

1 Ответ

0 голосов
/ 27 декабря 2018

1 Ваша структура - json, вы не можете использовать обычный словарь полностью

2 Если вам нужно сохранить список, вам нужно определить структуру данных списка.

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

#define DICT_STRING 1
#define DICT_LIST 2

typedef struct list_node {
    void* value;
    struct list_node* next;
} list_node;

typedef struct list {
    list_node* head;
} list;

typedef struct dict_entry {
    int type;
    char* key;
    void* value;
    struct dict_entry* next;
} dict_entry;

typedef struct dict_t {
    dict_entry* head;
} dict_t;

dict_t* dictAlloc(void) {
    dict_t* d = malloc(sizeof(dict_t));
    d->head = NULL;
    return d;
}

void dictDealloc(dict_t* dict) {
    free(dict);
}

dict_entry* addItem(dict_t* dict, int type, char* key, void* value) {
    dict_entry* de = malloc(sizeof(*de));
    de->type = type;
    de->key = key;
    de->value = value;
    de->next = dict->head;
    dict->head = de;
    return de;
}

dict_entry* getItem(dict_t* dict, char* key) {
    dict_entry* de = dict->head;
    while (de) {
        if (strcmp(de->key, key) == 0) {
            return de;
        }

        de = de->next;
    }

    return NULL;
}

int main(int argc, char** argv) {
    dict_t* d = dictAlloc();
    dict_entry* de;

    list* l = malloc(sizeof(*l));
    list_node* n = malloc(sizeof(*n));
    n->value = "value";
    l->head = n;

    addItem(d, DICT_LIST, "key", l);
    de = getItem(d, "key");
    switch (de->type) {
        case DICT_LIST: {
            list* l = de->value;
            printf("%s", l->head->value);
        }
    }
}
...