- •Int z[n]; //Неверно!
- •Урок 10. Рекурсивные функции
- •Int z[3]; //Массив
- •Урок 26. Конструкторы и деструкторы
- •Урок 27. Классы и указатели
- •Урок 28. Практика: список - добавление элементов
- •Урок 29. Показ элементов списка
- •Урок 30. Ищем элемент в списке
- •Урок 32. Удаление элемента из списка
- •Урок 33. Функция с переменным числом параметров
- •Урок 31. Пара вспомогательных методов для списка
- •Урок 34. Считаем элементы в списке
- •Урок 35. Обмен соседних элементов в списке
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 37. Сортируем элементы списка
- •Урок 38. Сортировка с перегрузкой оператора
Урок 36. Получаем элемент списка по его номеру
Наш метод, который будет получать указатель на элемент списка по его номеру, будет называться GetAt. Добавьте его объявление в класс:
class CList
{
public:
...
// Взятие n-го элемента.
CData * GetAt(int n);
...
Реализация у него будет такая:
CData * CList::GetAt(int n)
{
// Указатель на очередные данные в списке.
CData * pCurr = m_pFirst;
// Если список пуст
// или элемента с таким номером просто нет,
// то возвращаем NULL.
if(pCurr == NULL || n>GetCount()-1)
{
return NULL;
}
// Добираемся до элемента с нужным номером.
for(int i=0; i<GetCount(); i++)
{
if(i==n)
{
return pCurr;
}
pCurr = pCurr->m_pNext;
}
return NULL;
}
Алгоритм тут прост и естественен - мы просто перебираем все элементы, начиная с первого. Как только добираемся до n-го, так и выходим. Перед этой несложной операцией мы убеждаемся, что элемент с таким номером существует вообще (если нет, то просто возвращяем NULL).
C/C++
Урок 36. Получаем элемент списка по его номеру
Наш метод, который будет получать указатель на элемент списка по его номеру, будет называться GetAt. Добавьте его объявление в класс:
class CList
{
public:
...
// Взятие n-го элемента.
CData * GetAt(int n);
...
Реализация у него будет такая:
CData * CList::GetAt(int n)
{
// Указатель на очередные данные в списке.
CData * pCurr = m_pFirst;
// Если список пуст
// или элемента с таким номером просто нет,
// то возвращаем NULL.
if(pCurr == NULL || n>GetCount()-1)
{
return NULL;
}
// Добираемся до элемента с нужным номером.
for(int i=0; i<GetCount(); i++)
{
if(i==n)
{
return pCurr;
}
pCurr = pCurr->m_pNext;
}
return NULL;
}
Алгоритм тут прост и естественен - мы просто перебираем все элементы, начиная с первого. Как только добираемся до n-го, так и выходим. Перед этой несложной операцией мы убеждаемся, что элемент с таким номером существует вообще (если нет, то просто возвращяем NULL).
C/C++
Урок 37. Сортируем элементы списка
Продолжим работу с нашим списком, начатую на 28-м уроке
Для сортировки элементов списка мы воспользуемся методом пузырьков. Алгоритм его приблизительно такой - просматриваем элементы нашего списка соседними парами от начала до конца. Т. е. сначала смотрим пару нулевого и первого элементов, потом первого и второго и т. п. В каждой паре при необходимости меняем элементы - если они стоят не в том порядке. Так доходим до конца списка. Если мы поменяли хотя бы одну пару, то повторяем все с начала - т. е. начинаем смотреть пары от начала и до конца. И так будем делать до тех пор, пока при очередном проходе мы ничего не поменяем - тогда список и окажеться отсортированным.
Приступаем к коду.
В класс CList добавим объявление метода Sort:
class CList
{
public:
...
// Сортировка.
void Sort();
...
Добавим, естественно, и реализацию для этого метода:
void CList::Sort()
{
bool b; // Меняли ли соседние элементы списка?
do
{
b = false; // пока ничего не меняли.
// Смотрим элементы до предпоследнего.
for (int i = 0; i<GetCount()-1; i++)
{
if (GetAt(i)->a > GetAt(i+1)->a)
{
Change(GetAt(i));
b = true;
}
}
}while (b);
}
С этим методом все.
C/C++
