最近开始复习数据结构,下面是自己写得约瑟夫环的3中实现方式,代码简陋,重要的是理解思想

为了图方便,我把n,s,m位设为常数了,这个自己读取也可以的,试验过了

n:总共有n个人

s:从第s个人开始数1

m:到第m个人出列,然后继续从出列的下一个人开始算1

1: 顺序表的实现

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct{
int data[100];
int length;
}SeqList,*PSeqList;

void deletefrom(PSeqList p,int pos)
{
int j;
if(pos<1 || pos>p->length)
{
printf("error");
return;
}
for(j=pos;j<p->length;j++)
p->data[j-1]=p->data[j];
p->length--;
return;
}
int main()
{
int n,s,m;
scanf("%d",&n);getchar();
scanf("%d",&s);getchar();
scanf("%d",&m);getchar();

PSeqList p;
p=(PSeqList)malloc(sizeof(SeqList));
if(!p)
{
printf("error!");
return 1;
}

//初始化
int i,w;
for(p->length=n,i=0;i<p->length;++i)
p->data[i]=i+1;

int s1=s-1;
for(i=p->length;i>0;i--)
{
s1=(s1+m-1)%i;
w=p->data[s1];
printf("%d ",w);
deletefrom(p,s1+1);
}
return 0;
}

2:静态链表的实现

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct{
int data;
int next;
}SNode;
typedef struct{
SNode sp[100];
int SL;
}Slite,*PSlite;
int main()
{
int n=5,s=1,m=2;

PSlite p=(PSlite)malloc(sizeof(Slite));
if(!p)
exit(1);
int i;
p->SL=0;
for(i=0;i<n;i++)
{
p->sp[i].data=i+1;
p->sp[i].next=(i+1)%n;
}

int begin=p->SL;
for(int s_count=0;s_count<s-1;s_count++)
begin=p->sp[begin].next;

int pre,pos;
for(i=0;i<n;i++)
{
int count=0;
while(count++<m-1)
{
pre=begin;
begin=p->sp[begin].next;
}
printf("%d ",p->sp[begin].data);
pos=p->sp[begin].next;
p->sp[pre].next=pos;
p->sp[begin].next=-1;
begin=pos;
}
free(p);
return 0;
}

这个实现的思想是:

1我首先找出来第一个人

2;然后循环n次,找到第m个人,把第m个人的下级赋给它的上级,将它的next=-1,意味着将它抹掉

3:循环单链表的实现,带表头

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct node{
int data;
struct node* next;
}Link,*PLink;

PLink Init(void)
{
PLink head;
head=(PLink)malloc(sizeof(Link));
if(!head)
{
printf("error");
exit(1);
}
head->next=NULL;
return head;

}
int main()
{
PLink head;
head=Init();
int n=5,s=1,m=2;

int i;
PLink q=head;
for(i=0;i<n;++i)
{
PLink p;
p=(PLink)malloc(sizeof(Link));
p->data=i+1;
p->next=NULL;
q->next=p;
q=p;
}

q->next=head->next;
//以上建立了带头结点的循环链表

/*
printf("%d ",head->next->data);
for(PLink p=head->next->next;p!=head->next;p=p->next)
printf("%d ",p->data);
*/

PLink pre,begin;
begin=head->next;
for(i=0;i<n;++i)
{
int count=0;
while(count++<m-1)
{
pre=begin;
begin=begin->next; //现在该删除begin
}
printf("%d ",begin->data);
PLink pos=begin->next;
pre->next=begin->next;
free(begin);
begin=pos;
}
return 0;
}

代码简陋。

转载于:https://www.cnblogs.com/buxianghe/archive/2011/10/26/2225692.html

约瑟夫问题的几种实现相关推荐

  1. 3、约瑟夫问题的一种描述是:编号为1,2,……,n的n个人按顺时针方向坐一圈,每人持有一个密码(正整数)。一开始任选一个作为报数上限值m,从第一个开始顺时针自1开始顺序报数,报到m是停止报数。报m的人

    题目: /* 3.约瑟夫问题的一种描述是:      编号为1,2,--,n的n个人按顺时针方向坐一圈,每人持有一个密码(正整数).一开始任选一个作为报数上限值m, 从第一个开始顺时针自1开始顺序报数 ...

  2. 约瑟夫环c语言单链表的解题思路,太透彻了:约瑟夫环的三种解法

    [CSDN 编者按]极大概率出现在面试中的约瑟夫环问题来啦,本文三种方法描述解题思路,这样讲解绝对让面试官眼前一亮. 作者 | bigsai 责编 | 欧阳姝黎 前言 约瑟夫环问题是算法中相当经典的一 ...

  3. C语言循环链表(不带头结点)解约瑟夫问题的一种变形

    一.问题描述 约瑟夫(Joseph)问题的一种描述是:编号为 1,2,-,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数),一开始任选一个整数作为报数上限 m,从第一人开始按顺时针方向 ...

  4. 约瑟夫环的两种实现方法

    已知一组编号分别是:4,7,5,9,3,2,6,1,8,按照约瑟夫环原理打印出队列. 举例说明约瑟夫原理: (1)设定一个报数值,如:3,从1开始报数,报到3的时候将对应的数据删除. (2)然后继续从 ...

  5. 约瑟夫问题的几种解决方法

    约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称"丢手绢问题".). 编号为1.2.3--.n的n个人按 ...

  6. (猴子选王)约瑟夫环方法4种方法之一——循环链表法

    话都在代码里 题目 //约瑟夫环的循环链表解法 #include <stdlib.h> #include <malloc.h> #include <stdio.h> ...

  7. 猴子选王)约瑟夫环方法4种方法之一——循环数组法

    题目 话在代码里 #include <stdio.h> int main() {int n, m, number, count = 1;//猴子个数,淘汰次序,当前猴子个数,验证淘汰次序所 ...

  8. 猴子选王)约瑟夫环方法4种方法之一——数组链接方式实现

    代码 #include <stdio.h> int main() {int n, m; //猴子个数,报数到m退出int number;//记录猴子实际个数int count;//为当前循 ...

  9. Bailian2746 约瑟夫问题【 约瑟夫问题】

    2746:约瑟夫问题 总时间限制: 1000ms 内存限制: 65536kB 描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈 ...

最新文章

  1. strtol() 字符串转长整型函数
  2. 服务器用户连接数设置
  3. 硬件:LCD和LED相关知识介绍
  4. 机器学习从入门到精通50讲(二)-千万级流量压力测试
  5. go channel 缓冲区最大限制_Go语言11周年,泛型问题有望明年得到解决
  6. Chrome、Edge 合力围剿,Safari 夹缝求生?
  7. 检测air运行环境版本
  8. VB获取Windows操作系统所有版本
  9. 利用OpenCV在picture控件中显示图片
  10. iOS clang: error: linker command failed with exit code 1 (use -v to see invocation)
  11. C++课设:GUI电话簿程序
  12. 实验七 动态分区分配方式的模拟
  13. linux多种方法提取ip地址
  14. 【A40I-LVDS】
  15. redis加锁和解锁
  16. html点击打开word文档,javascript打开word文档的方法
  17. python编程代码画画_如何用python编写一个绘制马赛克图像的自写程序
  18. Android唤醒锁作用,Android深度睡眠和唤醒锁
  19. 苹果三代耳机_苹果准备三款AirPods耳机:Pro取消耳机柄、AirPods3改入耳式设计
  20. 零基础Python完全自学教程15:Python中的列表

热门文章

  1. CNN+Transformer=Better,国科大华为鹏城实验室提出Conformer,84.1% Top-1准确率
  2. 用 X 光检测新冠肺炎?也许孪生网络+迁移学习是更好的选择!
  3. 官方中文版开源!快速入门PyTorch
  4. 详解李兰娟团队重大抗疫药物成果:2款处方药,体外试验有奇效,已在浙江临床使用...
  5. 新年快乐!我爱计算机视觉干货集锦与新年展望
  6. mysql groupby 拼接_mysql分组并多行拼接--group_concat和groupby的使用
  7. 真香!腾讯再发阳光普照奖:每人100股,价值超6万!
  8. Linux | Ubuntu:十年,十个关键时刻
  9. C++ Primer 第五版 第6章 6.7——函数指针习题答案
  10. 十年千篇!人脸识别相关技术最全论文合辑