У меня есть
struct Species{
int sid;
struct Species *next;
struct Population *population_root;
struct Species *lc;
struct Species *rc;
};
struct Population{
int gid;
int sid;
int cid;
struct Population *parent;
struct Population *lc;
struct Population *rc;
};
А также
struct Species *Species_root; // Pointer to the root of Species' tree
Дерево видов готово. Я должен сделать: найти данный sid
в дереве видов (я это сделал), и когда вы его найдете, вставить новый тип узла struct Population
в дерево видов. Я не знаю, как перевести в код ту часть, которая гласит: «и вставить новый узел в дерево видов». Я знаю, как вставить узел в BST, но это своего рода деревья наследования или что-то в этом роде, и я никогда не работал с ними. .
Я думаю о том, чтобы сделать что-то вроде:
struct Species *spe=Species_root;
if(spe==NULL) return 0;
spe=search(spe,sid); //return the node with the sid we want
struct Population *pop=newNodePop(gid,cid); //adds the node
pop->parent=spe->population_root;
spe->population_root=pop;
Но последние две строки не работают. Какие-либо предложения?
1 ответ
Поскольку у вас есть указатель типа struct population
внутри struct species
, это делается следующим образом:
return_type some_function(int sid_argument) //dummy function where the data which is to be matched with sid is passed & population node is then inserted to that species NODE
{
struct species *ptr =NULL;
ptr = traverse(species_tree_root,sid_argument); //if sid is found then traverse returns a pointer to that node in that species tree else returns NULL
if(ptr)
{
struct population *population_ptr=malloc(sizeof(*population_ptr));
if(population_ptr)
ptr->population_root = population_ptr;
else
exit(1);
}
}
Что делает ваш код:
pop->parent=spe->population_root;
spe->population_root=pop;
Поскольку НОВЫЙ узел популяции должен быть добавлен, если sid найден в species, можно с уверенностью предположить, что это другое дерево типа population
требуется создать внутри ЭТОГО struct species
node - так что это INSERTion, который требуется в этом spe->population_root
- но скажите, что (spe->population_root
) не указывает на какую-либо действительную память в это время, а затем назначается pop->parent
тогда он создает и ошибка - лучше присвоить ему какое-то допустимое значение (изменив порядок последних двух операторов).
Пожалуйста, измените порядок вышеупомянутых утверждений, проверьте правильность pop
, а затем уточните, что вы подразумеваете под не работает - я предположил несколько вещей, поскольку вопрос не очень ясен.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
sid
ключом сортировки дляSpecies
. Вы также не указываете ключ сортировки для населения BST.Species
также имеет это полеnext
. Для чего это ?