Невозможно пройти через бинарное дерево нерекурсивным методом

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

(RootPtr — это узел верхнего уровня 0- двоичного дерева, определенного глобально; а GetNodeS — это в основном функция инициализатора (использующая malloc) для указателей типа StackPtr.)

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

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

Это структурные определения,

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

}Tree , *TreePtr;

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

}Stack , *StackPtr;

Это функции Push и Pop,

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

Решение

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

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

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

Тогда вот:

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]