Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2011, 22:15   #1
Anatai
 
Регистрация: 23.01.2011
Сообщений: 5
По умолчанию Проблема с АВЛ деревом

void search(int x, Node **p, int h)
{
Node *p1, *p2;

if (!(*p))
{
*p = malloc(sizeof(Node));
h = 1;
(*p)->x = x;
(*p)->left = NULL;
(*p)->right = NULL;
(*p)->bal = 0;
}
else
if (x <= (*p)->x)
{
search(x, &((*p))->left, h);
if (h)
{
switch ((*p)->bal)
{
case 1:
(*p)->bal = 0;
h = 0;
break;
case 0:
(*p)->bal = -1;
break;
case -1:
p1 = (*p)->left;
if (p1->bal == -1)
{
(*p)->left = p1->right;
(*p)->right = p1;
(*p)->bal = 0;
**p = *p1;
}
else
{
p2 = p1->right;
p1->right = p2->left;
p2->left = p1;
(*p)->left = p2->right;
p2->right = *p;

if (p2->bal == -1)
(*p)->bal = 0;
else
(*p)->bal = 1;

if (p2->bal == 1)
p1->bal = -1;
else
p1->bal = 0;

**p = *p2;
}
(*p)->bal = 0;
h = 0;
break;
}
}
}
else
{
search(x, &((*p)->right), h);
if (h)
{
switch ((*p)->bal)
{
case 1:
(*p)->bal = 0;
h = 0;
break;
case 0:
(*p)->bal = -1;
break;
case -1:
p1 = (*p)->right;
if (p1->bal == 1)
{
(*p)->right = p1->left;
p1->left = *p;
(*p)->bal = 0;
*p = p1;
}
else
{
p2 = p1->left;
p1->left = p2->right; // В этом месте
p2->right = p1;
(*p)->right = p2->left;
p2->left = *p;
if (p2->bal == 1)
(*p)->bal = -1;
else
(*p)->bal = 0;

if (p2->bal == -1 )
p1->bal = 1;
else
p1->bal = 0;

*p = p2;
}
(*p)->bal = 0;
h = 0;
break;

}
}
}
}

При вставки 1 2 3 4. После ставки 3 p2->right и p2->left равны NULL, когда пытаюсь присвоить их p1 то программа падает. Облазил инет код везде один и тот же. Делаю в CodeLite. Подскажите, пожалуйста, что можно сделать?
Anatai вне форума Ответить с цитированием
Старый 24.07.2011, 04:33   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Пустите свою программу в режиме пошаговой отладки и посмотрите, что делается не так.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 24.07.2011, 13:57   #3
CodeNOT
Форумчанин
 
Аватар для CodeNOT
 
Регистрация: 08.11.2010
Сообщений: 593
По умолчанию

У Кормена и Вирта хороший алгоритм, посмотри их учебники!
CodeNOT вне форума Ответить с цитированием
Старый 24.07.2011, 17:05   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

оформляйте код специальным тегом, вашу кашу никто смотреть не будет
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
АВЛ-Деревья Darknes Общие вопросы C/C++ 0 08.05.2011 13:12
АВЛ - деревья CodeNOT Общие вопросы C/C++ 3 06.04.2011 13:51
АВЛ-Дерево Alkifr Помощь студентам 0 19.11.2010 19:21
проблема с бинарным деревом Petruha-nsk Общие вопросы C/C++ 0 20.04.2009 18:33