至于题目,大家请前往这儿(http://acm.hdu.edu.cn/showproblem.php?pid=1216)。整个题目用链表是最好理解的,当然其他方法也行。
下面就是代码,若哪儿有不对,请各位不吝指出!
#include<stdio.h>
#include<malloc.h>
typedef int IntType;
typedef struct node
{
IntType date;
struct node *next;
} LNode, *LinkList;
LinkList Creat()//创建并插入节点
{
LinkList s, r, H;
int i ;
H = (LinkList)malloc(sizeof(LNode));
H->next = NULL;
r = H;
for(i = 2; i <= 35000; i++)
{
s = (LinkList)malloc(sizeof(LNode));
s->date = i;
s->next = r->next;
r->next = s;
r = s;
}
return H;
}
void Read(LinkList H, int n)//读取指定的lucky number
{
LinkList r;
int i;
r = H->next;
for(i = 1; i < n; i++)
{
if(r->next != NULL)
r = r->next;
else break;
}
printf("%d\n", r->date);
}
int Del(LinkList H, int beg)
{
LinkList s, r, t;
int i = 1;
int j , k = 1;
int NextBeg;//下一个开始的数值(即决定隔多少个数删除下一个节点)
r = H;
for(; ;)
{
r = r->next;
if(r->date == beg)//找到本次开始的数值
break;
}
s = r->next;//本次节点的下一个节点
if(s == NULL)//如果本次节点是最后一个节点,则直接返回0
return 0;
NextBeg = s->date;//下一次调用这个函数时的开始数值
for(;;)
{
for(j = 1; j < beg; j++)
{
s = s->next;//s指向要删除的节点
r = r->next;//r指向s的上一个节点
if(s == NULL || s->next == NULL)//如果移动到最后位置,则代表以本次删除结束
return NextBeg;
}//往下移动beg-1个
r->next = s->next;
t = s;
s = r->next;
free(t);//释放掉删除的节点
}
return NextBeg;
}
int main()
{
LinkList H;
int beg = 2;
int pos;
H = Creat();
for(;;)
{
if(beg == 0)
break;
beg = Del(H, beg);//循环以beg的长度删除节点
}
for(;;)
{
scanf("%d", &pos);
if(pos == 0)
break;
Read(H, pos);
}
return 0;
}