Форум программистов, компьютерный форум CyberForum.ru

Удаление узла бинарного дерева, проблема с функциями, адресацией - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Небольшой вопросик http://www.cyberforum.ru/cpp-beginners/thread5742.html
Помогите ответить на вопрос, давно не ввлезал в си, а вот пришлось решать тест и я сел на этом вопросе. Если ключ доступа не указан явно в определении класса, то какой атрибут доступа по умолчанию будут иметь его элементы, если класс определяется с помощью описателя struct?
C++ Учебник по C++ Народ подскажите где скачать хороший учебник по C++ http://www.cyberforum.ru/cpp-beginners/thread5692.html
C++ Исключения
Помогите пожалуйста разобраться как работают исключения. Что происходит с памятью во время выполнения программы? (Например чего-нибудь простого: try{throw 1;}catch(int) {}) Что происходит с типами которые указываются в catch'ах(type_info)?
C++ Аналог функции window() из conio.h
Нужен аналог этой функции для Win консоли. То есть нужна функция, которая устанавливает активное окно в консоли (ну тоесть часть экрана) для вывода текста.
C++ Вычислите среднее арифметическое элементов последовательности без учета минимального и максимального http://www.cyberforum.ru/cpp-beginners/thread5408.html
Дана последовательность из n целых чисел (n<=200). Вычислите среднее арифметическое элементов последовательности без учета минимального и максимального ее элементов.
C++ Упорядочить в каждой строке текста слова в алфавитном порядке Помогите пожалуйста. Очень срочно нужна помощь людей, знающих С. Нужно написать программу в которой: Задан текст, содержащий произвольное количество строк, в котрых отдельные слова могу разделяться одним или несколькими пробелами и знаками пунктуации (перенос слов не используется). Сформировать новый текст, который является результатом следующего преобразования:упорядочить в каждой строке слова... подробнее

Показать сообщение отдельно
amisd
0 / 0 / 0
Регистрация: 06.01.2008
Сообщений: 6
13.02.2008, 19:22  [ТС]     Удаление узла бинарного дерева, проблема с функциями, адресацией
я глянул листинг, у тебя работает удаление, только глючит на последнем элементе... так что проверь ситуацию удаления последнего элемента...
ок, только что в MiniGW скомпилил, и включил дебаг
+ добавление элементов работает
+ удаление работает, переписал, я там 1 случай не учёл когда у листа есть родитель, исправленная функция Delete:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
void Delete(tree *s)/*Функция удаления узла из дерева*/
{
    tree *tmp;
    printf("OLD:\n");
    printf("Delete: s adr= %d;\n",s);
    printf("Delete: s parent adr= %d;\n",s->parent);
    printf("Delete: s->R adr= %d;\n",s->R);
    printf("Delete: s->L adr= %d;\n",s->L);
    if( (s->R!=NULL || s->L!=NULL) && s->parent!=NULL )
    {
         if(s->L==NULL && s->R==NULL)
         {
            if(s==s->parent->R)
               s->parent->R=NULL;
            else
               s->parent->L=NULL;
            delete s;
         }
         else if(s->L==NULL && s->R!=NULL)
         {
            s->R->parent=s->parent;
            s->parent=s->R;
            delete s;            
         }
         else if(s->L!=NULL && s->R==NULL)
         {
            s->L->parent=s->parent;
            s->parent=s->L;
            delete s;            
         }
         else if(s->L!=NULL && s->R!=NULL)
         {
            s->R->parent=s->parent;
            tmp=s->R;
            while(tmp->L!=NULL)
                  tmp=tmp->L;
            tmp->L=s->L;
            s->L->parent=tmp;
            delete s;            
         }
    }
    else
    {
        if(s->L==NULL && s->R==NULL && s->parent==NULL)// добавил
        {
     delete s;                      
        }
        else if(s->L==NULL && s->R==NULL && s->parent!=NULL) //добавил
        {
     if(s->parent->L==s)
        s->parent->L=NULL;
     else
     s->parent->R=NULL;  
     delete s;                      
        }  
        else if(s->L!=NULL && s->R==NULL)
        {
           s->L->parent=NULL;
           root=s->L;
           delete s;           
        }
        else if(s->L==NULL && s->R!=NULL)
        {
           s->R->parent=NULL;
           root=s->R;
           delete s;           
        }
        else if(s->L!=NULL && s->R!=NULL)
        {
           s->R->parent=NULL;
           root=s->R;
           tmp=s->R;
           while(tmp->L!=NULL)
                 tmp=tmp->L;
           tmp->L=s->L;
           s->L->parent=tmp;
           delete s;           
        }
    }
    printf("NEW:\n");
    printf("Delete: s adr= %d;\n",s);
}
- после удаления листа находящегося не в начале и не в конце и выводе функцией Print чтобы просмотреть результат мне дебаг кричит:
Program has received a signal-name="SIGSEGV",signal-meaning="Segmentation fault" at Print(tree*)({name="s",value="0xfeeefeee"}), file C:\alexsssss\lol\main.cxx:193
и указывает на строку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void Print( tree *s )
{
 if(!s) return;
 if(s!=NULL)
 {
  if(s->L!=NULL) // <---
   Print(s->L);
  //printf("Naimenovanie tovara: %s;\n", s->naimenovanie);
  //printf("Data: %s;\n", s->data);
  printf("-------begin--------\n");
  printf("Izuatiya: %d;\n", s->izyatiya );
  printf("s adr= %d;\n",s);
  printf("s parent adr= %d;\n",s->parent);
  printf("s->R adr= %d;\n",s->R);
  printf("s->L adr= %d;\n",s->L);  
  printf("--------end-------\n");        
  //printf("Stoimost: %d;\n", s->stoimost);
  if(s->R!=NULL)
   Print(s->R);
 }
 else
 {
      printf( "tree is empty...\n" );
      system("PAUSE");
 }
}
[/code]
:?

например:
ввожу я подряд 1,2,3,4
будет
1
/ \
0 2
/ \
0 3
/ \
0 4
/ \
0 0
удалю 3:
это случай в коде:
C++
1
2
3
4
5
6
         else if(s->L==NULL && s->R!=NULL)
         {
            s->R->parent=s->parent;
            s->parent=s->R;
            delete s;            
         }
по идее должно сделать:
дано:
s->parent
/ \
0 s
/ \
0 s->R
1)s->R->parent=s->parent;
2)s->parent=s->R;
s->parent
/ \ \
0 s \
/ \
0 s->R
результат по идее:
s->parent
/ \
0 s->R
/ \
0 ...
дебаг - ошибка!:
Program has received a signal-name="SIGSEGV",signal-meaning="Segmentation fault" at Print(tree*)({name="s",value="0xfeeefeee"}), file C:\alexsssss\lol\main.cxx:201
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru