1用尾插法建立一个循环链表,存放做游戏的学生序号;

来源:百度知道 编辑:UC知道 时间:2024/05/07 05:07:10
有n个同学一起玩游戏(10≤n≤99),大家围成一圈,依靠学号来区分同学,从某一个同学(编号为a)开始数数,遇到7的倍数或者包含7的数(比如17,27),则该同学退出圈外,请求解同学们退出的顺序(用学号表示)。

首次适应算法:
for(int i=0;i<90;i++)
{
struct node*p=head;
while((p->data)%7!=0 || (p->data)%10!=7)
{
p=p->next;
}
cout<<p->data;
del(p);
}
循环适应算法:
int n=0;
struct node*p=head;
next:
while((p->data)%7!=0 || (p->data)%10!=7)
{
p=p->next;
n++;
if(n=90)end;
}
cout<<p->data;
struct node*q=p;
p=p->next;
del(q);
n=0;
goto next;

呵呵,蛮经典的一道数据结构题目。
解题思路:尾插法建立循环链表几乎所有的数据结构书都会提到,这不是问题关键,关键在于该游戏的算法实现。
1 循环链表的元素遍历与删除你需要掌握,这书上也会有。
2 题设说从某个同学开始,那么你首先要实现的肯定就是输入一个同学的学号,从它开始,本质上将就是让你完成一次查找,找到即为一个指针指向了该元素结点。而后开始数数,这其实隐含的告诉你,你需要一个循环,而循环的次数就是链表的长度,因为经过n次的循环之后所有的人都是要出圈的,此时算法结束。在循环内设置一个计数器,边循环便后移指针,当n%7==0或者是n%10=7的话就删除当前指针所指结点。

祝你成功调试!