- •Int z[n]; //Неверно!
- •Урок 10. Рекурсивные функции
- •Int z[3]; //Массив
- •Урок 26. Конструкторы и деструкторы
- •Урок 27. Классы и указатели
- •Урок 28. Практика: список - добавление элементов
- •Урок 29. Показ элементов списка
- •Урок 30. Ищем элемент в списке
- •Урок 31. Пара вспомогательных методов для списка
- •Урок 32. Удаление элемента из списка
- •Урок 33. Функция с переменным числом параметров
- •Урок 34. Считаем элементы в списке
- •Урок 35. Обмен соседних элементов в списке
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 37. Сортируем элементы списка
- •Урок 38. Сортировка с перегрузкой оператора
Урок 34. Считаем элементы в списке
На этом и следующем уроках мы добавим еще пару вспомогательных методов для нашего списка - которыми мы воспользуемся на следующем уроке.
Это будут методы GetCount() - он возвратит общее число элементов нашего списка и Change(CData * p) - этот метод поменяет 2 элемента списка - а именно тот, который мы передадим в него в качестве параметра и следующий за ним.
Сначала добавьте объявление метода GetCount в класс:
class CList
{
public:
...
// Общее число элементов.
int GetCount();
...
Напишите реализацию этого метода:
int CList::GetCount()
{
// Указатель на очередные данные в списке.
CData * pCurr = m_pFirst;
// Если список пуст, то возвращаем 0.
if(pCurr == NULL)
{
return 0;
}
int count = 1; //Число элементов в списке.
// Пока есть следующий элемент списка.
while(pCurr->m_pNext!=NULL)
{
// Переходим на следуюющего.
pCurr = pCurr->m_pNext;
// Увеличиваем счетчик.
count++;
}
return count;
}
Реализация тут похожая на реализации других методов - мы пробегаем до конца списка, по дороге подсчитывая число элементов.
C/C++
Урок 35. Обмен соседних элементов в списке
Продолжаем работать с нашим класом списка.
Этот урок мы посвятим еще одному вспомогательному методу для нашего класса списка - а именно методу, меняющему два соседних элемента. Какие элементы будут меняться - это будет определяться одним параметром, который и будет задавать пару для обмена - некий элемент и следующий за ним.
Добавьте в класс метод с подходящим для этой цели названием - Change:
class CList
{
public:
...
// Обмен элемента p и следующего.
void Change(CData * p);
...
А вот реализация для метода Change(CData * p):
void CList::Change(CData *p)
{
// Если следующего элемента просто нет.
if (p->m_pNext==NULL)
{
// то выходим.
return;
}
// Переменная для предыдущего элемента.
CData * pPrev;
if (p==m_pFirst)
{
// Если наш элемент - первый.
// Обмен указателей через вспомогательную переменную.
pPrev = m_pFirst;
CData * pAux = m_pFirst;
CData * pNext = p->m_pNext;
m_pFirst = p->m_pNext;
p->m_pNext = p->m_pNext->m_pNext;
pNext->m_pNext = pAux;
}
else
{
// Если наш элемент - не первый.
// Обмен указателей через вспомогательную переменную.
pPrev = GetPrev(p);
CData * pAux = pPrev->m_pNext;
CData * pNext = p->m_pNext;
pPrev->m_pNext = p->m_pNext;
p->m_pNext = p->m_pNext->m_pNext;
pNext->m_pNext = pAux;
}
}
Метод обмена достаточно прост - мы меняем значения указателей в полях m_pNext элементво нашего списка. Это мы делаем посредством вспомогательных переменных. При этом у нашего алгоритма 2 части - одна для случая, когда наш элемент первый в списке и другая - когда он в списке не первый.
C/C++
