约瑟夫环问题

2015-08-20 / ACM-ICPC Easy Algorithm

这算是一个非常简单的模拟题。

在大家学习数据结构的课程中,都会有这个问题。

在计算机上先输入两个正整数N和K,其中N为将要输入的正整数的个数,K为步长。请编写一个程序,首先用循环链接表储存这N个正整数。然后,首先删除第一个正整数,接着删除循环链表从当前删除节点开始步长走K个的正整数,依次类推,直至表空为止。如下所示,N=10,K=3,输入的10个正整数为1,2,3,4,5,6,7,8,9,10。则被删除的次序为:1,4,7,10,5,9,6,3,8,2。

直接上代码吧。

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

#define MAXN 10000

struct Node
{
    struct Node* next;
    int value;
};

struct Node link[MAXN];
int n,k;
struct Node *pre, *cur;

void make_link ()
{
    int i;
    for (i = 0; i < n-1; i++)
    {
        link[i].next = &link[i+1];
        scanf ("%d", &link[i].value);
        //cin >> link[i].value;
    }
    link[n-1].next = &link[0];
    scanf("%d", &link[n-1].value);
    // cin >> link[n-1].value;
    cur = &link[0];
    pre = &link[n-1];
}

/*cur指针移动cnt步*/
void move_cur_index (int cnt)
{
    int i;
    for (i = 0; i < cnt-1; i++)
    {
        pre = cur;
        cur = (*cur).next;
    }
}

/*删除当前指向的节点*/
void del_cur_node ()
{
    printf("%d ", (*cur).value);
    // cout << (*cur).value << " ";
    (*pre).next = (*cur).next;
    cur = (*cur).next;
}

int main ()
{
    int i;
    scanf("%d%d", &n, &k);
    //cin >> n >> k;
    make_link();
    for (i = 0; i < n; i++)
    {
        del_cur_node();
        move_cur_index(k);
    }
    return 0;
}