LINUX.ORG.RU

История изменений

Исправление 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, ну а что там было неизвестно, видио не инициализировано.