Автор Тема: кому не слабо написать код для сортировки бинарным деревом без рекурсии?  (Прочитано 6125 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Пабло Бартолле

  • Ветеран
  • *****
  • Сообщений: 3043
  • Карма: 129
  • Пол: Мужской
  • аллергия на чушь
    • Просмотр профиля
сабж
(думаю место этой темы в пк и пр.)
вам стоит боятца меня на дороге по двум причинам:
- я сдал на права
- я сдал на права с шестого раза...


Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
ЛЕГКО, я ток сеня экзамен сдавал. ща выложу
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
эт раз. самое главное. сама сортировка


// Файл cTreeList.h
// Класс cTreeList для древовидной сортировки списка
//                                     Из учебного курса А. Деона

#ifndef cTreeList_h             // защита от повторной компиляции
#include "cBaseList.h"                               // cBaseList
template < typename INFO >
class cTreeList : public virtual cBaseList < INFO >
{   typedef unsigned long ULONG;
   typedef cNode < INFO, cBaseList < INFO > > NODE;
  public:
    cTreeList( void ) {}
   void TreeSort( int ML( INFO* pa, INFO* pb ) );
  private:
   void  CreateSortTree( NODE* p, int ML( INFO* pa, INFO* pb) );
   void  CrossReplace( void );      // поперечное преобразование
   void* CrossView( void );           // поперечный обход дерева

  private:
   NODE* Current;     // указатель текущей вершины обхода дерева
};
// --------------------------------------------------------------
template < typename INFO >
void
cTreeList < INFO > :: TreeSort( int ML( INFO* pa, INFO* pb) )
{   if( !First ) return;                         // пустой список
   if( Last == First ) return;                // в списке 1 узел
   NODE* p = First;  // начало списка и корень дерева сортировки
   while( p = GetNext( p ) ) CreateSortTree( p, ML ); // создать
   CrossReplace(); // поперечное преобразование списка по дереву
}
// --------------------------------------------------------------
template < typename INFO >
void
cTreeList < INFO > :: CreateSortTree( NODE* p,
                           int ML( INFO* pa, INFO* pb ) )
{   SetLRU( p );                     // обнулить указатели ветвей
   Current = First;  // начало списка и корень дерева сортировки
   while( Current )   // поиск места присоединения узла к дереву
   {   if( ML( GetInfo(p), GetInfo(Current) ) == -1 )  // налево
      {   if( GetLeft( Current ) ) Current = GetLeft(Current);
         else
         {   SetLeft( Current, p ); // поместить в левую ветвь
            SetUp( p, Current );// связать с предыдущим узлом
            break;
         }
      }
      else                   // больше или равно в правую ветвь
      {   if( GetRight( Current ) ) Current =GetRight(Current);
         else
         {   SetRight( Current, p );//поместить в правую ветвь
            SetUp( p, Current );// связать с предыдущим узлом
            break;
         }
      }
   }
}
// --------------------------------------------------------------
template < typename INFO >
void
cTreeList < INFO > :: CrossReplace( void )
{   SetBA();    // установить узлы Before и After по краям списка
   NODE* p = Before;           // начало отсортированного списка
   Current = First;                             // корень дерева
   SetState( Current, 'L' );              // левосторонний обход
   while( void* r = CrossView() )     // поперечный обход дерева
   {   SetNext( p, (NODE*) r ); // добавить узел дерева в список
      SetPrev( (NODE*) r, p );  // связать с прежним окончанием
      p = (NODE*) r;      // указатель последнего узла в списке
      SetNext( p, NULL );           // признак окончания списка
      SetPrev( After, p );    // для будущей корректировки Last
   }
   FreeBA();        // снять узлы Before и After по краям списка
}
//---------------------------------------------------------------
template < typename INFO >
void*
cTreeList < INFO > :: CrossView( void )
{   if( !Current ) return NULL;             
   while( Current ) 
   {   switch( GetState( Current ) )
      { case 'L': if( GetLeft( Current ) )
               { Current = GetLeft( Current );
                   SetState( Current, 'L' );   
                  break;
               }
        case 'V': SetState( Current, 'R' );     
               return Current;       
        case 'R': SetState( Current, 'R' );
                    if( GetRight( Current ) )
                { Current = GetRight(Current);
                      SetState( Current, 'L' );   
                   break;
               }
          case 'U': Current = GetUp( Current ); 
                if( !Current ) break;   
                if( GetState( Current ) == 'L')   
                  SetState( Current, 'V' );
                else
                if( GetState( Current ) == 'R') 
                  SetState( Current, 'U' );
      }
   }
   return NULL;                               
}
// --------------------------------------------------------------
#define cTreeList_h                     // компиляция произведена
#endif
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
и нумбер два. сам класс для списка и класс-контейнер, из кот. состоит список

// Файл cBaseList.h
// Шаблонный класс cBaseList для управления двухсвязным списком
//                                     Из учебного курса А. Деона

#ifndef cBaseList_h             // защита от повторной компиляции
#include "cNode.h"                                       // cNode

template < typename INFO >
class cBaseList
{public:   
   typedef unsigned long ULONG;
   typedef cNode < INFO, cBaseList < INFO > > NODE;
  
    cBaseList( void ) : First(NULL), Last(NULL), LastNumber(0),
                        Before(NULL), After(NULL) {}
   ~cBaseList( void ) { Delete(); }             // удалить список
    void   Print( void );                    // распечатка списка
   void   PrintN( void );
  public:  
   void   Delete( void );//удалить список из динамической памяти
                      // распечатка списка
   cBaseList < INFO > & operator + ( INFO& );   // добавить узел
   inline void* FirstIter( void )  { return (void*) First; }
   inline void* LastIter( void )   { return (void*) Last; }
   inline INFO* InfoIter( void* p ){ return & ((NODE*)p)->Info;}
   inline void* NextIter( void* p )     // адрес следующего узла
                             { return (void*)((NODE*)p)->Next; }
   inline void* PrevIter( void* p )    // адрес предыдущего узла
                             { return (void*)((NODE*)p)->Prev; }
   inline ULONG NumberIter( void* p )     // номер текущего узла
                       { return ((NODE*)p)->Number;}
   inline void  ChangeWithIter( void* pi, void* pk )//с номерами
                   { ChangeWith( (NODE*) pi, (NODE*) pk ); }
   inline void  ChangeNoIter( void* pi, void* pk )// без номеров
                    { ChangeNo( (NODE*) pi, (NODE*) pk ); }
  protected:
   inline NODE* GetFirst( void ) { return First; }
   inline INFO* GetFirstInfo( void ) { return & First->Info; }
   inline NODE* GetLast ( void ) { return Last; }
   inline INFO* GetLastInfo( void ) { return & Last->Info; }
   inline ULONG GetLastNumber( void ) { return LastNumber; }
   inline INFO* GetInfo( NODE* p ) { return & p->Info; }   
   inline NODE* GetNext( NODE* p ) { return p->Next; }
   inline void  SetNext( NODE* p, NODE* r ) { p->Next = r; }
   inline NODE* GetPrev( NODE* p ) { return p->Prev; }
   inline void  SetPrev( NODE* p, NODE* r ) { p->Prev = r; }
   inline ULONG GetNumber(void* p){ return ((NODE*) p)->Number;}
   inline void  SetNumber( NODE* p, ULONG n ) { p->Number = n; }

   inline NODE* Get_hN( NODE* p ) { return p->hN; }
   inline void  Set_hN( NODE* p, NODE* r ) { p->hN = r; }
   inline NODE* Get_hP( NODE* p ) { return p->hP; }
   inline void  Set_hP( NODE* p, NODE* r ) { p->hP = r; }
   inline void  SetLRU( NODE* p );
   inline NODE* GetLeft( NODE* p ) { return p->Left; }
   inline void  SetLeft( NODE* p, NODE* r ) { p->Left = r; }
   inline NODE* GetRight( NODE* p ) { return p->Right; }
   inline void  SetRight( NODE* p, NODE* r ) { p->Right = r; }
   inline NODE* GetUp( NODE* p ) { return p->Up; }
   inline void  SetUp( NODE* p, NODE* r ) { p->Up = r; }
   inline char  GetState( NODE* p ) { return p->State; }
   inline void  SetState( NODE* p, char ch ) { p->State = ch; }

   void   SetBA( void );       // установить узлы Before и After
   void   FreeBA( void );           // снять узлы Before и After
   void   Replace( NODE* pb, NODE* pn );      // преместить узел
   void   ChangeSimple( NODE* pi, NODE* pk );   // простой обмен
   void   ChangeWith( NODE* pi, NODE* pk );  // обмен c номерами
   void   ChangeNo( NODE* pi, NODE* pk );   // обмен без номеров
   void   ChangeN( NODE* pi, NODE* pk );    // обмен без номеров

  protected:
   NODE* First;                         // адрес начального узла
   NODE* Last;                          // адрес последнего узла
   ULONG LastNumber;                    // номер последнего узла
   NODE* Before;      // адрес вспомогательного узла перед First
   NODE* After;        // адрес вспомогательного узла после Last
};
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: Delete( void )
{   if( Before )             // есть дополнительное начало списка
   {   First->Prev = NULL;
      delete Before;
      Before = NULL;
   }
   if( After )            // есть дополнительное окончание списка
   {   Last->Next = NULL;
      delete After;
      After = NULL;
   }
   while( Last )                // реверсивный цикл узлов списка
   {   NODE* d = Last;              // указатель удаляемого узла
      Last = Last->Prev;                  // предпоследний узел
      delete d;          // удалить узел из динамической памяти
   }
   First = NULL;
   Last  = NULL;
   LastNumber = 0;
}
// --------------------------------------------------------------
template< typename INFO >
cBaseList < INFO > &
cBaseList < INFO > :: operator + ( INFO& inf )
{   NODE* p = new NODE;                          //  создать узел
   p->Info = inf;                 // загрузить информацию в узел
   if( !First ) First = p;                        // список пуст
   else
   {   Last->Next = p;
      p->Prev = Last;
   }
   Last = p;
   p->Number = ++LastNumber;
   return *this;               // адресный идентификатор объекта
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: Print( void )
{   printf( "\n" );                               // новая строка
   NODE* p = First;                             // начало списка
   while( p != After  )                            // цикл узлов
   {   printf( "%4d", p->Info );              // информация узла
      p = p->Next;                            // следующий узел
   }
   printf( "\n" );                               // новая строка
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: PrintN( void )
{   printf( "\n" );                               // новая строка
   NODE* p = First;                             // начало списка
   while( p != After  )                            // цикл узлов
   {   printf( "%4d", p->Info );              // информация узла
      p = p->Next;                            // следующий узел
   }
   printf( "\n" );                               // новая строка
   p = First;                                   // начало списка
   while( p != After  )                            // цикл узлов
   {   printf( "%4d", p->Number );                 // номер узла
      p = p->Next;                            // следующий узел
   }
   printf( "\n" );                               // новая строка
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: SetBA( void )
{   if( !Before )
   {   Before = new NODE;      // для эффективности перестановок
      First->Prev = Before;   // поставить перед началом списка
      Before->Next = First;
   }
   if( !After )
   {   After = new NODE;       // для эффективности перестановок
      Last->Next = After;   // поставить после окончания списка
      After->Prev = Last;
   }
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: FreeBA( void )
{   if( Before )
   {   First = Before->Next;// восстановить начало общего списка
      First->Prev = NULL;
      delete Before;
      Before = NULL;
   }
   if( After )
   {   Last = After->Prev;   // восстановить конец общего списка
      Last->Next = NULL;
      delete After;
      After = NULL;
   }
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: Replace( NODE* pb, NODE* pn )
{  
   pn->Prev->Next = pn->Next;     // исключить узел pn из списка
   pn->Next->Prev = pn->Prev;
   pb->Prev->Next = pn;       // вставить узел pn перед узлом pb
   pn->Prev = pb->Prev;
   pn->Next = pb;
   pb->Prev = pn;
   First = Before->Next;
   Last = After->Prev;
}
// --------------------------------------------------------------

http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
template < typename INFO >
void
cBaseList < INFO > :: ChangeWith( NODE* pi, NODE* pk )
{   if( pi == pk ) return;                  // один и тот же узел
   if( !First ) return;                         // пустой список
   if( Last == First ) return;                // в списке 1 узел
   SetBA();   // установить узлы Before и After по концам списка
   ChangeSimple( pi, pk );                // простой обмен узлов
   FreeBA();      // удалить узлы Before и After с концов списка
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: ChangeNo( NODE* pi, NODE* pk )
{   if( pi == pk ) return;                  // один и тот же узел
   if( !First ) return;                         // пустой список
   if( Last == First ) return;                // в списке 1 узел
   SetBA();   // установить узлы Before и After по концам списка
   ChangeSimple( pi, pk );                // простой обмен узлов
   FreeBA();      // удалить узлы Before и After с концов списка
   ULONG r = pi->Number;                        // обмен номеров
   pi->Number = pk->Number;
   pk->Number = r;
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: ChangeN( NODE* pi, NODE* pk )
{   if( pi == pk ) return;                  // один и тот же узел
   if( !First ) return;                         // пустой список
   if( Last == First ) return;                // в списке 1 узел
   ChangeSimple( pi, pk );                // простой обмен узлов
   ULONG r = pi->Number;                        // обмен номеров
   pi->Number = pk->Number;
   pk->Number = r;
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: ChangeSimple( NODE* pi, NODE* pk )
{   if( pi == pk ) return;                  // один и тот же узел

   NODE* ri1 = pi->Prev;                 // соседние узлы для pi
   NODE* ri2 = pi->Next;
   NODE* rk1 = pk->Prev;                 // соседние узлы для pk
   NODE* rk2 = pk->Next;

   if( pi->Next == pk )   // последовательное расположение pi,pk
   {   ri1->Next = pk;
      pk->Prev  = ri1;
      pk->Next = pi;
      pi->Prev = pk;
      pi->Next  = rk2;
      rk2->Prev = pi;
   }
   else
   if( pk->Next == pi )   // последовательное расположение pk,pi
   {   rk1->Next = pi;
      pi->Prev  = rk1;
      pi->Next = pk;
      pk->Prev = pi;
      pk->Next  = ri2;
      ri2->Prev = pk;
   }
   else                                // узлы pi и pk не соседи
   {   ri1->Next = pk;
      pk->Prev  = ri1;
      pk->Next  = ri2;
      ri2->Prev = pk;

      rk1->Next = pi;
      pi->Prev  = rk1;
      pi->Next  = rk2;
      rk2->Prev = pi;
   }
   First = Before->Next;    // восстановить начало общего списка
   Last = After->Prev;       // восстановить конец общего списка
}
// --------------------------------------------------------------
template < typename INFO >
void
cBaseList < INFO > :: SetLRU( NODE* p )
{   if( !p ) return;
   p->Left = NULL;
   p->Right = NULL;
   p->Up = NULL;
}
// --------------------------------------------------------------
#define cBaseList_h                     // компиляция произведена
#endif


//-----------------------

// Файл cNode.h
// Шаблонный класс cNode узлов двух и трехсвязного списка
//                                     Из учебного курса А. Деона

#ifndef cNode_h                 // защита от повторной компиляции
template < typename INFO, class FRIEND >
class cNode
{   typedef cNode < INFO, FRIEND > NODE;
   typedef unsigned long ULONG;
   friend FRIEND;// дружественный класс с личным уровнем доступа
public:
   cNode( void ) : Prev(NULL), Next(NULL), Number(0),
               hP(NULL), hN(NULL),
               Left(NULL),Right(NULL), Up(NULL) {}
    INFO  Info;                      // информационная часть узла
   ULONG Number;                                   // номер узла
   NODE* Prev;                         // адрес предыдущего узла
   NODE* Next;                          // адрес следующего узла
   NODE* hP;    // адрес предыдущего узла в h-последовательности
   NODE* hN;     // адрес следующего узла в h-последовательности
   NODE* Left;                       // адрес узла в левой ветви
   NODE* Right;                     // адрес узла в правой ветви
   NODE* Up;                            // адрес верхней вершины
   char  State;                   // состояние для обхода дерева
   char  Alloc;                  // расположение вершины в ветви
};
// --------------------------------------------------------------
#define cNode_h                         // компиляция произведена
#endif
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
и бонус. пример заюза:


// Program S64
// Древовидная сортировка списка
//                                     Из учебного курса А. Деона

#include <stdio.h>                               // sprintf, NULL
#include <conio.h>                                       // getch
#include "cTreeList.h"                               // cTreeList
// --------------------------------------------------------------
int MoreLess( int* pa, int* pb )
{   if( *pa < *pb )  return -1;                          // a < b
   if( *pa == *pb ) return 0;                           // a = b
   return 1;                                            // a > b
}
// --------------------------------------------------------------
void main( void )
{   cTreeList < int > List;                       // объкт списка
   const int nL = 7;                // количество узлов в списке
   int a[nL] = { 70, 10, 50, 60, 40, 30, 20 };
      //   { 41, 85, 19, 82, 57, 6, 83, 90, 85, 5, 22, 22, 57 };
   for( int i = 0; i < nL; i++ ) List + a;  // создать список
   List.Print();                                // печать списка
   List.TreeSort( MoreLess );          // древовидная сортировка
   List.Print();             // распечатка упорядоченного списка
   printf( "\n" );
   getch();                               // просмотр результата
}
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
развлекайся =)

зыж. рекурсия не рулит =) опасное это дело =)

зы2 код 100% рабочий.

зы3 не проси объяснить, как эти итерации работают. сам с трудом втыкаю...
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн Пабло Бартолле

  • Ветеран
  • *****
  • Сообщений: 3043
  • Карма: 129
  • Пол: Мужской
  • аллергия на чушь
    • Просмотр профиля
т.е. ты не сам писал?
в си не разбираюсь но наскока я понял когда обходиш дерево смотриш откуда пришол
если сверху то идеш влево
если левой ветки нет или пришел от потомка слева то возвращаеш значение
если тока что возвращал значение то идеш вправо
если правой ветки нет или вернулся справа то идеш вверх

я делал точно так же просто хотел посмореть я один такой умный? ;D

кстати выход из цыкла по break не есть хорошо

зы
за код спасибо :)
вам стоит боятца меня на дороге по двум причинам:
- я сдал на права
- я сдал на права с шестого раза...

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
мы это на лабах писали. и должны типа выучить =)

и брейк не к циклу относится, а к switсh ;)

 в си он после выполнения case'a не выходит, как например в васике, а продолжает выполнять все строчки ниже ))
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн Пабло Бартолле

  • Ветеран
  • *****
  • Сообщений: 3043
  • Карма: 129
  • Пол: Мужской
  • аллергия на чушь
    • Просмотр профиля
один х
надо было просто условные операторы грамотно сделать
вам стоит боятца меня на дороге по двум причинам:
- я сдал на права
- я сдал на права с шестого раза...

Оффлайн Леха

  • Постоялец
  • ***
  • Сообщений: 189
  • Карма: 46
  • Пол: Мужской
  • Windows XP
    • Просмотр профиля
А это на каком языке программирования?(думаю, что jscript)
<marquee>aaa</marquee>


Оффлайн Леха

  • Постоялец
  • ***
  • Сообщений: 189
  • Карма: 46
  • Пол: Мужской
  • Windows XP
    • Просмотр профиля
С++
Он немного похож на JScript(такие же пояснения, те же условия и др.)
<marquee>aaa</marquee>

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
С++
Он немного похож на JScript(такие же пояснения, те же условия и др.)
гыы)) си и жаба оч. похожи в принципе.. по своей природе =)
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн Пабло Бартолле

  • Ветеран
  • *****
  • Сообщений: 3043
  • Карма: 129
  • Пол: Мужской
  • аллергия на чушь
    • Просмотр профиля
кстати выход из цыкла по break не есть хорошо
один х
надо было просто условные операторы грамотно сделать
какой же я был лошара...
вам стоит боятца меня на дороге по двум причинам:
- я сдал на права
- я сдал на права с шестого раза...

Оффлайн santic

  • Ветеран
  • *****
  • Сообщений: 1118
  • Карма: -24
  • Пол: Мужской
  • Руби@угорай
    • Просмотр профиля
фига тут кодик, библиотеки особенно пугают. :ai:

not

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
какой же я был лошара...

4 с половиной года втыкал?  :ab:

ps. а забавно видеть свои сообщения 4х летней давности.
их стиль удивительно похож на стиль сообщений моего брата сейчас, он как раз на 4 года младше  :bk:

фига тут кодик, библиотеки особенно пугают. :ai:
да, stdio.h очень страшная библиотека, а conio.h, из которой используется лишь getch(), должно быть, еще страшнее))
« Последнее редактирование: 30.11.10, 22:34:08 от LEO »
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн santic

  • Ветеран
  • *****
  • Сообщений: 1118
  • Карма: -24
  • Пол: Мужской
  • Руби@угорай
    • Просмотр профиля
я имею ввиду - cTreeList.h  :bk: stdio.h не нравится, т.к. не умею "готовить" её, вместо неё юзаю iostream.h  :ab:

not

Оффлайн LEO

  • Ветеран
  • *****
  • Сообщений: 4417
  • Карма: 310
  • Пол: Мужской
    • Просмотр профиля
я имею ввиду - cTreeList.h  :bk:

так это не либа, а класс для сортировки, который и просили http://forum.elsite.ru/index.php?topic=17533.msg131769#msg131769
http://is.gd/fpTeSMПродам книжки про Ajax и ASP.NET, http://is.gd/lDL64HПриглашаю в Dropbox

Оффлайн santic

  • Ветеран
  • *****
  • Сообщений: 1118
  • Карма: -24
  • Пол: Мужской
  • Руби@угорай
    • Просмотр профиля
*иду учить СИ :)

not