И программа падает в функции 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");
суть в том. Что при определенных условиях код работает. А если я ищу например число больше 4, а максимальное число в дереве 3,то тогда выдает эту ошибку.
суть в том. Что при определенных условиях код работает. А сли я ищу например число больше 4, а максимальное число в дереве 4то тогда выдает эту ошибку.
суть в том. Что при определенных условиях код работает. А если я ищу например число больше 4, а максимальное число в дереве 3,то тогда выдает эту ошибку.
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;
}