洛谷 || C语言线性表解决约瑟夫问题

每日一句,送给最珍贵的你: 学会适应不同的环境,与环境一起改变与否,将决定你开启一场怎样的人生!

题目描述
n 个人围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

输入格式
输入两个整数 n,m。

输出格式
输出一行 n个整数,按顺序输出每个出圈人的编号。

输入输出样例
输入

10 3
输出

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