История изменений
Исправление lefsha, (текущая версия) :
Я вообще не понимаю в чем проблема. Сам по себе указатель это НЕ владение объектом. Любой массив может иметь количество указателей равных числу элементов в нем. Но только при выделении памяти создается указатель, который как бы собственник всего массива.
Что именно мешает создать массив из указателей, где размещены все указатели из списка, каждый из которых хранит какой-то там объект. А в самом объекте прописать индекс этого указателя.
struct DLLNode {
int nextid;
int previd;
int value;
}
struct DoubleLinkedList {
DLLNode* nodes;
DoubleLinkedList(int size):size(){
links = malloc (size * sizeof(DLLNode*));
nodes = malloc (size * sizeof(DLLNode));
nodes[0].nextid = 1;
nodes[0].previd = size-1;
links[0] = &nodes[0];
for(int i=1; i<(size-1); ++i) {
nodes[i].nextid = i + 1;
nodes[i].previd = i - 1;
nodes[i].value = 0;
links[i] = &nodes[i];
}
nodes[size-1].nextid = 1;
nodes[size-1].previd = size - 2;
links[size-1] = &nodes[size-1];
~DoubleLinkedList(){
free(links);
free(nodes);
}
private
static DLLNode* links;
int size;
};
На самом деле links вообще не обязателен. Достаточно индекса.
Индекс хорош тем, что элементарно проверяется на границы допустимого. Адрес сам по себе не имеет четких границ.
P.S. Кстати вопрос. При попытке найти обычный динамический массив в RUST во первых выскакивает, что массив обязан быть с фиксированным во время компиляции числом элементов, что есть нонсенс само по себе. Но так же выдают вариант использования Вектора, в который надо добавлять значения по одному, вместо обычной адресовки к любому элементу. Это такая мода или какой в этом глубокий смысл? Язык в котором нет массивов переменной длины по поему не имеет право на существование. В нормальных языках есть многомерные массивы такого же поведения. К С тут претензий нет. Но к RUST точно есть. Это обязано быть частью языка, а не каким-то там crate-ом.
Исправление lefsha, :
Я вообще не понимаю в чем проблема. Сам по себе указатель это НЕ владение объектом. Любой массив может иметь количество указателей равных числу элементов в нем. Но только при выделении памяти создается указатель, который как бы собственник всего массива.
Что именно мешает создать массив из указателей, где размещены все указатели из списка, каждый из которых хранит какой-то там объект. А в самом объекте прописать индекс этого указателя.
struct DLLNode {
int nextid;
int previd;
int value;
}
struct DoubleLinkedList {
DLLNode* nodes;
DoubleLinkedList(int size):size(){
links = malloc (size * sizeof(DLLNode*));
nodes = malloc (size * sizeof(DLLNode));
nodes[0].nextid = 1;
nodes[0].previd = size-1;
links[0] = &nodes[0];
for(int i=1; i<(size-1); ++i) {
nodes[i].nextid = i + 1;
nodes[i].previd = i - 1;
nodes[i].value = 0;
links[i] = &nodes[i];
}
nodes[size-1].nextid = 1;
nodes[size-1].previd = size - 2;
links[size-1] = &nodes[size-1];
~DoubleLinkedList(){
free(links);
free(nodes);
}
private
static DLLNode* links;
int size;
};
На самом деле links вообще не обязателен. Достаточно индекса.
Индекс хорош тем, что элементарно проверяется на границы допустимого. Адрес сам по себе не имеет четких границ.
Исправление lefsha, :
Я вообще не понимаю в чем проблема. Сам по себе указатель это НЕ владение объектом. Любой массив может иметь количество указателей равных числу элементов в нем. Но только при выделении памяти создается указатель, который как бы собственник всего массива.
Что именно мешает создать массив из указателей, где размещены все указатели из списка, каждый из которых хранит какой-то там объект. А в самом объекте прописать индекс этого указателя.
struct DLLNode {
int nextid;
int previd;
int value;
}
struct DoubleLinkedList {
DLLNode* nodes;
DoubleLinkedList(int size):size(){
links = malloc (size * sizeof(DLLNode*));
nodes = malloc (size * sizeof(DLLNode));
nodes[0].nextid = 1;
nodes[0].previd = size-1;
links[0] = &nodes[0];
for(int i=1; i<(size-1); ++i) {
nodes[i].nextid = i + 1;
nodes[i].previd = i - 1;
nodes[i].value = 0;
links[i] = &nodes[i];
}
nodes[size-1].nextid = 1;
nodes[size-1].previd = size - 2;
links[size-1] = &nodes[size-1];
~DoubleLinkedList(int size):size(){
free(links);
free(nodes);
}
private
static DLLNode* links;
int size;
};
На самом деле links вообще не обязателен. Достаточно индекса.
Индекс хорош тем, что элементарно проверяется на границы допустимого. Адрес сам по себе не имеет четких границ.
Исправление lefsha, :
Я вообще не понимаю в чем проблема. Сам по себе указатель это НЕ владение объектом. Любой массив может иметь количество указателей равных числу элементов в нем. Но только при выделении памяти создается указатель, который как бы собственник всего массива.
Что именно мешает создать массив из указателей, где размещены все указатели из списка, каждый из которых хранит какой-то там объект. А в самом объекте прописать индекс этого указателя.
struct DLLNode {
int nextid;
int previd;
int value;
}
struct DoubleLinkedList {
DLLNode* nodes;
DoubleLinkedList(int size):size(){
links = malloc (size * sizeof(DLLNode*));
nodes = malloc (size * sizeof(DLLNode));
nodes[0].nextid = 1;
nodes[0].previd = size-1;
links[0] = &nodes[0];
for(int i=1; i<(size-1); ++i) {
nodes[i].nextid = i + 1;
nodes[i].previd = i - 1;
nodes[i].value = 0;
links[i] = &nodes[i];
}
nodes[size-1].nextid = 1;
nodes[size-1].previd = size - 2;
links[size-1] = &nodes[size-1];
~DoubleLinkedList(int size):size(){
free(links);
free(nodes);
}
private static DLLNode* links; int size; };
Исходная версия lefsha, :
Я вообще не понимаю в чем проблема. Сам по себе указатель это НЕ владение объектом. Любой массив может иметь количество указателей равных числу элементов в нем. Но только при выделении памяти создается указатель, который как бы собственник всего массива.
Что именно мешает создать массив из указателей, где размещены все указатели из списка, каждый из которых хранит какой-то там объект. А в самом объекте прописать индекс этого указателя.
struct DLLNode { int nextid; int previd; int value; }
struct DoubleLinkedList { DLLNode* nodes;
DoubleLinkedList(int size):size(){
links = malloc (size * sizeof(DLLNode*));
nodes = malloc (size * sizeof(DLLNode));
nodes[0].nextid = 1;
nodes[0].previd = size-1;
links[0] = &nodes[0];
for(int i=1; i<(size-1); ++i) {
nodes[i].nextid = i + 1;
nodes[i].previd = i - 1;
nodes[i].value = 0;
links[i] = &nodes[i];
}
nodes[size-1].nextid = 1;
nodes[size-1].previd = size - 2;
links[size-1] = &nodes[size-1];
~DoubleLinkedList(int size):size(){
free(links);
free(nodes);
}
private static DLLNode* links; int size; };