2016-09-11 4 views
0

Я пытаюсь прочитать двоичное дерево в моей программе, используя следующую функцию, которую я написал.Чтение двоичного дерева с консоли в c

void readTree(struct Dnode *root) 
{ 
    struct Dnode *temp; 
    struct Dnode *input; 
    char initData; 

    scanf(" %c",&initData); 
    input=CreateNode(initData); 

    if(initData==122){ 
     printf("Leaf\n"); 
     return; 
    } 
    else { 
     root=input; 
     temp=root; 
     printf("going to left of %c\n",initData); 
     readTree(root->lLink); 
     printf("going to right of %c\n",initData); 
     readTree(root->rLink); 
    } 
} 

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

int main() 
{ 
    int n=0; 
    struct Dnode *root=NULL; 
    printf("Enter the tree as it asks. Enter z whenever there is no children :\n"); 
    readTree(root); 
    printf("%c",root->data); 
    printf("In main"); 
    return; 

} 

Программа внезапно падает после ввода дерева. Пожалуйста, помогите мне.

+1

Помните, что в Аргументы C передаются * по значению *, т.е. скопированы, и внутри функции эти аргументы подобны любой другой локальной переменной и выходят за пределы области при возврате функции, и все изменения в аргументы будут потеряны. Пожалуйста, найдите * emulating pass по ссылке в c *. Проблема была бы очень очевидна, если бы вы потратили пару минут в отладчике, перешагнувшем ваш код. –

+0

Ваша программа читает с клавиатуры (или любого другого стандартного устройства ввода, которое вы используете), а не с консоли (или любого другого стандартного устройства вывода, которое вы используете). –

+0

вход? ожидаемый результат? фактический выход? что такое 'struct Dnode'? что такое 'CreateNode'? – 4386427

ответ

0

Есть некоторые проблемы с вашим кодом.

1) Вы хотите, чтобы функция изменить корень, но не

В главном root является struct Dnode* и функция принимает struct Dnode*. Так как C использует pass-by-value, это означает, что любое изменение, сделанное внутри функции, теряется при возврате функции.

Другими словами - когда функция возвращает, root в mainещеNULL. Затем вы делаете: printf("%c",root->data);, который обрабатывает, потому что вы разыскиваете NULL.

Вместо этого функция должна принимать двойной указатель, то есть struct Dnode**. Внутри функции вы должны использовать *root = .... при назначении. И функцию нужно называть как readTree(&root);

2) Вы никогда не сохраняете узел, когда это лист.

3) Переменная temp не используется.

4) Название root является запутанным для рекурсивной функции

Сведя вместе, ваш код может быть:

void readTree(struct Dnode **current) // Double pointer 
{ 
    struct Dnode *input; 
    char initData; 

    scanf(" %c",&initData); 
    input=CreateNode(initData); 

    *current=input; // Save the created 

    if(initData==122){ 
     printf("Leaf\n"); 
     return; 
    } 
    else { 
     printf("going to left of %c\n",initData); 
     readTree(&((*current)->lLink)); 
     printf("going to right of %c\n",initData); 
     readTree(&((*current)->rLink)); 
    } 
} 

От основной называют это нравится:

readTree(&root); 
     ^
     notice 
+0

Большое спасибо 4386427. Ваше внимание к деталям во время объяснения мне очень помогло. Код работал. –

0

Вы должны понимать, что значения, переданные функции в качестве аргумента и параметр вызываемой функции, являются одинаковыми, но совершенно разными двумя локальными переменными.

Когда вызывается функция readTree(), объявляется локальный корень переменной, и значение автоматически инициируется как одно и то же значение, которое вы передали в функцию при вызове. Переменная, корень в main() и корень в readTree(), являются разными двумя переменными, но имеют одинаковое значение.

В функции readTree() вы создаете новый узел и привязываете возвращаемое значение к переменной root в readTree(). Как я уже писал, эти два корня не идентичны. Следовательно, ваши изменения, привязки не имеют эффектов вне области - readTree(), а корень в main() остается неизменным.

Для решения этой проблемы необходимо передать указатель в указатель структуры Dnode.

Как это, в основной функции,

struct Dnode *root; 
readTree(&root); 

и readTree() также должен быть изменен

readTree(struct Dnode **root) 
+0

Большое спасибо John Park. Я не буду повторять такие ошибки. Код работал. –