这算是一个非常简单的模拟题。
在大家学习数据结构的课程中,都会有这个问题。
在计算机上先输入两个正整数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;
}