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

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

在计算机上先输入两个正整数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。

直接上代码吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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;
}