2015-03-06 3 views
-1

Извините за мой плохой английский, я написал код C для дерева Splaying, но когда я положил операцию «Найти()» в основной функции, я не смог инициализировать Tree, то есть , без строки «Найти()», используя GDB, я обнаружил, что значение my_tree равно «0x0», когда точка останова в строке «MakeEmpty», но добавьте строку «Найти», значение «0x7fffffffbeb0». Я знаю, что функция Find() имеет проблему, но я не понимаю, почему последние утверждения заражают прежнее утверждение?C адрес указателя очень странный

#include<stdio.h> 
#include "SPTree.c" 

void main() 
{ 
    Position my_tree; 

    my_tree = MakeEmpty(my_tree); 

    my_tree = Insert(5, my_tree); 
    my_tree = Insert(6, my_tree); 

    Position P = Find(5, &my_tree); 
} 

Вот заявление

struct SPNode; 
typedef struct SPNode *Position; 
typedef struct SPNode *SPTree; 
typedef int ElementType; 

и узел дерева

struct SPNode 
{ 
    ElementType Element; 
    SPTree Left; 
    SPTree Right; 
}; 

Это Вставьте

SPTree Insert(ElementType X, SPTree tree) 
{ 
    if(tree == NULL) 
    { 
     //此时 tree 是一棵空树,分配空间并创建一棵树 
     tree = malloc(sizeof(struct SPNode)); 
     if(tree == NULL) 
      printf("Out of space!!!\n"); 
     else 
     { 
      tree->Element = X; 
      tree->Left = tree->Right = NULL; 
     } 
    } 
    else 
    { 
     //递归插入 X 到合适的子树中 
     if(X < tree->Element) 
      tree->Left = Insert(X, tree->Left); 
     else if(X > tree->Element) 
      tree->Right = Insert(X, tree->Right); 
     else 
      //X已经在树中,什么也不做 
      ; 
    } 
    return tree; 
} 

и это найдете в моем GitHub репо (потому что он слишком длинный): https://github.com/hengyicai/Find/blob/master/Find.c

Что я путать: когда основная функция как этот

void main() 
{ 
    Position my_tree; //line 1 

    my_tree = MakeEmpty(my_tree); 

    my_tree = Insert(5, my_tree); 
    my_tree = Insert(6, my_tree); 

} 

Я отладки для точки останова в строке 1, и напечатать значение my_tree является 0x0, как показано ниже

смотрите здесь: " https://raw.githubusercontent.com/hengyicai/Find/master/ "см. Pic_1.png.

, но после того, как добавить Find() finction в main.c

#include<stdio.h> 
#include "SPTree.c" 

void main() 
{ 
    Position my_tree; 

    my_tree = MakeEmpty(my_tree); 

    my_tree = Insert(5, my_tree); 
    my_tree = Insert(6, my_tree); 

    Position P = Find(5, &my_tree); 
} 

я получаю значение my_tree так: смотрите на Pic_2.png в приведенной выше ссылке.

Почему значение my_tree отличается от предыдущего, просто добавьте Find() в последнюю строку?

+4

без кода для других функций, трудно сказать – thumbmunkeys

+0

0x7fffffffbeb0: Похоже, это выделено в стеке, но сказать сложно. Попробуйте 'int x; printf ("% p", &x); '- он даст вам адрес в стеке – 18446744073709551615

+3

Зачем вам нужен адрес' & 'для' Find() ', но не для' Insert() '? –

ответ

0

MakeEmpty() Функция возвращает указатель или значение?

Код очень странный. Я полагаю, что MakeEmpty() может вернуть указатель на пустую структуру Position.

Обычно вы можете выбрать путь 2, для возврата указателя из функции:

1 - Получить указатель в качестве параметра прохождения;

2 - Извлеките указатель в качестве возвращаемого значения;

typedef foo_t; 

foo_t foo; 


pass_bar(foo_t **pass_foo) 
{ 

    ... 
    //Set the pointer to the **pass_foo parameter 
} 


foo_t* return_foo(void) 
{ 
    foo_t *my_foo; 

    //Set the pointer my_foo to a valid memory address for foo_t 
    ... 
    return my_foo; 
} 

Вы добавили тег pointers, но в этой части кода, не используйте указатель ...

+0

Я думаю, что 'Position' является typedef для указателя на структуру. – pmg

+0

Спасибо за ваш ответ, извините за мое плохое выражение, я добавляю код поиска и вставки для этой проблемы. – hengyicai

+0

После редактирования ... Я не знаю 'MakeEmpty', но' Insert', в случае, если указатель NULL передан как 'tree', возвращает указатель на ячейку памяти структуры' tree' только с одним элементом , Никакой другой элемент не добавлен ... Затем в двух следующих вызовах функции вы изменяете только значение tree => Right для структуры _same_. Вызывая функцию 'Найти()', функция проверяет, что 'tree-> Left' равно NULL, а затем возвращает NULL – EffegiWeb

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