Opened 5 years ago

Closed 5 years ago

#249 closed ожидается проверка (задача сдана)

WW #3

Reported by: chistyakova.polina Owned by: Дмитрий Лапшин (lapshin)
Component: WW_intrusive_list Version:
Keywords: Cc:

Description

Не смогла... До последнего пыталась разобраться, но что-то не вышло... Можешь посмотреть, пожалуйста, что именно тут не так?

Change History (1)

comment:1 Changed 5 years ago by Дмитрий Лапшин (lapshin)

Resolution: задача сдана
Status: assignedclosed

Ну поехали.

  1. init_list: ты решила сделать фиктивный элемент. Похвально, но выделять его на куче лишнее. Раз он всегда в списке нужен, пусть head будет не указателем, а значением.
  2. add_node: а всё правильно)
  3. remove_node: у тебя же фиктивный элемент, какой if (list->head != node)?
  4. Там же: free. Не ты завела этот указатель — не тебе его и удалять. Тем более node указывает внутрь структуры, которая является элементом списка: говорят, что список не владеет своими значениями (не он управляет их жизнью, потому что… не может).
  5. get_length: Здесь и далее: element != element->next что проверяет? Мне кажется что-то очень редкое, типа следующий элемент есть, но он мы сами… В твоей реализации следующий элемент всегда есть, но бежать надо до фиктивного элемента: список зациклен. Твой цикл должен быть, например:
    for (
        struct intrusive_node *element = list->head->next; // начинаем с первого элемента ­— если он есть, то сразу за фиктивным
        element != list->head; // если пришли в фиктивный значит всё
        element = element->next`
    ) { … }
    
  6. add_point: что происходит?
    1. malloc бы на результат проверить…
    2. Так, фатальный стоп. У тебя после первого выделения памяти в куче лежит структура struct point. В ней есть поле struct node. Ты именно его и кладёшь в список. Зачем выделять второй? От того, что ты одну структуру присвоишь в другую, адрес-то и где она живёт не сменится!
    3. Правильно было бы написать add_node(list, &newPoint->node); (взяли адрес на поле структурки с новой точкой, её ввязали в список).
  7. remove_point:
    1. element указывает внутрь point, point ты удалила, дальше обращаешься к element->next, оооооой. Надо бы нежнее:
      for (
          struct intrusive_node *element = list->head->next;
          element != list->head;
          /* специально ничего */
      ) {
          struct point *item = container_of(…);
          if (item->x == x && item->y == y) {
              element = element->next; // специально сейчас! потом будет поздно!
              remove_node(list, &item->node);
              free(item);
          } else {
              element = element->next;
          }
      }
      
  8. Дальше аналогично.
  9. Ну и в main можно было без выделения памяти под буфер.

А дальше-то всё в целом мудро.

Стиль:

  1. Инфиксные операторы с пробелами! a < b, x = y, 3 != 4. Исключение стрелочка, потому что она скорее точка, чем оператор вычисления.

Вердикт:

  1. Список написан весьма сносно.
  2. Список точек написан весьма плохо.
  3. Стиль терпим.

4/12 тут есть. Удачи в будущих баталиях.

Note: See TracTickets for help on using tickets.