2016-01-11 11 views
-1

Я пытаюсь пересечь двоичное дерево, построенное с помощью входных данных с клавиатуры. Данные вставляется в двоичное дерево успешно. У меня есть оператор switch, где «случай 3» должен пересекать (и печатать) двоичное дерево с нерекурсивным алгоритмом обхода порядка. Однако, когда вызывается «случай 3», он дает ошибку EXC_BAD_ACCESS, которая никогда не имеет для меня никакого смысла. Я был бы более чем счастлив, если бы кто-то помог мне с этим.Не удается пересечь двоичное дерево с нерекурсивным методом порядка порядка

(RootPtr это верхний -Уровень 0- узел бинарного дерева, определенной во всем мире, и GetNodeS в основном функция инициализатор (используя таНос) для типа указателей указатель стека.)

Спасибо всем заранее.

Вот соответствующий код:

Это Struct определения,

Typedef struct treeItem 
{ 
    int data; 
    struct treeItem *left; 
    struct treeItem *right; 

}Tree , *TreePtr; 

typedef struct stackItem 
{ 
    TreePtr t; 
    struct stackItem *next; 

}Stack , *StackPtr; 

Эти Push-и поп функции,

void PushS (TreePtr TreePointer) 
{ 
    StackPtr TemPtr; 
    GetNodeS(&TemPtr); 

    (*TemPtr).t = TreePointer; 
    (*TemPtr).next = S; 
    S = TemPtr; 
} 

void PopS(TreePtr TreePointer) 
{ 
    StackPtr TemPtr; 
    GetNodeS(&TemPtr); 

    if (S != NULL) 
    { 
     TreePointer = (*S).t; 
     TemPtr = S; 
     S = (*S).next; 

     FreeNodeS(TemPtr); 
    }  
    else 
     printf("\nEmpty stack!"); 

} 

Это функция перемещения,

void iterative (TreePtr TemPtr) 
{ 
    DONE = 0; 
    TemPtr = RootPtr; 
    S = NULL; 

    if(items==0) 
    { 
     printf("\nTree is empty.\n\n"); 
     DONE = 1; 
    } 
    else 
    { 
     printf("\nIterative nonrecursive inorder traversal:"); 

     while (DONE == 0) 
     { 
      if(TemPtr != NULL) 
      { 
       PushS(TemPtr); 
       TemPtr = (*TemPtr).left; 
      } 
      else 
       if(S != NULL) 
       { 
        PopS(TemPtr); 
        printf(" %d", (*TemPtr).data); //the line I get the ERROR 
        TemPtr = (*TemPtr).right; 
       } 
       else 
       { 
        DONE = 1; 
       } 
     } 
    } 
} 

И это дело выключателя, когда я пытаюсь вызвать функцию итерационной пересекающей,

 case 3: 
      TreePtr TemPtr; 
      GetNode(&TemPtr); 

      iterative(TemPtr); 

      break; 
+1

Опубликовать [MCVE] на свой вопрос пожалуйста. –

+0

Чтобы быть полными и минимальными, мне пришлось разделить мой код на блоки и предоставить только те, которые относятся к ОШИБКЕ. Фактический код - около 400 строк, что, по моему мнению, даже не близко к тому, которое я опубликовал. –

+0

Почему вы игнорируете параметр 'iterative'? – molbdnilo

ответ

1

Вы разыменование нулевого указателя на строке, где вы получите ошибку. Это является причиной ошибки EXC_BAD_ACCESS.

if(TemPtr != NULL) 
{ 
    ... 
} 
else // TemPtr must be NULL here 

PopS(TemPtr); не меняет TempPtr, как это передается по значению.

Тогда здесь:

printf(" %d", (*TemPtr).data); 

*TemPtr нулевой указатель разыменования.

+1

Итак, если я изменяю функцию 'PopS()' для передачи по ссылке, тогда это должно быть ОК? –

+1

Это сработало! Спасибо! –