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;
}
}
Ниже представлен исходный код основной программы.
#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:
{
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.