Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник с,с++.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
68 Кб
Скачать
☆

Урок 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++