Mail.RuПочтаМой МирОдноклассникиИгрыЗнакомстваНовостиПоискВсе проекты

Код си Вызвано исключение Вызвано исключение: нарушение доступа для чтения. x->parent было 0xDDDDDDDD.

Ученик (90), на голосовании 1 месяц назад
И программа падает в функции next.Если я ищу например число больше 4, а такого числа нет . В строчке if (x == x->parent->left) с таким исключением (Вызвано исключение: нарушение доступа для чтения.
x->parent было 0xDDDDDDDD)
вот весь код проги.
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
typedef int T;

#define CMP_EQ(a, b) ((a) == (b))
#define CMP_LT(a, b) ((a) < (b))
#define CMP_GT(a, b) ((a) > (b))

typedef struct Node {
T data;
struct Node *left;
struct Node *right;
struct Node *parent;
} Node;
Node* getFreeNode(T value, Node *parent) {
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->left = tmp->right = NULL;
tmp->data = value;
tmp->parent = parent;
return tmp;
}
Node* minimum(Node *root) {
if (root->left == NULL)
return root;
return minimum(root->left);
}
Node* maximum(Node *root) {
if (root->right == NULL)
return root;
return minimum(root->right);
}
Node* prev(Node* x) {
if (x->left)
return maximum(x->left);
while (x->parent) {
if (x == x->parent->right)
return x->parent;
x = x->parent;
}
return NULL;
}
Node* next(Node* x) {
if (x->right)
return minimum(x->right);
while (x->parent) {
if (x == x->parent->left)
return x->parent;
x = x->parent;
}
return NULL;
}
Node* nextnumber(Node *root, T value)
{
Node* node = minimum(root);
while (node && node->data <= value)
node = next(node);
return node;
}
Node* prevnumber(Node *root, T value)
{
Node* node = maximum(root);
while (node && node->data >= value)
node = next(node);
return node;
}
void main() {
Node *root = NULL;
char str[10];
int c;
FILE *f;
f = fopen("sort.txt", "r");
FILE *f2;
f2 = fopen("sort2.txt", "w");
for (int i = 0; i <= 8; i++)
{
fscanf(f, "%s", str);
fscanf(f, "%d", &c);
if (strcmp(str, "insert") == 0)
{
insert(&root, c);
}
else if (strcmp(str, "delete") == 0)
{
root = delete(root, c);
}
else if (strcmp(str, "exists") == 0)
{
fprintf(f2, "%s\n", getNodeByValue(root, c) ? "true" : "false");
}
else if (strcmp(str, "next") == 0)
{
Node* node = nextnumber(root, c);
if (node)
fprintf(f2, "%d\n", node->data);
else
fprintf(f2, "%s\n", "none");
}
else if (strcmp(str, "prev") == 0)
{
Node* node = prevnumber(root, c);
if (node)
fprintf(f2, "%d\n", node->data);
else
fprintf(f2, "%s\n", "none");

}
else printf("ERROR");
printTree;

}

fclose(f);
fclose(f2);
printTree(root, "root", 0);
return 0;
}
Дополнен 1 месяц назад
Если что, то это бинарное дерево
Дополнен 1 месяц назад
суть в том. Что при определенных условиях код работает. А если я ищу например число больше 4, а максимальное число в дереве 3,то тогда выдает эту ошибку.
Похожие вопросы
Также спрашивают