环表实现约瑟夫环

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档