Разработка программы для создания и работы с двусвязным списком, состоящим из структур (сортировка списка по фамилии, т,е, по возрастанию), страница 6

      LPDOUBLEITEM temp = NULL;

      // начинаем удалять

      while( m_Root != NULL && m_Root->Next != NULL )

      {

            // переприсваиваем и удаляем

            temp = m_Root;

            m_Root = m_Root->Next;

            // удаляем узел

            delete temp;

            temp = NULL;

            // уменьшаем счетчик

            m_Count--;

            // все класс

            result = true;

      }

      // остался корень ? - удаляем его

      if ( m_Root != NULL )

      {

            // удаляем корень

            delete m_Root;

            m_Root = NULL;

            // уменьшаем счетчик

            m_Count--;

            // все класс

            result = true;

      }

      // результат

      return result;

}

// сортировка

bool CDoubleList::Sort( bool Direction )

{

      // результат

      bool result = false;

      // начало сортировки

      for ( int y = 0; y < m_Count - 1; y++ )

            for ( int x = y + 1; x < m_Count; x++ )

            {

                  // получаем элементы из списка

                  LPDOUBLEITEM t1 = this->operator []( y );

                  LPDOUBLEITEM t2 = this->operator []( x );

                  // какое направление сортировки

                  if ( ( ( Direction ) ?

strcmp( t1->Data->Name, t2->Data->Name ) > 0 :

                        strcmp( t1->Data->Name, t2->Data->Name ) < 0 ) )

                  {

                        // создаем временный узел

                        LPUSERDATA temp = new USERDATA(

t1->Data->Name, t1->Data->Birthday );

                        // удаляем старый узел

                        delete [] t1->Data->Name;

                        // создаем его заново нового размера

                        t1->Data->Name = new char[strlen(t2->Data->Name) + 1];

                        // копируем в него новые данные

                        strcpy( &t1->Data->Name[0], t2->Data->Name );

                        t1->Data->Birthday = t2->Data->Birthday;

                        // удаляем старый узел

                        delete [] t2->Data->Name;

                        // создаем его заново нового размера

                        t2->Data->Name = new char[strlen( temp->Name ) + 1];;

                        // копируем в него новые данные

                        strcpy( &t2->Data->Name[0], temp->Name );

                        t2->Data->Birthday = temp->Birthday;

                        // удаляем временный узел

                        delete temp;

                        temp = NULL;

                        // все класс

                        result = true;

                  }

            }

      // рузультат

      return result;

}

// возвращение индекса элемента

int CDoubleList::FindIndex( LPUSERDATA Item )

{

      // индекс элемента

      int index = -1;

      // присваиваем новому элементу адрес головы

      LPDOUBLEITEM temp = m_Root;

      // ищем необходимый элемент

      while ( temp->Next != NULL )

            // нашли ? - выпадаем

            if ( temp->Data == Item ) break; else ++index;

      // возврат результата

      return ( ( index != m_Count ) ? index : -1 );

}

// индексный доступ к элементам списка

LPDOUBLEITEM CDoubleList::operator []( int Index )

{

      // если мы мимо - значит ничего не возвращаем

      if ( Index < 0 || Index > m_Count ) return NULL;

      // присваиваем новому элементу адрес головы

      LPDOUBLEITEM temp = m_Root;

      // объявляем текущую позицию

      int i = 0;

      // ищем элемент

      while ( temp->Next != NULL )

      {

            // нашли ? - выпадаем

            if ( i++ == Index ) break;

            temp = temp->Next;

      }

      // созвращаем его номер

      return temp;

}

// вывод на дисплей

void CDoubleList::Print()

{

      // присваиваем новому узлу адрес головы списка

      LPDOUBLEITEM temp = m_Root;

      // выводим на экран

      while ( temp != NULL )

      {

            printf( "%40s\t%d\r\n", temp->Data->Name, temp->Data->Birthday );

            temp = temp->Next;

      }

}

Файл СOURSE.CPP

Ниже представлен исходный код основной программы.

#include "stdafx.h"

#include "DoubleList.h"

// основная программа

int _tmain(int argc, _TCHAR* argv[])

{

      // меняем заголовок окна

      SetConsoleTitle( _T( "Program for working with doubly connected list" ) );

      // объявляем переменную

      char key = ' ';

      // объявляем объект

      CDoubleList *dl = NULL;

      do

      {

            // выводим меню

            system( "cls" );

            printf( "\t\t*** Menu ***\r\n\r\n" );

            printf( "\tCreate list:\t\t\t1\r\n" );

            printf( "\tPrint list:\t\t\t2\r\n" );

            printf( "\tAdd new element to list:\t3\r\n" );

            printf( "\tCorrection of list:\t\t4\r\n" );

            printf( "\tExit:\t\t\t\t5\r\n" );

            printf( "\r\nYour choice: %c", key );

            // получаем клавишу

            key = _getch();

            // проверяем, что нажал пользователь

            switch( key )

            {

                  case 0x31:

                  {