Я пытаюсь решить проблему Иосифа, используя связанный список - https://en.wikipedia.org/wiki/Josephus_problem. В основном у нас есть определенное количество людей - скажем, 6 с k, равным 3. Я начинаю считать с начала линии / кругалюдей, и когда к достигается, этот человек устраняется. Затем я перехожу к следующему человеку, и k сбрасывается и увеличивается до следующего человека. Мы делаем это, пока не останется один человек. Обратите внимание - при подсчете людей мы пропускаем людей, которые уже были устранены. Таким образом, в моем примере 6 человек и k = 3, первым человеком, который будет удален, будет человек 3 (или в терминах массива, индекс 2), а последним человеком, который выживет, будет человек 1 (или индекс = 0).
Я уже решил эту проблему, используя массив и циклы. Однако теперь я хочу попытаться решить, используя связанный список, поскольку это то, что я изучаю. Я уже создал свой связанный список. Я думаю, что логика здесь та же, считать через узлы связанного списка и исключать узел при достижении k и так далее. Моя проблема в том, что я не знаю, как пройти через связанный список несколько раз и как успешно устранить, пока не останется один (узел).
Во-первых, создание связного списка с указанным количеством людей (valn):
int counter = 0;
ListNode * head = NULL;
head = malloc(sizeof(ListNode));
head -> value = counter;
ListNode *current = &head;
while ( valn - 1 > counter)
{
current -> next = malloc(sizeof*(current -> next));
current = current -> next;
current -> value = counter;
current -> next = NULL;
counter++;
}
Голова затем возвращается к основному (который уже предоставлен, поэтому я уверен, что это правильно)
Затем у меня есть функция, которая должна считать через связанныйсоставить список и выяснить, какой из них удалить.
Это то, что я имею до сих пор (с valk, являющимся числом, которое нужно исключить), head и valkn передаются в эту функцию (которая является недействительной):
int counter = 0;
ListNode * p = head;
while ( p != NULL)
{
if (counter == valk)
{
ListNode * todelete = p;
printListNode (todelete); // Print function that was already provided (already correct) - basically print the value of the node to be eliminated.
deleteNode(head,todelete); // passed on to another function to delete - not sure how to delete yet
counter = 0;
}
p = p -> next;
counter++;
}
Файл заголовка (все соответствующие библиотеки включены. Файл заголовка также был указан):
typedef struct node {
int value;
struct node * next;
} ListNode;
void printListNode(ListNode * head);
ListNode * createList(int valn);
void eliminate(ListNode * head, int valk);
ListNode * deleteNode(ListNode * head, ListNode * todelete);
Ожидаемые результаты такие же, как описано выше, если мои входные данные равны 6 и 3, я перехожусвязанный список, пока не останется 1-й (со значением 0) узел.