Вывод людей из круга - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста! Даны натуральные n, m. Предпологается, что n человек встают в круг и получают номера, считая против часовой стрелки, 1, 2, ..., n. Затем, начиная c первого, также против часовой стрелки отсчитывается m-й человек (поскольку люди стоят по кругу, то за n-м человеком стоит первый ). Этот человек выходит из круга, после чего, начиная со следующего, снова отсчитывается m-й человек и так до тех пор, пока из всего круга не останется один человек. Определить его номер. Для решения этой задачи полезен список, соединяющий в кольцо так, как показано на рис. 28.

Решение задачи: «Вывод людей из круга»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
struct Node
{
    int   num;
    Node* next;
};
 
int main(int argc, char* argv[])
{
    int n,m,i,j;
    Node *Curr,*Prev,*Start;
    printf("n=");
    scanf("%d",&n);
    printf("m=");
    scanf("%d",&m);
    for (i=1; i<=n; i++)
    {
        Curr=(Node*) malloc(sizeof(Node));
                Curr->num=i;
        if (i == 1) 
            Start=Curr;
        else 
        {
            Prev->next=Curr;
            if (i == n) Curr->next=Start;
        }
        Prev=Curr;
    }
    Curr=Start;
    while (1)
        {
            printf("%d ",Curr->num);
            Curr=Curr->next;
            if (Curr == Start)
            {
                printf("\n");
                break;
            }
        }
    Curr=Start;
    for (i=1; i< n; i++)
    {
        for (j=1; j<=m; j++)
        {
            Prev=Curr;
            Curr=Curr->next;
        }
        Prev->next=Curr->next;
        free(Curr);
        Start=Prev;
        Curr=Prev;
        while (1)
        {
            printf("%d ",Curr->num);
            Curr=Curr->next;
            if (Curr == Start)
            {
                printf("\n");
                break;
            }
        }
    }
    free(Curr);
 
    return 0;
}

Объяснение кода листинга программы

В этом коде используется структура данных очередь (или круг), в которой все элементы кроме первого имеют ссылку на предыдущий элемент. Код начинается с создания узла (структуры данных) для числа n, а затем добавляет остальные числа в круг, используя алгоритм добавить в круг. Затем он выводит все числа в круге, используя алгоритм вывести круг. Затем код повторяет этот процесс для каждого числа в диапазоне от 1 до n-1, чтобы создать оставшиеся узлы, используя алгоритм добавить в круг и вывести круг. В конце кода все узлы освобождаются, и возвращается 0, что означает успешное выполнение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы