注册 登录
编程论坛 数据结构与算法

谁来帮帮我看看这个 求解 有奖赏

w1249468815 发布于 2017-11-15 20:09, 1626 次点击
实习安排
一、线性表及其应用
题目:约瑟夫环(Joseph)
① 问题描述:编号为1到n的n个人,按顺时针方向围成一个环(循环单链表),每人都持有一个密码(正整数)。任选一个正整数作为报数的上限(设为m),从第一个人开始按顺时针方向从1开始顺序报数,当报到m时,暂停报数并输出其标识(位序),同时将报数为m的人删除,并将他的密码作为新的m值,继续从1开始重新报数,直到m并输出。如此重复,直到全部人员都从队列中输出。编写程序,求出该出列顺序。
1 回复
#2
丘山君2017-11-16 08:29
不太理解每个人的密码是什么意思,我的是给每个人按1到n为编号,我设为每数到三就有一个出来,你可以自己修改数值
2.单向循环链表
    #include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct node{
int data;
struct node *next;
}ElemsN;
//每三个小孩出一个小孩,小孩出来的顺序。
void  OutChild(ElemsN *h)
{
    ElemsN *outp,*q;
    q=NULL;
    int i;
    while(h!=h->next){
        for(i=1,outp=h;i<3;i++,q=outp,outp=outp->next);
        printf("%5d",outp->data);
        h=q->next=outp->next;
        free(outp);
    }
    printf("%5d\n",h->data);
}
//创建一个单向循环链表。
ElemsN * Createlink(int a[])
{
    ElemsN *p,*head,*q;
    int i;   
    for(i=0;i<N;i++){
        q=(ElemsN *)malloc(sizeof(ElemsN));
        if(!i)
            head=p=q;
        q->next=head;
        p->next=q;
        q->data=a[i];
        p=q;
        }
    return head;
}
1