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

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

МАксим Гогитидзе Ученик (90), на голосовании 5 лет назад
И программа падает в функции 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;
}
Дополнен 5 лет назад
Если что, то это бинарное дерево
Дополнен 5 лет назад
суть в том. Что при определенных условиях код работает. А если я ищу например число больше 4, а максимальное число в дереве 3,то тогда выдает эту ошибку.
Голосование за лучший ответ
Роман Алексеенко Знаток (379) 5 лет назад
Ты программист?
Почини мне чайник)))
пппМыслитель (9211) 5 лет назад
Не, чайник это к электрику. Программист только фотошопить умеет))
Роман Алексеенко Знаток (379) Спорим ты умеешь чинить чайник?)))
Уклюжая Ряха Профи (612) 5 лет назад
лень код читать, но просто parent не проинициализирован
МАксим ГогитидзеУченик (90) 5 лет назад
суть в том. Что при определенных условиях код работает. А сли я ищу например число больше 4, а максимальное число в дереве 4то тогда выдает эту ошибку.
МАксим ГогитидзеУченик (90) 5 лет назад
суть в том. Что при определенных условиях код работает. А если я ищу например число больше 4, а максимальное число в дереве 3,то тогда выдает эту ошибку.
Demon On Wheels Просветленный (30520) 5 лет назад
где-то указатель не проинициализирован.

Надо везде где используется указатель поставить проверки типа

if( указатель ){
ptr->используем
}else{
printf( "указатель не инициализирован, строка %d", __LINE__ );
}
Животное Мудрец (19045) 5 лет назад
Есть такая вещь, называется дебаггер. Советую попробовать, вдруг понравится.
Похожие вопросы