Conversation
src/lists_6/counting/cyclicList.c
Outdated
| printf("Killed sicarium of number %d\n", currSicarium->data); | ||
| toKillNumber = currSicarium->data; | ||
| currSicarium = currSicarium->next; | ||
| kill(list, toKillNumber); |
There was a problem hiding this comment.
Нет, так не пойдёт. Нужно воспользоваться тем, что список циклический, а не вычислять заранее индекс нужного элемента.
There was a problem hiding this comment.
Нужно замкнуть список в кольцо, а потом ходить по нему и на каждом k-м шаге убивать воина. А Вы сначала отдельно вычисляете индекс воина, которого нужно убить, а затем ищете его в списке.
Да ещё не по индексу, а по значению. А если будет несколько воинов с одинаковым значением?
There was a problem hiding this comment.
а смысл от войнов с одинаковым значением? их значение - их изначальный номер, их индекс. а иначе как запомнить, какой был номер у выжившего война?
There was a problem hiding this comment.
Конечно, в этой задаче смысла от воинов с одинаковым значением никакого. Просто, удалять элементы списка по значению, когда можно получить указатель -- не самая лучшая идея.
src/lists_6/counting/cyclicList.c
Outdated
| prevSicarium->next = currSicarium->next; | ||
|
|
||
| list->count--; | ||
| toKill = currSicarium; | ||
| currSicarium = currSicarium->next; | ||
|
|
||
| if (prevSicarium == list->tail) { | ||
| list->head = toKill->next; | ||
| } else if (toKill == list->tail) { | ||
| list->tail = prevSicarium; | ||
| } |
There was a problem hiding this comment.
Нет, всё ещё не то. Вы просто скопировали код из kill сюда. А надо сделать так: в цикле идти по списку (в явном виде, не просто увеличивать счётчик), и на нужном шаге удалять элемент. Подсказка: правильная реализация занимает строчек 5, без вызова каких-либо функций.
3c24bb1 to
4dd27df
Compare
| while (list->count > 1) { | ||
| k++; | ||
|
|
||
| if (k == m) { | ||
| toKill = list->head; | ||
|
|
||
| list->tail->next = list->head->next; | ||
|
|
||
| list->count--; | ||
| list->head = list->head->next; | ||
|
|
||
| free(toKill); | ||
|
|
||
| k = 0; | ||
| continue; | ||
| } | ||
| list->tail = list->head; | ||
| list->head = list->head->next; | ||
| } |
There was a problem hiding this comment.
Очень необычное решение. У Вас получилось, что сикарии не воспользовались считалочкой, а начали водить хоровод вокруг револьвера, который на каждом m-м шаге стреляет в одно и то же место, как в детской игре со стульчиками.
Пусть будет +1 балл за изобретательность
No description provided.