- •Министерство образования и науки рф
- •История ооп
- •Основные приемы, используемые в работе
- •Описание основных функций программы
- •Шаблон класса
- •Структура элемента списка
- •Функция простого добавления элемента в список
- •Функция сортировки элементов
- •Функция вывода массива указателей и списков на экран
- •Функция добавления элемента по позиции
- •Функция удаления элемента с заданной позиции
- •Реализация выполненной работы
- •Заключение
Функция удаления элемента с заданной позиции
В данной функции пользователь вводит позицию, с которой он хочет удалить элемент.
|
template <class T> void Array<T>::DelElem(int position) { int ALL = MaxCount*ArrSize; if (position>ALL || position<0) { cout<<"Нет элемента в этой позиции"<<endl; system("pause"); return; } int index = 0; while (position>MaxCount) { index++; position-=MaxCount; } if (IsListFull(index) && position==MaxCount) { int curr=0; ListElem<T> *cur=Arr[index]; if (cur->pNext!=NULL) { cur=cur->pNext; } ListElem<T> *pcur=0; for (cur, pcur=Arr[index]; cur->pNext!=NULL;) { curr++; cur=cur->pNext; pcur=pcur->pNext; } if (cur->pNext==NULL) { delete []cur->objects; delete cur; pcur->pNext=NULL; CurSize--; } } else if (IsListFull(index) && position<MaxCount) { ListElem<T>*pcur=0; ListElem<T>*cur=0; ListElem<T>*temp=0; int p=0; pcur=cur=Arr[index]; for(cur;p!=position-1;p++) cur=cur->pNext; p=0; for(pcur;p!=position-2;p++) pcur=pcur->pNext; temp=cur; pcur->pNext=cur->pNext; temp->pNext=NULL; delete []temp->objects; delete temp; CurSize--; } else if (position==1) { ListElem<T>*cur=Arr[index]; ListElem<T>*pcur=Arr[index]; ListElem<T>*temp=Arr[index]; temp=temp->pNext; pcur->pNext=cur->pNext->pNext; temp->pNext=NULL; delete []temp->objects; delete temp; CurSize--; } else { ListElem<T>*cur=Arr[index]; ListElem<T>*pcur=Arr[index]; int count=0; for (cur=cur->pNext, pcur; count<position; count++) { if (cur==NULL) cur=Arr[index++]; if (pcur==NULL) pcur=Arr[index]; cur=cur->pNext; pcur=pcur->pNext; } if (cur->pNext!=NULL) { temp=cur; pcur->pNext=cur->pNext; temp->pNext=NULL; delete []temp->objects; delete temp; CurSize--; } } } |
Реализация выполненной работы
Создадим изначально список с 2 ячейками массива указателей и, максимальной длиной списков 3. Добавим 8 элементов, чтобы гарантировано было переполнение массива. Пользователь вводит количество элементов и заполняет массив нужными ему элементами. В самом простом случае элементами будут числа от 1 до 9.

Рис. 5.2. Добавление элементов
И, видим, что всё корректно заполнилось, и выделилась новая ячейка памяти, для записи ещё трех элементов. Далее элементы выводятся на экран.

Рис. 5.3. Вывод полученного списка
Далее, усложним задачу, чтобы показать функцию сортировки элементов списка. Введем 9 элементов, но в каждом массиве будет разное количество данных. Первоначально неотсортированные данные показаны на следующем рисунке.

Рис. 5.4. Ввод элементов для сортировки
И, наконец, выведем полученный результат на экран, чтобы удостовериться в корректной сортировке элементов.

Рис. 5.5. Вывод отсортированных элементов списка
Далее протестируем функцию удаления элементов из нашего списка. Введем стандартный простой список, от 1 до 6 и удалим 2 элемента. В результате получился вот этот список.

Рис. 5.6. Удаление элементов из списка
И, наконец, функция добавления элементов в произвольное место в списке. Опять зададим список, но теперь добавим в него элементы по позициям. Вводим в консоль элементы, как обычно, с 1 до 6. Но, с помощью функций добавления в текущую позицию, пусть у нас должен будет вывестись список «1,3,2,4,6,5».

Рис. 5.7. Нарушение упорядоченности
Как и следовало ожидать, последовательность нарушилась, поскольку, во время добавления элементов, использовались функции обычной вставки, вперемешку с функциями вставки в конкретную позицию. В данном случае, в позиции 1, но это незаметно, а вот добавление элементов 3 и 6 в соответственные позиции 2 и 5, уже видимо нарушает порядок.
