C C  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Структуры данных на C

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

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 5 темам.
Вопрос 1 из 25
Какова сложность вставки нового узла в начало односвязного списка, если известен указатель head?
CC17
node->next=*head; *head=node;
Вопрос 2 из 25
Почему при удалении узла удобно хранить указатель на указатель, ведущий к текущему узлу?
CC17
for(node **link=&head;*link;link=&(*link)->next){...}
Вопрос 3 из 25
Какой дефект есть в этом фрагменте удаления узлов?
CC17
free(cur);
cur=cur->next;
Вопрос 4 из 25
Как обнаружить цикл в списке, используя O(1) дополнительной памяти?
CC17
slow=slow->next; fast=fast->next->next;
Вопрос 5 из 25
Почему добавление в конец односвязного списка без сохранённого указателя на последний узел требует O(n) шагов?
Вопрос 6 из 25
Какое значение вернёт второй вызов pop после выполнения этого кода?
CC17
stack s={0};
push(&s,10); push(&s,20); push(&s,30);
(void)pop(&s);
printf("%d\n",pop(&s));
Вопрос 7 из 25
В каком порядке очередь возвращает элементы, если после enqueue(4), enqueue(7), enqueue(9) выполнить три dequeue?
Вопрос 8 из 25
Почему кольцевой буфер часто выгоднее связной очереди фиксированной ёмкости?
CC17
tail=(tail+1)%capacity;
Вопрос 9 из 25
Как корректно различать пустой и полный кольцевой буфер, если в обоих случаях head может совпасть с tail?
Вопрос 10 из 25
Какое предусловие нужно проверить до вычисления остатка в `next_index`?
CC17
size_t next_index(size_t tail, size_t capacity) {
    return (tail + 1) % capacity;
}
Вопрос 11 из 25
Что означает договорённость «контейнер владеет данными элементов»?
Вопрос 12 из 25
Список хранит `void *` и может содержать данные разных типов. Как задать их освобождение?
CC17
typedef void (*destroy_fn)(void*);
Вопрос 13 из 25
Что должен означать интерфейс `remove_take`, возвращающий указатель на данные удалённого узла?
Вопрос 14 из 25
Почему опасно надолго передавать наружу указатель на внутренний узел контейнера?
Вопрос 15 из 25
Что требуется для действительно глубокой копии обобщённого списка?
CC17
list *clone(const list *src, clone_fn c, destroy_fn d);
Вопрос 16 из 25
Какой вариант корректно уничтожает список, если контейнер владеет данными каждого узла?
CУничтожение владеющего списка
struct node {
    void *data;
    struct node *next;
};

void list_destroy(struct node *head, void (*destroy)(void *)) {
    /* выбрать тело */
}
Вопрос 17 из 25
Стоит ли разрешить функции destroy принимать NULL как пустой контейнер?
Вопрос 18 из 25
Почему простой цикл уничтожения непригоден для списка, в котором случайно образовался цикл?
CC17
while(n){ node *next=n->next; free(n); n=next; }
Вопрос 19 из 25
Конструктор списка не смог создать четвёртый узел. Что делать с уже созданными тремя?
Вопрос 20 из 25
В каком порядке безопаснее удалять узел двусвязного списка?
CC17
if(n->prev)n->prev->next=n->next; else head=n->next;
if(n->next)n->next->prev=n->prev; else tail=n->prev;
Вопрос 21 из 25
Какой инвариант полезно проверять у односвязного списка с сохранённым tail?
Вопрос 22 из 25
Какой санитайзер компилятора непосредственно обнаруживает обращение к уже освобождённому узлу списка?
CC17
struct node *next = node->next;
free(node);
return node->value; /* обращение после free */
Вопрос 23 из 25
Какое свойство удобно проверять при случайном тестировании очереди?
Вопрос 24 из 25
Чем полезна выгрузка повреждённой структуры в виде графа?
CПример DOT
digraph { n1 -> n2; n2 -> n3; }
Вопрос 25 из 25
Как сократить длинную случайную последовательность операций, воспроизводящую ошибку?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу