环表实现约瑟夫环
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验内容与要求
采用单向环表实现约瑟夫环。
请按以下要求编程实现:
①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。
环表中的结点编号依次为1,2,……,m。
②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,
当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表
中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计
数,不断进行输出,直到输出了这个环表的全部结点为止。
例如,m=10,s=3,n=4。则输出序列为:6,10,4,9,5,2,1,3,8,7。
#include
#include
#include
typedef struct node //定义结点类型
{
int num; // 用来对每个结点进行编号标序
struct node *next; //递归定义
}LNode,*Linkls;
void create(int m,Linkls &head)
{
Linkls p;
head=(LNode*)malloc(sizeof(LNode)); //申请头结点的存储空间
head->next=head; //让链表成为一个空的循环链表
for(int i=m;i>1;i--)
{
if(!(p=(LNode*)malloc(sizeof(LNode)))) exit(-1); //申请存储空间
p->num=i; //标记每个结点的顺序
p->next=head->next;
head->next=p;
}
head->num=1;
}//Create
int main()
{
int n,i,s,m,j=1;
LNode *head,*p,*q;
printf("请输入开始的总人数m:\n");scanf("%d",&m);
printf("开始计数的位置s:\n");scanf("%d",&s);
printf("输入要进行数的数字:\n");scanf("%d",&n);//输入数据
create(m,head);//产生一个以head为头结点,有m个元素的循环链表
printf("进行依次删除操作:\n");
for(i=1,p=head;i
p=p->next;
while(m--)
{
for(i=1;i p=p->next; q=p->next; printf("第%02d次出局的数:%d\n",j++,q->num);//输出数到的数字,后面进行删除 p->next=q->next; p=p->next; free(q);//释放q所指的空间 } printf("By 北理工电气一班:\n邓南化(20091589)\n"); return 0; }