2013-12-05 8 views
0

У меня есть задание, которое просит меня прочитать родовое дерево из txt, выделить дерево в памяти, а затем выполнить ряд операций, таких как удаление узла, удаление подкатегория, перечисление дочерних узлов узла, перечисление потомков узла и, с которым у меня возникают проблемы, перечисление отца узла. Используемый язык - C. Могут быть элементы языка C++, которые не являются «ярлыками», например, с использованием классов.Generic Tree отец кода узла или алгоритма

Я использую эту структуру для родового дерева:

typedef struct genTree 
    { 
     char info; 
     struct genTree* first; //points to the first child of a node 
     struct genTree* next; //points to the first sibling of a node 
    }tgt; 
    typedef tgt* pgt; 

Это означает, что отец узла указывает на это первый ребенок, то этот ребенок указывает на это братья и сестры.

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

pgt find_father(pgt root, char SON_PARAM)  
{  
     pgt son, father; 
     if(root == NULL) return NULL; 
     if(root->info == SON_NODE) return root; 
     if(root->next != NULL) { 
      son = find_father(root->next, SON_NODE); 
      return son; 
     } 
     else { 
      father = root; 
      son = find_father(root->first, SON_NODE); 
      if(son == NULL) return NULL; 
      else return son; 
     } 
} 

Любая помощь приветствуется.

+0

Не запускается или не компилируется? 'genTree *' должен быть 'struct genTree *' –

+0

Он запускается и выходит с ошибкой, выдает значение 1, исправляет туманность – Pedro

+0

Везде. Входной параметр тоже. Вставьте код, который вы скомпилировали. Включая функцию main(). Что означает код выхода 1? –

ответ

1

Ваша функция не имеет оператора возврата во всех случаях. Вы должны вернуть что-то типа struct genTree *. Кроме того, когда вы устанавливаете b->first = find_father(root->next, NODE_PARAM), вы фактически переписываете свое дерево. Помните, что b не является struct genTree, а struct genTree *. Это означает, что вы сбросили поле first в предмет bбаллов. Наконец, вы должны выполнить поиск по глубине, потому что у вас нет обратных ссылок. Проще всего было бы ввести обратную ссылку в struct genTree. Предполагая, что я понимаю, что вы пытаетесь сделать правильно, попробуйте следующее:

struct genTree 
{ 
    char info; 
    struct genTree* parent; //points to the parent of a node (NULL if root) 
    struct genTree* first; //points to the first child of a node 
    struct genTree* next; //points to the first sibling of a node 
} 

struct genTree* find_father(struct genTree* root, char NODE_PARAM)  
{  
     struct genTree* b; 
     if(root == NULL) return NULL; //standard error checking  
     if(root->info == NODE_PARAM) return root->parent;  
     b = find_father(root->first, NODE_PARAM); 
     if(b == NULL)  
     {  
      b = find_father(root->next, NODE_PARAM); 
     } 
     return b; 
} 

В этом случае код выхода 1, вероятно, вызвано тем, что процессор пытается прочитать обратный мусор значение. Это было бы нормально, если бы это было число, но указатель на мусор (даже если он всего лишь NULL) обычно является проблемой.

+0

Этот код возвращает узел NODE_PARAM ,Я хочу вернуть отца NODE_PARAM – Pedro

+0

@Pedro Не в соответствии с 'if (root-> info == NODE_PARAM) возвращает root'. Если по отцу вы имеете в виду узел, содержащий символ, это то, что делает эта функция. В противном случае вам придется использовать глобальный указатель, если вы используете рекурсию. –

+0

Как использовать глобальный указатель? и отцом я имею в виду узел, который находится «непосредственно над» узлом, который contais char. Извините, я не мог лучше выразить свои мысли:/ – Pedro

Смежные вопросы