Я боролся с этой проблемой в течение нескольких часов.
У меня есть реализация двусвязного списка, которая не требует динамического выделения памяти.
Вот метод вставки. Он вставляет elem
прямо перед before
. У struct list
есть два члена, struct list_elem *next
и struct list_elem *prev
. list_elem
- это структура, которая содержит некоторые данные. Обратите внимание, что реализация этого списка верна. Проблема в том, как я это использую. Пожалуйста, продолжайте читать.
void list_insert(struct list_elem *before, struct list_elem *elem) {
/* "before" has to be an interior node or tail node to be able to insert "before" it */
assert (is_interior(before) || is_tail(before));
assert (elem != NULL);
elem->prev = before->prev;
elem->next = before;
before->prev->next = elem;
before-> = elem;
}
Способ инициализации этого списка следующий:
void list_init(struct list *list) {
assert(list != NULL);
list->head.prev = NULL;
list->head.next = &list->tail;
list->tail.prev = &list->head;
list->tail.next = NULL;
}
Мой основной класс выполняет следующее:
struct list some_list;
static struct list_elem head;
some_list.head = head;
static struct list_elem tail;
some_list.tail = tail.
list_init(&some_list);
Это в основном создает два статических list_elem
structs
, head
и tail
. И передает его в функцию инициализации, которая соединит их вместе.
Теперь, чтобы создать элемент, я делаю следующее - вот что я делаю неправильно
struct list_elem element_struct;
/* Initialize element_struct members here */
struct list_elem *data = &element_struct;
list_insert( list_begin(some_list), data);
Теперь это работает, чтобы вставить один элемент. Поскольку some_list.head
будет указывать на data
, что будет указывать на some_list.tail
. Моя проблема в том, что я делаю это в цикле. Таким образом, как любой список, он будет вводить несколько данных там. Я либо получаю segfault
, либо какую-то другую ошибку, в которой говорится, что мой элемент не является внутренним или хвостовым узлом (из-за assert
), поскольку на каждой итерации цикла структура данных element_struct
будет повторно инициализирована. (list_elem
содержит указатели друг на друга).
Итак, мой вопрос, как бы я сохранил вставленные узлы? В списке не предполагается использовать какое-либо динамическое распределение. В таком случае, буду ли я динамически распределять свои list_elem
структуры и передавать динамически размещенный элемент в список?
Если так, как я могу динамически распределить структуру?