Я пытаюсь пройти через двоичное дерево, построенное с использованием входных данных с клавиатуры. Данные вставлены в двоичное дерево успешно. У меня есть оператор 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;
Вы разыменовываете нулевой указатель на строку, где вы получаете ошибку. Это является причиной ошибки EXC_BAD_ACCESS.
if(TemPtr != NULL)
{
...
}
else // TemPtr must be NULL here
PopS(TemPtr);
не меняется TempPtr
как это передается по значению.
Тогда вот:
printf(" %d", (*TemPtr).data);
*TemPtr
разыменование нулевого указателя
Других решений пока нет …