С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Показать сообщение отдельно
Lord_Voodoo
Супер-модератор
8594 / 2211 / 61
Регистрация: 07.03.2007
Сообщений: 10,766
Завершенные тесты: 1
13.02.2008, 19:52
если писать так, то получается вроде бы, но вот на счет удаления реального, не могу никак понять:
Код
#include <cstdlib>
#include <iostream>
typedef struct tree{ // обьявляем тип
 char data[10]; //дата изьятия в формате xx.xx.xxxx
 char naimenovanie[50]; // наименование предмета
    int izyatiya; // кол-во изъятых едениц, по кол-ву изьятий будем составлять дерево
 int stoimost; // обьявленная стоимость предмета
 struct tree *L; // указатель на левый лист
    struct tree *R; // указатель на правый лист
    struct tree *parent; // указатель на родителя листа
    ~tree(){
          izyatiya = -1;
          R = NULL;
          L = NULL;
          parent = NULL;
        }
}; // навание типа - tree
tree *root=NULL; // задаём глобальные указатели, root- корень дерева, и дополнительные указатели.
int 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)
        {
           printf("s->L==NULL && s->R==NULL\n");
           delete s;
           s = NULL;
        }
        else if(s->L!=NULL && s->R==NULL)
        {
           printf("s->L!=NULL && s->R==NULL\n");
           s->L->parent=NULL;
           root=s->L;
           delete s;
           s = NULL;
        }
        else if(s->L==NULL && s->R!=NULL)
        {
           printf("s->L==NULL && s->R!=NULL\n");
           s->R->parent=NULL;
           root=s->R;
           delete s;
           s = NULL;
        }
        else if(s->L!=NULL && s->R!=NULL)
        {
           printf("s->L!=NULL && s->R!=NULL\n");
           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;
           s = NULL;
        }
    }
    printf("NEW:\n");
    printf("Delete: s adr= %d;\n",s);
}
int ReturnMax(tree *s)/*Функция печати максимального элемента дерева*/
{
 while(s->R!=NULL )
    {
  s=s->R;
 }
 return s->izyatiya;
}
int ReturnMin(tree *s)/*Функция печати минимпльного элемента*/
{
 while(s->L!=NULL)
    {
  s=s->L;
 }
 return s->izyatiya;
}
void Insert(tree *s, int &iz, int &stoim, char dat[], char naim[])
{
    tree *temp,*tmp;
    int i=0;
 if(s!=NULL) // если звено дерева существует - находим место куда положить новый элемент, сравнивая его с текущими пробираясь по звеньям дерева
    {
  if(iz < s->izyatiya)
        {
   if(s->L!=NULL)
        Insert(s->L,iz,stoim,dat,naim);
   else
            {
    temp=s;
    s->L=new tree;
    if(s->L!=NULL)
                {
     s=s->L;
     s->L=NULL;
     s->R=NULL;
     s->parent=temp;
              s->izyatiya=iz;
              s->stoimost=stoim;
              i=0;
              do
              {
                       s->naimenovanie[i]=naim[i];
                       i++;
                    }
                    while(naim[i]!='\0');
                    i=0;
              do
              {
                       s->data[i]=dat[i];
                       i++;
                    }
                    while(dat[i]!='\0');
    }
                else // если не хватает памяти - выводим сообщение
     printf( "ЌҐ ¤®бв в®з­® ®ЇҐа вЁў­®© Ї ¬пвЁ!.\n" );
   }
  }
        else
           if(iz > s->izyatiya)
           {
           if(s->R!=NULL)
                  Insert( s->R,iz,stoim,dat,naim);
              else
              {
      temp=s;
      s->R=new tree;
      if(s->R!=NULL)
                  {
                     s=s->R;
      s->L=NULL;
      s->R=NULL;
      s->parent=temp;
               s->izyatiya=iz;
               s->stoimost=stoim;
                     i=0;
               do
               {
                        s->naimenovanie[i]=naim[i];
                        i++;
                     }
                     while(naim[i]!='\0');
                     i=0;
               do
               {
                        s->data[i]=dat[i];
                        i++;
                     }
                     while(dat[i]!='\0');
       }
                   else // если не хватает памяти - выводим сообщение
         printf( "ЌҐ ¤®бв в®з­® ®ЇҐа вЁў­®© Ї ¬пвЁ!.\n" );
              }
     }
 }
}
void Print( tree *s )/*Функция печати элементов дерева*/
{
 if(s!=NULL && s->izyatiya != -1)
    {
  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");
 }
}
tree *Search( tree *koren, int element )/* рекурсивная функция поиска узла по значению*/
{
   if (koren==NULL){ printf("not found\n"); return NULL;}
   else if (koren->izyatiya==element){ printf("Search adr =%d\n;",koren); return koren;}
       else if (element < koren->izyatiya) return Search(koren->L, element);
     else return Search(koren->R, element);
}
int main()
{
    tree *temp;
 int choice = 0, item;
    int iz, stoim;
    char dat[10], naim[50];
 while( choice != 7 ){
  printf( "\n1 to insert new element\n2 to print the tree\n3 to delete element"
          "\n4 to find the element\n5 to find max element\n6 to find min element\n7 for exit\nEnter your choice...\n" );
  scanf( "%d", &choice );
  switch( choice ){
  case 1:
            if(root==NULL) // если дерева не существует - создаём его корень
            {
               root=new tree;
               root->L = NULL;
               root->R = NULL;
               root->parent = NULL;
               printf( "Enter iz...\n" );
         scanf( "%d", &root->izyatiya);
               //printf( "Enter stoim...\n" );
            //scanf( "%d", &root->stoimost);
               //printf( "Enter data...\n" );
            //scanf( "%s", &root->data );
               //printf( "Enter naim...\n" );
            //scanf( "%s", &root->naimenovanie);
            }
            else // если дерево уже существует, то добавляем новые элементы посредством функции
            {
               printf( "Enter iz...\n" );
            scanf( "%d", &iz );
               //printf( "Enter stoim...\n" );
            //scanf( "%d", &stoim );
               //printf( "Enter data...\n" );
            //scanf( "%s", &dat );
               //printf( "Enter naim...\n" );
            //scanf( "%s", &naim );
               Insert(root,iz,stoim,dat,naim);
            }
   break;
  case 2:
   Print(root);
      break;
  case 3:
   printf( "Enter te item...\n" );
   scanf( "%d", &item );
            temp = Search(root,item);
            Delete(temp);
            temp = NULL;
            break;
  case 4:
   printf( "Enter the item you want to find...\n" );
   scanf( "%d", &item );
   if((temp=Search(root,item))!=NULL)
    printf("%d",temp->izyatiya);
   else
            {
    printf( "No such element...\n" );
    system("PAUSE");
   }
   break;
  case 5:
   printf("%d",ReturnMax(root));
   break;
  case 6:
   printf("%d",ReturnMin(root));
   break;
  case 7:
   break;
  default:
   printf("Wrong key. Try again...\n");
   system("PAUSE");
   break;
  }
 }
 return 0;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.