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

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