У меня есть

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;

Но последние две строки не работают. Какие-либо предложения?

0
Thanos 5 Дек 2019 в 15:11
Непонятно, каков ожидаемый результат. Можете ли вы нарисовать свои деревья «до» и «после» на листе бумаги?
 – 
n. m.
5 Дек 2019 в 15:26
Вы не указываете, является ли sid ключом сортировки для Species. Вы также не указываете ключ сортировки для населения BST. Species также имеет это поле next. Для чего это ?
 – 
chmike
5 Дек 2019 в 16:35
@n.'местоимения'm. в основном для этого события задачами являются «поиск sid из дерева видов, если он найден, то добавьте новую структуру типа узла Population в дереве населения». ibb.co/hdm98mC здесь ссылка на Древо. 1-е изображение: PostOrder, отсортированное по sid Дерево специй, 2-е изображение: Связанное бинарное дерево населения, отсортированное по gid, и это, например, дерево населения с sid 7
 – 
Thanos
5 Дек 2019 в 20:21
Проверьте мой комментарий выше
 – 
Thanos
5 Дек 2019 в 20:21
Ну, я не знаю, что это за дерево наследования. Узлы в моем дереве наследования (фактически DAG) обычно имеют двух родителей, а многие имеют более двух дочерних узлов. Возможно, дерево населения все-таки является BST?
 – 
n. m.
5 Дек 2019 в 23:51

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, а затем уточните, что вы подразумеваете под не работает - я предположил несколько вещей, поскольку вопрос не очень ясен.

1
Gaurav 5 Дек 2019 в 16:41