Как вы реализуете связанный список в массиве?
Вот возможный подход (с использованием C ++) : ваш узел будет состоять из индексов для следующих и предыдущих элементов в списке :
struct Link
{
// additional data
int next;
int prev;
};
где next
и prev
будут содержать индексы массива, хранящего Link
s.
Link** head; // = new Link*[initial_size];
int first; // -1 initially (analogue of nullptr)
int last; // index of the last element in the array: head
дополнительно должен быть механизм учета доступных элементов в массиве, более наивная реализация может быть:
bool* available; // = new bool[initial_size]; // all initialized to true
вам потребуются функции для получения индекса из bool available
(указывающего на отсутствие узла в индексе, i
в head
, где элемент available
имеет значение true
). Например:
int get_available_index()
{
for (int i = 0; i < initial_size; ++i)
{
if (available[i] == true)
{
available[i] == false;
return i;
}
}
// indicate / throw list full / resize???
}
Вот как puch_back()
может выглядеть:
void push_back(Link** head, Link* new_link)
{
// chech pointer validity
int index = get_available_index();
// probably using: placement new(), to construct a node in that location
// new(head + index) new_link;? or just
head[index] = new_link;
if (last != -1) // list not empty
{
head[last]->next = index;
head[index]->prev = (last - head[0]); // gives you the index of the last node
}
else
{
first = index;
head[index]->prev = -1;
}
last = index;
head[index]->next = -1;
}
Кроме того, должна быть функция, обратная к get_available_index()
, в которой элемент available[i]
имеет значение true
(а объект уничтожен (head + i)->~Link();
?)
Может ли это быть эффективно сделано с учетом того, что элементы должны быть удалены и вставлены из списка - предположительно, требующих идентификации свободных элементов в массиве?
Насколько я понимаю, будет фрагментация, отраженная в значениях, хранящихся в массиве bool
, которые будут влиять только на время, необходимое для хранения нового узла.