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

При необходимости, можно отсортировать элементы массива по возрастанию или убыванию. Для этого необходимо вызвать метод класса Sort и в качестве аргумента, в который можно передать TRUE, что будет соответствовать сортировке элементов списка по возрастанию или FALSE – для сортировки списка по убыванию.

Если возникает необходимость вывести всю информацию из списка – можно воспользоваться методом класса Print. Данный метод выводит на экран всю информацию из списка по каждому элементу последовательно. В данной реализации класса – вывод осуществляется в консольное окно. Метод Print является виртуальным методом и может быть переписан впоследствии при наследовании от данного класса.


Исходный код программы

Файл DOUBLELIST.H.

          Ниже представлен исходный код хидера, который реализует работу с двусвязным списком.

#ifndef __DOUBLELIST_H__

#define __DOUBLELIST_H__

#pragma once

#include <windows.h>

#include <conio.h>

#include <stdio.h>

// структура для описания данных пользователя

typedef struct tagUSERDATA

{

      LPSTR       Name;       // ФИО пользователя

      int         Birthday;   // год рождения

      // конструктор по умолчанию

      tagUSERDATA()

      {

            // обнуляем переменные

            Name = NULL;

            Birthday = 0;

      }

      // конструктор с параметрами

      tagUSERDATA( LPSTR First, int Year )

            :Name( NULL )

      {

            // создаем имя польльзователя

            Name = new char[strlen( First ) + 1];

            // очищаем массив

            emset( Name, 0x00, strlen( First ) );

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

            strcpy( Name, First );

            Birthday = Year;

      }

      // деструктор по умолчанию

      ~tagUSERDATA()

      {

            // если объект существует - удаляем его

            if ( Name != NULL )

            {

                  delete [] Name;

                  Name = NULL;

            }

            Birthday = 0;

      }

} USERDATA, *LPUSERDATA;

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

typedef struct tagDOUBLEITEM

{

      tagDOUBLEITEM     *Next;    // следующий узел в списке

      tagDOUBLEITEM     *Prev;    // предыдущий узел в списке

      LPUSERDATA        Data;     // пользовательский данные

      // конструктор по умолчанию

      tagDOUBLEITEM()

      {

            // обнуляем указатели

            Next = Prev = NULL;

            Data = NULL;

      }

      // деструктор по умолчанию

      ~tagDOUBLEITEM()

      {

            // если объект существует - удаляем его

            if ( Data != NULL )

            {

                  delete Data;

                  Data = NULL;

            }

      }

} DOUBLEITEM, *LPDOUBLEITEM;

// класс двусвязного списка

class CDoubleList

{

private:

      LPDOUBLEITEM      m_Root;           // начальный элемент списка

      Int               m_Count;          // количество элементов в списке

public:

      /// метод свойства Count

      int getCount() const throw();

public:

      /// конструктор по умолчанию

      CDoubleList();

      /// диструктор по умолчанию

      ~CDoubleList();

      /// добавление нового элемента в начало списка

      bool AddBegin( LPUSERDATA Item );

      /// добавление нового элемента в конец списка

      bool AddEnd( LPUSERDATA Item );

      /// добавление нового элемента в произвольную позицию

      bool Insert( LPUSERDATA Item, int Index );

      /// удаление элемента из любой позиции (по индексу)

      bool DeleteAt( int Index );

      /// удаление элемента из любой позиции (по элементу)

      bool DeleteAt( LPUSERDATA Item );

      /// удаление всего списка

      bool DeleteAll();

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

      bool Sort( bool Direction = true );

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

      int FindIndex( LPUSERDATA Item );

      /// оператор [] для индексного доступа к списку

      LPDOUBLEITEM operator []( int Index );

      /// вывод списка на экран

      virtual void Print();

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

      __declspec( property( get = getCount ) ) int Count;

};

#endif

Файл DOUBLELIST.CPP

Ниже приведен исходный код класса, который реализовывает двусвязный список.

#include "DoubleList.h"

// метод свойства

int CDoubleList::getCount() const throw()

{

      return m_Count;

}

// конструктор по умолчанию

CDoubleList::CDoubleList()

      :m_Count( 0 )

{

      // обнуляем адрес

      m_Root = NULL;

}

// деструктор по умолчанию

CDoubleList::~CDoubleList()

{

      // удаляем весь список

      DeleteAll();

}

// добавляем в начало списка

bool CDoubleList::AddBegin( LPUSERDATA Item )

{

      // результат

      bool result = false;

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

      LPDOUBLEITEM node = new DOUBLEITEM();

      // следующий узел

      node->Next = m_Root;         

      // если начала уже есть

      if ( m_Root != NULL ) m_Root->Prev = node;

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

      m_Root = node;                           

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

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

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

      m_Count++;

      return ( result = true );

}

// добавляем запись в конец

bool CDoubleList::AddEnd( LPUSERDATA Item )

{

      // результат

      bool result = false;

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