История изменений
Исправление firkax, (текущая версия) :
LEFT_SON_VAR_PAR
Убери этот ужас и пиши напрямую выражения. Из-за этого скорее всего и запутался - в коде не видно что реально происходит.
Вот так номрально функция должна выглядеть:
void left_rotation(node **p) {
node *left_son = (*p)->left;
node *dad = (*p)->prev;
node *grandpa = (*p)->prev->prev;
grandpa->left = *p;
(*p)->prev = grandpa;
dad->prev = *p;
dad->right = left_son;
if (left_son) left_son->prev = dad; // <----- после этого всё "портится"
(*p)->left = dad;
}
Судя по тому, что после этого присваивания у тебя поменялось (*p)->left
, видимо присваивание изменило значение *p
, значит видимо p == &left_son->prev
, а *p == left_son->prev
. Иначе говоря, на вход left_rotation()
ты подал такое p
, что p == &(*p)->left->prev
.
Проверяем:
dad->value=20
, (*p)->value=20
- сходится.
(*p)->prev->value = 30
- видимо это left_son->prev->prev->value или оно же dad->prev->value, а в dad->prev ты раньше записал прошлое значение *p
, и (*p)->value
до присваивания действительно было 30 - опять сходится.
(*p)->right->value = 25
- это left_son->prev->right->value или оно же dad->right->value, а в dad->right ты записал left_son, left_son->value было 25 - опять сходится.
(*p)->left->left->value = <error>
- это left_son->prev->left->left->value или оно же dad->left->left->value, ну а что там было неизвестно, видио не инициализировано.
Мне лень разбираться, что за задачу ты решаешь и что такое красно-чёрное дерево, код «всей программы» не читал (только define посмотрел чтоб расшифровать функцию), но общая проблема в данном случае в том, что ты не учитываешь, что за любым указателем может скрываться элемент, который ты уже начал обрабатывать и менять, и то, как ты его видишь через указатель, при этом тоже будет меняться.
Исправление firkax, :
LEFT_SON_VAR_PAR
Убери этот ужас и пиши напрямую выражения. Из-за этого скорее всего и запутался - в коде не видно что реально происходит.
Вот так номрально функция должна выглядеть:
void left_rotation(node **p) {
node *left_son = (*p)->left;
node *dad = (*p)->prev;
node *grandpa = (*p)->prev->prev;
grandpa->left = *p;
(*p)->prev = grandpa;
dad->prev = *p;
dad->right = left_son;
if (left_son) left_son->prev = dad; // <----- после этого всё "портится"
(*p)->left = dad;
}
Судя по тому, что после этого присваивания у тебя поменялось (*p)->left
, видимо присваивание изменило значение *p
, значит видимо p == &left_son->prev
, а *p == left_son->prev
. Иначе говоря, на вход left_rotation()
ты подал такое p
, что p == &(*p)->left->prev
.
Проверяем:
dad->value=20
, (*p)->value=20
- сходится.
(*p)->prev->value = 30
- видимо это left_son->prev->prev->value или оно же dad->prev->value, а в dad->prev ты раньше записал прошлое значение *p
, и (*p)->value
до присваивания действительно было 30 - опять сходится.
(*p)->right->value = 25
- это left_son->prev->right->value или оно же dad->right->value, а в dad->right ты записал left_son, left_son->value было 25 - опять сходится.
(*p)->left->left->value = <error>
- это left_son->prev->left->left->value или оно же dad->left->left->value, ну а что там было неизвестно, видио не инициализировано.
Мне лень разбираться, что за задачу ты решаешь и что такое красно-чёрное дерево, код «всей программы» не читал (только define посмотрел чтоб расшифровать функцию), но общая пробелма в данном случае в том, что ты не учитываешь, что за любым указателем может скрываться элемент, который ты уже начал обрабатывать и менять, и то, как ты его видишь через указатель, при этом тоже будет меняться.
Исправление firkax, :
LEFT_SON_VAR_PAR
Убери этот ужас и пиши напрямую выражения. Из-за этого скорее всего и запутался - в коде не видно что реально происходит.
Вот так номрально функция должна выглядеть:
void left_rotation(node **p) {
node *left_son = (*p)->left;
node *dad = (*p)->prev;
node *grandpa = (*p)->prev->prev;
grandpa->left = *p;
(*p)->prev = grandpa;
dad->prev = *p;
dad->right = left_son;
if (left_son) left_son->prev = dad; // <----- после этого всё "портится"
(*p)->left = dad;
}
Судя по тому, что после этого присваивания у тебя поменялось (*p)->left
, видимо присваивание изменило значение *p
, значит видимо p == &left_son->prev
, а *p == left_son->prev
. Иначе говоря, на вход left_rotation()
ты подал такое p
, что p == &(*p)->left->prev
.
Проверяем:
dad->value=20
, (*p)->value=20
- сходится.
(*p)->prev->value = 30
- видимо это left_son->prev->prev->value или оно же dad->prev->value, а в dad->prev ты раньше записал прошлое значение *p
, и (*p)->value
до присваивания действительно было 30 - опять сходится.
(*p)->right->value = 25
- это left_son->prev->right->value или оно же dad->right->value, а в dad->right ты записал left_son, left_son->value было 25 - опять сходится.
(*p)->left->left->value = <error>
- это left_son->prev->left->left->value или оно же dad->left->left->value, ну а что там было неизвестно, видио не инициализировано.
Исправление firkax, :
LEFT_SON_VAR_PAR
Убери этот ужас и пиши напрямую выражения. Из-за этого скорее всего и запутался - в коде не видно что реально происходит.
Вот так номрально функция должна выглядеть:
void left_rotation(node **p) {
node *left_son = (*p)->left;
node *dad = (*p)->prev;
node *grandpa = (*p)->prev->prev;
grandpa->left = *p;
(*p)->prev = grandpa;
dad->prev = *p;
dad->right = left_son;
if (left_son) left_son->prev = dad; // <----- после этого всё "портится"
(*p)->left = dad;
}
Судя по тому, что после этого присваивания у тебя поменялось (*p)->left
, видимо присваивание изменило значение *p
, значит видимо p == &left_son->prev
, а *p == left_son->prev
.
Проверяем:
dad->value=20
, (*p)->value=20
- сходится.
(*p)->prev->value = 30
- видимо это left_son->prev->prev->value или оно же dad->prev->value, а в dad->prev ты раньше записал прошлое значение *p
, и (*p)->value
до присваивания действительно было 30 - опять сходится.
(*p)->right->value = 25
- это left_son->prev->right->value или оно же dad->right->value, а в dad->right ты записал left_son, left_son->value было 25 - опять сходится.
(*p)->left->left->value = <error>
- это left_son->prev->left->left->value или оно же dad->left->left->value, ну а что там было неизвестно, видио не инициализировано.
Исходная версия firkax, :
LEFT_SON_VAR_PAR
Убери этот ужас и пиши напрямую выражения. Из-за этого скорее всего и запутался - в коде не видно что реально происходит.
Вот так номрально функция должна выглядеть: [code] void left_rotation(node **p) { node *left_son = (*p)->left; node *dad = (*p)->prev; node *grandpa = (*p)->prev->prev; grandpa->left = *p; (*p)->prev = grandpa; dad->prev = *p; dad->right = left_son; if (left_son) left_son->prev = dad; // <—– после этого всё «портится» (*p)->left = dad; } [/code]
Судя по тому, что после этого присваивания у тебя поменялось (*p)->left
, видимо присваивание изменило значение *p
, значит видимо p == &left_son->prev
, а *p == left_son->prev
.
Проверяем:
dad->value=20
, (*p)->value=20
- сходится.
(*p)->prev->value = 30
- видимо это left_son->prev->prev->value или оно же dad->prev->value, а в dad->prev ты раньше записал прошлое значение *p
, и (*p)->value
до присваивания действительно было 30 - опять сходится.
(*p)->right->value = 25
- это left_son->prev->right->value или оно же dad->right->value, а в dad->right ты записал left_son, left_son->value было 25 - опять сходится.
(*p)->left->left->value = <error>
- это left_son->prev->left->left->value или оно же dad->left->left->value, ну а что там было неизвестно, видио не инициализировано.