c语言约瑟夫环分函数,c语言实现约瑟夫环问题

本文介绍了使用C语言解决约瑟夫环问题的方法,包括循环链表的数据结构设计和算法实现。同时,展示了顺序存储结构在解决此问题上的应用,通过创建线性表并实现插入、删除等操作。最后,代码演示了不同密码情况下约瑟夫环问题的求解过程,并对编程细节和体会进行了反思。
摘要由CSDN通过智能技术生成

《c语言实现约瑟夫环问题》由会员分享,可在线阅读,更多相关《c语言实现约瑟夫环问题(16页珍藏版)》请在人人文库网上搜索。

1、一)基本问题1问题描述设有编号为1,2,小的n (n 0)个人围成一个圈,每个人持有一个密码m。从第一个人开始报数,报到 m时停止报数,报 m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报 m的出圈,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。建立模型,确定存储结构。对任意n个人,密码为m, 实现约瑟夫环问题。2. 数据结构设计首先,设计实现约瑟夫环问题的存储结构。由于约瑟夫环问题本身具有循环性质,考虑采用循环链表,为了统一对表中任意结点的操作,循环链表不带头结点。 将循环链表的结点定义为如下结构类型:struct Nodeint data;N。

2、ode *n ext;;其次,建立一个不带头结点的循环链表并由头指针first指示3. 算法设计1、工作指针first, r, s, p, q初始化2、输入人数(n)和报数(m)3、循环n次,用尾插法创建链表Node *q;for(i nt i=1;i data =i;p-next=NULL; if(i=1) L=q=p; else q-next=p; q=q-next; q-next=L; if(L!=NULL)return(L);4、输入报数的起始人号数 k;5、Node *q = new Node; 计数器初始化 i=1;k 个)6、循环 n 次删除结点并报出位置(其中第一个人后移 当 。

3、inext; 删除 p 结点的后一结点 q q=p-next; p-next=q-next; *L = p-next; 报出位置后 Delete q; 计数器 i+;运行流程图开始代码和相关解释#in cludeusing n amespace std;struct Node/循环节点的定义int data;/ 编号Node *n ext;;Node *CreateList(Node *L,i nt &n,int &m);建立约瑟夫环函数void Joseph(Node *L,int n,int m); 输出每次出列号数函数Node *DeleteList(Node *L,i nt i,Nod。

4、e *q);寻找每次出列人的号数int LengthList(Node *L); 计算环上所有人数函数void main()/ 主函数在主函数中,完成人数(n)和报数(m)的输入和工作指针的初始化Node *L;L=NULL;/ 初始化尾指针int n, m;coutn;/ 环的长度if(nm;if(mdata=i;p-next=NULL;if(i=1) L=q=p;/ 工作指针的初始化elseq-next=p;q=q-next;q-next=L;if(L!=NULL)return(L);/ 返回尾指针else coutk;if(kn)coutdatadatanext;j+;q = p-nex。

5、t; p-next=p-next-next;*L = p-next;return(q);int LengthList(Node *L)/ 计算环上的人数if(L)coutnext;while(p!=L)p=p-next;return(i);复杂度分析:for(i nt i=1;inu mber=i; p- next=NULL; if(i=1) L=q=p; elseq_n ext=p; q=q_n ext;时间复杂度:O (n)if(i=1) i+=Le ngthList(*L);Node *p;p=*L;int j=0;while(jn ext;j+;q = p_n ext;p-n ext=。

6、p-n ext-n ext;*L = p_n ext;return(q);时间复杂度:O (n2) 算法的空间复杂度:O (n2)4界面设计请输入报数人数n 请输入所报数M 请输入第一个报数人 以下列出依次报数的结 果5.运行、测试与分析人 h数 6Mljg第岀列顺序:(二)采用顺序存储结构如何实现约瑟夫环问题代码和解释#i nclude #in clude#in clude#defi ne MaxSize 50typedef char ElemType;typedef struct Seqlist/线性表顺序存储结构定义ElemType *elemMaxSize;存放顺序表数据元素 int 。

7、length;/当前长度*JSeqlist;线性表存储结构类型名JSeqlist In t_SeqList(void)/顺序表初始化JSeqlist L;L=(JSeqlist)malloc(sizeof(struct Seqlist); if(L!=NULL)L-le ngth=O;else printf( 超出范围! );return L;ElemType *Locate_SeqList(JSeqlist L,int p)/查找线性表中下标为 P的元素if(p=0&L-length)return(L-elemp);elseprintf( 顺序表中不存在相关元素 );return NULL;。

8、int Insert_SeqList(JSeqlist L,int i,ElemType *x) /在顺序表中指定元素前插入 Xint j;if(L-length=MaxSize)/L.length 是最后一个元素的位置 printf( 线性表已满,无法进行插入操作! !n); return 0;if(iL-length)printf( 插入位置不对,超出顺序表长度 n);return 0;if(i=0)L-elemi=x;L-length=L-length+1;return 1;for(j=L-length;j=i;j-)L-elemj=x;L-length+;return 1;int De。

9、lete_JSeqlist(JSeqlist L,int i)/在顺序表中删除第 i 个元素int j;if(iL-length-1)printf( 删除位置不对,超出顺序表的长度啦 n); return 0;for(j=i;jlength-1;j+)L-elemj=L-elemj+1;L-length-;return 1;void josephus(JSeqlist L,int start,int m)/josephus 问题求解的非常牛逼的函数int s,i;ElemType *w;s=start-1;for(i=L-length;i0;i-)s=(s+m-1)%i;w=Locate_Se。

10、qList(L,s);printf( 出列人员为: %sn,w);Delete_JSeqlist(L,s);int main (void)JSeqlist Josephus;int n,m,i,k,s;Josephus=Int_SeqList();/ 顺序表初始化printf( 约瑟夫环问题顺序表求解 _愚人节特别版 nn);printf( 请输入本问题中总人数 m=);scanf(%d,&n);printf( 请输入本问题开始人员的位置 S=);scanf(%d,&s);printf( 请输入本问题的计数值 m=);scanf(%d,&m);printf( 请输入本问题中这些人的名字 n);。

11、for(i=0;ielemi=(ElemType *)calloc(10,sizeof(char); scanf(%s,Josephus-elemi);k=Insert_SeqList(Josephus,i,Josephus-elemi);if(k=0)exit(1);josephus(Josephus,s,m);free(Josephus);getchar();return 0;运行结果约I D II 回L;Users MrZhaoDe&ktc pjySiSugCpp210.exe九人一. 题邇题談 IP1口In口 入入人am敢字Ifl 嗨位3 吴瑕爱晓 - 一名名名名嗒 O a彌爛:|翠採。

12、 瞥直置直置置吕躺-吕HA-5鳥 1 12 3 4 5 6夕禺歹勺.歹段0 佳.|=第弟J.丰S-H 出-H-H-Hpr(三)密码不同#in elude struct CListint password;int nu mber; struct CList *n ext;typedef struct CList CNode;typedef CNode *CL ink;CLink CreateList(int length)CLink head;CLink before;CLink new_no de;int i;head=new CNode;if(head=NULL)return NULL;co。

13、ut head-password;head-nu mber=1;head- next=NULL;before=head;for(i=1;inumber = i+1;cout number new_node-password;new_node-next = NULL; before-next=new_node;before=new_node;new_node-next =head;return head;int main()CLink head;CLink ptr,back,last;int i,j,m,n;cout n;cout m;head=CreateList(n);ptr=head; f。

14、or(i=0;inext;cout numberpassword;if(ptr=head)last=head;while(last-n ext!=head) last=last- n ext;last-n ext=head-n ext; delete ptr;ptr=last- n ext; head=ptr;elseback- n ext=ptr- n ext; delete ptr;ptr=back- n ext;return 0;运行结果njputtliD Hunibcii* of* Poissons sI nputtlio Fli*e t PasBwoi-d. M =:enput1 n。

15、putPas e vjmd2 =1 njpiutPas s vw i*d3 =t inputPa.3 EldOF fi4:seinputPas s: ijo pdse【nwitPassword ft:nunbei* front whon start witzli BCU EcrsW rZhaoDc is IctoRjBd&gWV不同的瓷码 De b ugCppBcx号号号号号号t扁扁扁扁扁扁y 川列那列511列3 出出出出出出a ?JTXr1 2 1- 4 5 G e WWOWprs2:6-3:4=5con t in Lie(三)心得体会:1编程是个很细致的工作,尤其是在写顺序表的时候,涉及的函数很多,函数名中最初为了 看在清晰,涉及成单词首字母是大写的, 但是后来在函数调用的时候,就忘记了最初命名的 时候是大写的了,导致编译的时候不能识别。2.通过这个实验,理解了数据结构是数学在编程中的应用,是程序涉及和算法设计的基础, 在计算机相关学科总占有举足轻重的地位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值