Разреженным называется массив, в котором не все элементы фактически используются, при этом размер массива очень большой, возможно даже превышает размер доступной памяти. Разреженные массивы можно реализовать различными способами. Одним из наиболее простых методов реализации разреженным массивов является использование связного списка. Узлы списка содержат индекс и значение элемента. Индексация осуществляется путем последовательного поиска узла, содержащего заданный индекс.
// Параметризованный класс разреженного массива,
// реализованный на основе связного списка:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <assert.h>
using namespace std;
// Класс, определяющий один элемент, хранящийся в разреженном массиве:
template <class Type> class SparseList;
template <class Type> class SparseOb
{
friend class SparseList<Type>;
// Обратите внимание на то, что класс SparseList предварительно объявлен
long index; // индекс элемента массива
SparseOb<Type> *next; // указатель на следующий узел
SparseOb<Type> *prior; // указатель на предыдущий объект
SparseOb() { info = 0; index = -1; next = prior = NULL;}
// конструктор
public:
Type info; // элемент данных
};
// Класс списка:
template <class Type>
class SparseList
{
SparseOb<Type> *start, *end; // указатели на начало и конец списка
public:
SparseList() {start = end = NULL;}
~SparseList();
SparseOb<Type> * store(long ix, Type c); // добавление элемента
void remove(long ix); // удаление элемента
// возвращение указателя на элемент по заданному индексу: