Luo Gu ||ジョセフの問題を解決するためのC言語線形テーブル

その日の1文、最も貴重なあなたへ:さまざまな環境に適応することを学び、環境とともに変化するかどうかによって、どのような生活を始めるかが決まります。

タイトルは
、最初に数えた人から始めて、mまで数えた人がリストされ、次の人が再び1から数え始め、mまで数えた人が円から外れる、というように、円内のn人を表します。すべての人がサークルから外れるまで、サークルから外れた人の数を順番に出力してください。

入力フォーマット
2つの整数n、mを入力します

出力形式
n個の整数の行を出力し、円内の各人の数を順番に出力します。

入力および出力サンプル
入力

103
出力

3 6 9 2 7 1 8 5 10 4

ソースコード:


#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    
    
    int data;
    struct Node *next;
}ListNode;

typedef ListNode *LinkList;

LinkList InitList (int n,LinkList L);
LinkList ListDelete(int n,int m,LinkList L);

int main() {
    
    
    LinkList L;
    int n,m;
    scanf("%d %d",&n, &m);
    L=InitList(n,L);
    L=ListDelete(n,m,L);
    //return 0;
}

LinkList InitList (int n,LinkList L) {
    
    
    ListNode *p, *q;
    int i;
    L = (ListNode *) malloc(sizeof(ListNode));
    q=L;//q为临时变量,将头节点赋值给q
    for (i = 1; i <= n; i++) {
    
    
        p = (ListNode *) malloc(sizeof(ListNode));
        p->data =i;//初始化p的data
        q->next=p;//将q指向p的首地址
        q=p;//p为尾结点,将p赋值给临时变量q
    }
    p->next=L->next;//使最后一个结点指向第一个结点,使之构成一个循环
    return L;
}

LinkList ListDelete(int n,int m,LinkList L){
    
    
    int i,l;
    ListNode *p, *q;
    p=L;
    for(i=1;i<=n;i++){
    
    
        for(l=1;l<m;l++){
    
    
            p=p->next;//p是第l-1个(待删除项)
        }
        q=p->next;
        p->next=q->next;
        printf("%d ",q->data);
        free(q);
        L=p;
    }
    return L;
}

動作結果:
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/m0_46259251/article/details/109262737