Компьютеры
и программирование

РЕАЛИЗАЦИЯ ЦИКЛИЧЕСКОГО ОДНОНАПРАВЛЕННОГО СПИСКА ПРИ ПОМОЩИ ДВУХ МАССИВОВ

Циклический однонаправленный список: адрес первого элемента списка хранится в специальной переменной v, называемой внешним указателем списка или указателем на первый элемент. Указатель последнего элемента списка указывает на его начало, именно поэтому список является циклическим или кольцевым.

Список организован при помощи двух согласованных массивов: массива данных и массива адресов, т. е. значений индексов элементов. В массиве данных размещены значения данных так, что остаются неинициализированные элементы массива, они нужны для дополнения массива новыми элементами (вставки элементов). В массиве адресов каждое значение указывает на следующий элемент массива.

Обход списка (вывод на экран значений элементов списка):

Код C++

count = 0; t = v; while ((t != -1) && (count != n)) { cout << setw(3) << info[t] << " " << pt[t] << " " << t << endl; t = pt[t]; count++; }

Удаление пятого по порядку элемента списка:

Сводится к общей задаче удаления из списка элемента, следующего за элементом с адресом m. В данном случае m = 3. Поэтому:

Код C++

pt[3] = pt[pt[3]];

Добавление в список после третьего элемента трёх новых элементов

Вставка элемента x в список после элемента с адресом k в общем виде:

Код C++

info[n-1] = x; pt[n-1] = pt[k]; pt[k] = n - 1;

Поскольку значения массива адресов при такой вставке меняются, следует при вставке нескольких элементов учитывать, каким стало значение элемента массива адресов, за которым выполняется следующая вставка. Поэтому:

Код C++

info[n-1] = 1908; pt[n-1] = pt[2]; pt[2] = n - 1; info[n-2] = 1910; pt[n-2] = pt[n - 1]; pt[n - 1] = n - 2; info[n-3] = 1913; pt[n-3] = pt[n - 2]; pt[n - 2] = n - 3;

И, наконец полный текст программы, реализующей циклический однонаправленный список при помощи двух массивов и операции со списком:

Код C++

#include <iostream> #include <stdlib.h> #include <iomanip> using namespace std; int main() { const int n = 10; int info[n] = {1812, 1825, 1905, 1917, 1941, 1956}; int pt[n] = {1, 2, 3, 4, 5, 0}; int v = 0; int count = 0; int t; t = v; while ((t != -1) && (count != 6)) { cout << setw(3) << info[t] << " " << pt[t] << " " << t << endl; t = pt[t]; count++; } cout << endl; pt[3] = pt[pt[3]]; count = 0; t = v; while ((t != -1) && (count != 5)) { cout << setw(3) << info[t] << " " << pt[t] << " " << t << endl; t = pt[t]; count++; } info[n-1] = 1908; pt[n-1] = pt[2]; pt[2] = n - 1; info[n-2] = 1910; pt[n-2] = pt[n - 1]; pt[n - 1] = n - 2; info[n-3] = 1913; pt[n-3] = pt[n - 2]; pt[n - 2] = n - 3; count = 0; t = v; cout << endl; while ((t != -1) && (count != 8)) { cout << setw(3) << info[t] << " " << pt[t] << " " << t << endl; t = pt[t]; count++; } return 0; }

Весь блок Программирование C++

К началу страницы

Поделиться с друзьями