Связанные списки с векторами

-5

Я пытаюсь выполнить определенные операции через связанные списки на векторах.

Нам был задан вектор типа структуры

typedef struct{
int *array; // a pointer to vector storage
int size; // the current number of elements in the vector
int cap; // the current capacity of the vector;
int init_cap; // the initial capacity the vector was initialised with.
} vector;

Теперь я хочу сделать функцию, которая принимает указатель на векторную структуру и инициализирует ее с заданной емкостью. Все поля должны быть инициализированы. Я хочу сделать это, используя связанный список.

Вот мой код

#include <iostream>
using namespace std;

typedef struct node {
int *array; // a pointer to the vector storage
int size; // the current number of elements in the vector
int cap; // the current capacity of the vector
int init_cap; // the initial capacity the vector was initialised with
node *next;

} vector;

node *head = NULL;

Могу ли я создавать узлы из векторной структуры, как я пытался в коде, написанном выше?

void vector_init(vector *v, int capacity){

//initialising the vector with the given capacity
v->size = capacity;
v->cap = capacity;
v->init_cap = capacity;

//linked list with nodes created and values initialised

node *temp, temp2;
temp = head;
temp = new node;
temp->size = capacity;
temp->cap = capacity;
temp->init_cap = capacity;

temp->next = temp2
temp2 = new node;
temp2->size = capacity;
temp2->cap = capacity;
temp2->init_cap = capacity;
temp2->next = NULL;
}

Я сделал связанный список и правильно инициализировал значения? Если мы не создадим временные точки temp и temp2 и просто используем v-> размер и т.д., Чтобы инициализировать поля, это сделает связанный список?

спросил(а) 2021-01-25T11:28:00+03:00 4 месяца, 4 недели назад
1
Решение
63

У вас много проблем с кодом.

    Не используйте вектор имен - существует структура, называемая std :: vector, и ее легко путать. Если вы хотите инициализировать значения структуры, не создавайте для этого внешнюю, отдельную функцию - это не c++ 'ish. Создайте конструктор struct, инициализируя все значения. Вы не инициализируете переменную массива в любом месте вашего кода. Вы должны выделить место для него в зависимости от емкости, указанной в конструкторе. Не используйте имя "массив" для переменной. В c++ есть структура, называемая std :: array, и может быть запутанной. Ваша реализация меня очень мало интересует. Сейчас у вас есть связанный список массивов; если вы хотите функционально заменить массив ints на связанный список ints, каждый узел должен содержать одно значение int. Если по какой-то причине вы захотите придерживаться этой реализации, вам также потребуется какая-то функция обновления, которая автоматически обновляла переменные размера и кепки при добавлении или удалении элементов из массива. В противном случае вы обязательно забудете об этом, и у вас будет беспорядок в вашей структуре. Сделайте эту функцию частью структуры - она не должна быть внешней. Этот узел структуры typedef не имеет смысла даже после изменения вектора слова на что-то еще - вы все равно не используете его в своем коде. Вы используете одно и то же имя для двух разных структур; вектор сначала определяется как имеющий 4 поля, а в следующих строках - 5 полей.

Технически да, это связанный список, но ваша функция vector_init() не работает должным образом. Помимо того, что я написал выше:

    Вы должны избегать того, чтобы функции зависели от глобальной переменной, в данном случае головы. Он может быть передан как параметр. Эти две строки:

temp = head;

temp = new node;

не имеют смысла. Первая делает переменную точку темпа головкой; второй говорит temp, чтобы начать указывать на новую переменную, поскольку вы используете оператор new, который выделяет пространство и возвращает указатель на вновь созданную переменную. В результате вы не работаете с переменной головкой, когда выполняете дальнейшие операции, но с другой переменной, которая будет потеряна после того, как указатель temp окажется недействительным.

    Вам не нужны переменные temp и temp2. Они только раздувают код.

    Эти две строки:

temp-> next = temp2;

temp2 = new node;

должен переключать места, так как теперь вы назначаете указатель, который еще не был инициализирован.

    После написания всего этого я понял, что функция в целом неверна. По какой-то причине вы сначала работаете над параметром v, а затем делаете что-то не связанное с ним.

Кроме того, ваш инструктор просто не прав, говоря, что вы можете решать все типы проблем с использованием связанных списков. Он может решить некоторые проблемы в определенных ситуациях или создать новые проблемы в зависимости от контекста.

Я не хочу быть грубым, но, похоже, что-то принципиально неправильно с концепцией заданной вами задачи. Наверное, кто-то действительно не думал об этом.

ответил(а) 2021-01-25T11:28:00+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема