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