- •Int z[n]; //Неверно!
- •Урок 10. Рекурсивные функции
- •Int z[3]; //Массив
- •Урок 26. Конструкторы и деструкторы
- •Урок 27. Классы и указатели
- •Урок 28. Практика: список - добавление элементов
- •Урок 29. Показ элементов списка
- •Урок 30. Ищем элемент в списке
- •Урок 32. Удаление элемента из списка
- •Урок 33. Функция с переменным числом параметров
- •Урок 31. Пара вспомогательных методов для списка
- •Урок 34. Считаем элементы в списке
- •Урок 35. Обмен соседних элементов в списке
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 37. Сортируем элементы списка
- •Урок 38. Сортировка с перегрузкой оператора
Урок 29. Показ элементов списка
Напишем метод класса CList, который будет выводить на консоль все элементы нашего списка. Для этого воспользуемся циклом while, так как мы не знаем, сколько всего элементов нам надо вывести.
Добавьте в класс CList объявление метода ShowAll:
class CList
{
public:
...
// Показ всех элементов списка.
void ShowAll();
};
Реализация у метода будет такая:
void CList::ShowAll()
{
// Указатель на очередные данные в списке.
CData * pCurr = m_pFirst;
// Если список пуст, то это и напишем.
if(pCurr == NULL)
{
cout<<"List is empty.\n";
}
// Пока есть следующий элемент списка.
do{
// Выводим на консоль очередной элемент.
cout<<"a="<<pCurr->a<<", b="<<pCurr->b<<"\n";
// Переводим pCurr на следующий элемент в списке.
// Если он равен NULL, то заканчиваем.
}while((pCurr = pCurr->m_pNext)!=NULL);
}
Теперь можно испытать наш класс списка в работе. Например, вот так:
void main(){
CList list;
CData *pData;
int a, b;
for(int i = 0; i<3; i++)
{
cout<<"Enter a:";
cin>>a;
cout<<"\n";
cout<<"Enter b:";
cin>>b;
cout<<"\n";
pData = new CData(a, b);
list.Add(pData);
list.ShowAll();
}
}
Теперь можно запускать программу. Три раза мы будем вводить данные a и b для каждого нового элемента, добавляемого в список, и каждый раз после этого весь список будет выводиться на экран.
C/C++
Урок 30. Ищем элемент в списке
Продолжаем писать наш класс. В этом уроке мы с вами напишем метод FindData нашего класса, который находит некоторый элемент в нашем списке. Элемент будет задаваться параметрами - так как в каждом элементе списка два параметра (a и b), то и у метода FindData будет два параметра.
Вот тело метода:
CData * CList::FindData(int a, int b)
{
// Указатель на очередные данные в списке.
CData * pCurr = m_pFirst;
// Если список пуст, то возвращаем NULL.
if(pCurr == NULL)
{
return NULL;
}
// Обходим все элементы списка.
do{
// Если нашли искомый элемент, то его и возвращаем.
if(pCurr->a == a && pCurr->b == b)
{
return pCurr;
}
// Переводим pCurr на следующий элемент в списке.
// Если он равен NULL, то заканчиваем.
}while((pCurr = pCurr->m_pNext)!=NULL);
// Если ничего не нашли, то возвращаем NULL.
return NULL;
}
Алгоритм метода ясен из комментариев. Если искомый элемент найден, то возвращается указатель на него, если нет, то возвращается нулевой указатель NULL.
Дополнить код в функции main для проверки можно, например, так:
void main(){
...
// Есть ли в списке элемент с a = 22 ? b = 2?
if(list.FindData(22, 2) == NULL)
{
cout<<"Nothing\n";
}
else
{
cout<<"Find\n";
}
}
Если мы при запуске программы зададим элемемент нашего списка с a равным 22 и b равным 2, то программа выдаст на консоль "Find", в противном случае - "Nothing".
C/C++
