Как пройти через связанный список несколько раз и устранить узлы? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь решить проблему Иосифа, используя связанный список - 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) узел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...