Код написан на C. У меня есть два типа объектов (structs
), которые имеют отношение родитель-потомок, один родительский тип может иметь 0
или более дочерних типов, дочерний элемент не может иметь своих собственных дочерних элементов. Мне нужен O(1)
родительский поиск (по uID
члену структуры) и дочерний поиск (также по uID
члену структуры), не зная, кто его родитель. Как только у меня есть указатель на родителя, я хочу иметь возможность перебирать его дочерние элементы. И когда у меня есть указатель на дочерний элемент, я хочу знать, кто его родитель. Во время выполнения программы любой потомок или любой родитель может быть удален или вставлен, а потомок может изменить своего родителя. Когда родитель удаляется, его дети также должны быть удалены. И все это должно быть сделано в многопоточной среде, поэтому мне нужно потокобезопасное чтение (я буду использовать блокировку только для чтения для поиска ключа и блокировку чтения-записи для вставки/удаления/повторного родителя). Какую структуру данных вы бы порекомендовали?
Добавлен:
В настоящее время я пытаюсь реализовать его с помощью библиотеки uthash ( http://uthash.sourceforge.net/):
struct parent
{
uint64_t uid;
time_t mtime;
struct ldata data;
struct child *first_child;
UT_hash_handle hh;
};
struct child
{
uint64_t uid;
time_t mtime;
struct ldata data;
struct parent *parent;
UT_hash_handle hh;
};
struct parent *parents_list = NULL;
struct child *children_list = NULL;
Проблема в том, что когда появляется новый ребенок, он оказывается в хвосте и не связан со своими «братьями».