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

      LPDOUBLEITEM node = new DOUBLEITEM();

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

      LPDOUBLEITEM pointer = m_Root;

      // ищем конец списка

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

pointer = pointer->Next;

      // если список уже существует

      if ( pointer != NULL ) pointer->Next = node; else m_Root = node;

      // переприсваеваем указатели

      node->Prev = pointer;

      // записываем данные

      node->Data = new USERDATA( Item->Name, Item->Birthday );

      // прибавляем количество

      m_Count++;

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

      return ( result = true );

}

// вставляем в любое место

bool CDoubleList::Insert( LPUSERDATA Item, int Index )

{

      // результат

      bool result = false;  

      // переприсваиваем голову списка

      LPDOUBLEITEM temp = m_Root;

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

      int i = 0;

      // ищим нужное место для вставки

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

      {

            // если нашли - выпадаем отсюда

            if ( i++ == Index ) break;

            temp = temp->Next;

      }

      // если середина ...

      if ( m_Root != NULL )

      {

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

            LPDOUBLEITEM node = new DOUBLEITEM();

            // копируем в него значения

            node->Data = new USERDATA( Item->Name, Item->Birthday );

            // определяем предыдущий узел

            node->Prev = temp;

            // назначаем следующий, если таковой может быть

            if ( temp->Next != NULL )

            {        

              node->Next = temp->Next;

              temp->Next->Prev = node;

            }

            // вставляем в список

            temp->Next = node;

            // прибавляем количество

            m_Count++;

            // все успешно

            result = true;

      }

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

      return result;

}

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

bool CDoubleList::DeleteAt( int Index )

{

      // результат

      bool result = false;

      // присваиваем голову списка

      LPDOUBLEITEM temp = m_Root;

      // переменная для поиска

      int i = 0;

// если не корректно введеный индекс

if ( Index < 0 || Index >= m_Count ) return false;

      // ищем нужный элемента

      while ( temp->Next != NULL )

      {

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

            if ( i++ == Index ) break;

            temp = temp->Next;

      }

      // если это элемент из средины списка

      if ( temp->Next != NULL && temp->Prev != NULL )

      {

            temp->Prev->Next = temp->Next;

            temp->Next->Prev = temp->Prev;

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

            m_Count--;

            result = true;

      }

      // если это элемент из конца списка

      if ( temp->Next == NULL && temp->Prev != NULL )

      {

            temp->Prev->Next = NULL;

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

            m_Count--;

            result = true;

      }

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

      if ( temp->Next != NULL && temp->Prev == NULL )

      {

            m_Root = temp->Next;

            temp->Next->Prev = NULL;

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

            m_Count--;

            result = true;

      }

        // если это последний элемент

        if ( m_Root != temp )

        {

              // удаляем его

              delete temp;

              temp = NULL;

        }

        else

        {

              // удаляем его

              delete m_Root;

              m_Root = NULL;

        }

      // все класс

      return result;

}

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

bool CDoubleList::DeleteAt( LPUSERDATA Item )

{

      // рузультат

      bool result = false;

      // присваиваем головной узел

      LPDOUBLEITEM temp = m_Root;

      // ищем необходимый узел

      while ( temp->Next != NULL )

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

            if ( temp->Data == Item ) break;

      // если это элемент из средины списка

      if ( temp->Next != NULL && temp->Prev != NULL )

      {

            temp->Prev->Next = temp->Next;

            temp->Next->Prev = temp->Prev;

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

            m_Count--;

            result = true;

      }

      // если это элемент из конца списка

      if ( temp->Next == NULL && temp->Prev != NULL )

      {

            temp->Prev->Next = NULL;

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

            m_Count--;

            result = true;

      }

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

      if ( temp->Next != NULL && temp->Prev == NULL )

      {

            m_Root = temp->Next;

            temp->Next->Prev = NULL;

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

            m_Count--;

            result = true;

      }

      // если это последний элемент

      if ( m_Root != temp )

      {

            // удаляем его

            delete temp;

            temp = NULL;

      }

      else

      {

            // удаляем его

            delete m_Root;

            m_Root = NULL;

      }

      // все класс

      return result;

}

// удаляем все

bool CDoubleList::DeleteAll()

{

      // рузельтат

      bool result = false;

      // узел для удаления