При необходимости, можно отсортировать элементы массива по возрастанию или убыванию. Для этого необходимо вызвать метод класса Sort и в качестве аргумента, в который можно передать TRUE, что будет соответствовать сортировке элементов списка по возрастанию или FALSE – для сортировки списка по убыванию.
Если возникает необходимость вывести всю информацию из списка – можно воспользоваться методом класса Print. Данный метод выводит на экран всю информацию из списка по каждому элементу последовательно. В данной реализации класса – вывод осуществляется в консольное окно. Метод Print является виртуальным методом и может быть переписан впоследствии при наследовании от данного класса.
Ниже представлен исходный код хидера, который реализует работу с двусвязным списком.
#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
Ниже приведен исходный код класса, который реализовывает двусвязный список.
#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;
// создаем новый узел
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.