问题:设有n个人围成一个圆圈,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人再次出列,如此反复,直到所有的人全部出列为止。对于任意给定的n、s、m,求按出列次序得到的n个人员的序列。

例:

图片就是问题简单示例,里面是每次要循环的数据,后面的S是出列的人

思路:

  1. 先创建一个链表,链表的长度就是n
  2. 从第s个节点开始循环
  3. 判断是否是第m个数
  4. 如果是第m个数,就输出并删除当前节点
  5. 循环到最后一个节点,再从第一个节点接着循环

主要代码:

 void yuesefu (LinkList * head, int n, int s, int m)
{
LinkList * p, * r, * q;
int i = , j = n, k, l;
p = GetData_LinkList(head, s); //从第S位开始 //判断是否循环完成
while (j > ) {
//判断是否为第m个数
if (i == m) {
i = ;
//输出这轮出局的人
printf("%d\n", p->data);
//存储当前节点的值
k = p->data; //删除当前节点
q = head->next;
l=;
while (q != NULL) {
//判断当前节点得值是否等于要删除的值
if (q->data == k) {
//删除节点
DeleteNode_LinkList(head, l);
break;
}
l++;
q = q->next;
}
//从下一个节点开始循环
p = GetData_LinkList(head, l);
j--;
}else {
p = p->next;
}
//如果超出链表长度,再从第一个节点开始循环
if (p == NULL)
p = head->next; i++;
} }

整体代码:

 #include <stdio.h>
#include <stdlib.h> typedef int elemtype; typedef struct node
{
elemtype data;
struct node * next;
}LinkList; //创建链表
LinkList * Create_LinkListF(int n)
{
int i;
LinkList * head, * p;
head = (LinkList *) malloc (sizeof(LinkList)); if (head == NULL)
return head; head->next = NULL; for (i=; i<=n; i++) {
p = (LinkList *) malloc (sizeof(LinkList)); if (p == NULL)
return head; p->data = i;
p->next = head->next;
head->next = p;
} return head;
} //按序号查找
LinkList * GetData_LinkList (LinkList * head, int i)
{
LinkList * p;
int j = ; if (i <= )
return NULL; p = head; while (p->next != NULL && j<i) {
p = p->next;
j++;
} if (i == j)
return p;
else
return NULL;
} //删除节点
int DeleteNode_LinkList (LinkList * head, int i)
{
LinkList * p, * r; if (i <= )
p = NULL;
else
if (i == )
p = head;
else
p = GetData_LinkList(head, i-); if (p == NULL) {
return ;
}else {
r = p->next;
if (r == NULL)
return ; p->next = r->next;
free(r);
return ;
} } void yuesefu (LinkList * head, int n, int s, int m)
{
LinkList * p, * r, * q;
int i = , j = n, k, l;
p = GetData_LinkList(head, s); //从第S位开始 //判断是否循环完成
while (j > ) {
//判断是否为第m个数
if (i == m) {
i = ;
//输出这轮出局的人
printf("%d\n", p->data);
//存储当前节点的值
k = p->data; //删除当前节点
q = head->next;
l=;
while (q != NULL) {
//判断当前节点得值是否等于要删除的值
if (q->data == k) {
//删除节点
DeleteNode_LinkList(head, l);
break;
}
l++;
q = q->next;
}
//从下一个节点开始循环
p = GetData_LinkList(head, l);
j--;
}else {
p = p->next;
}
//如果超出链表长度,再从第一个节点开始循环
if (p == NULL)
p = head->next; i++;
} } int main (void)
{
int n, s, m;
LinkList * head; printf("n=");
scanf("%d", &n); printf("s=");
scanf("%d", &s); printf("m=");
scanf("%d", &m); head = Create_LinkListF(n);
yuesefu(head, n, s, m);
}

最新文章

  1. UVA 247 电话圈(Floyd传递闭包+输出连通分量)
  2. Oracle VM VirtualBox 安装笔记
  3. POJ 1740
  4. Core Data 教学
  5. windows 删除多层文件夹
  6. iOS开发笔记 基于wsdl2objc调用asp.net WebService
  7. DirectShow基础编程 最简单transform filter 编写步骤
  8. 【转1】Appium 1.6.3 在Xcode 8, iOS 10.2(模拟器)测试环境搭建 经验总结
  9. Windows Developer Day - Adaptive Cards
  10. IMPLEMENTING A GRU/LSTM RNN WITH PYTHON AND THEANO - 学习笔记
  11. 技术Leader相关文章和思考
  12. javascript html页面中的内容替换
  13. docker 支持ipv6 (核心要点是ndp需要把docker内的ip全部加入到ndplist中来)
  14. Android实现导航菜单随着ListView联动,当导航菜单遇到顶部菜单时停止在哪里,并且listview仍能滑动
  15. Pythagorean Triples(Codeforces Round #368 (Div. 2) + 构建直角三角形)
  16. FORALL用法小结
  17. [HDU6321]Dynamic Graph Matching(DP)
  18. appstore开发者 名称修改
  19. Hive优化之谓词下推
  20. shell 命令getopts用法

热门文章

  1. 自制年月选择插件 jquery.MyDatePicker v1.0beta
  2. [EffectiveC++]item28:避免返回handles指向对象内部成分
  3. fountion 的调用 和 打印返回值 + 占位符
  4. tyvj1953 Normal
  5. 智能家居中的物联网网关的可信计算平台模块(TPM)设计
  6. Hive学习之路 (六)Hive SQL之数据类型和存储格式
  7. Vmware10组建局域网
  8. NSPredicate的使用
  9. windows同时安装python2和python3
  10. Threadpool python3