约瑟夫环问题编程实现
来源:互联网 发布:合肥飞友网络怎么样 编辑:程序博客网 时间:2024/05/18 07:12
问题:
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1] 结果+1即为原问题的解
问题分析
- 构建一个环(由链表来构建)最后一个的指针指向我们最开始的节点
- 环遍历删除问题
- 特别是剩下两个元素时需要进行的操作
linkRing.h
#ifndef _LINK_RING_H_#define _LINK_RING_H_#include <assert.h>#include <malloc.h>#include <memory.h>struct NodeT{ int data; //数据域 struct NodeT * next; //指针域 };typedef struct NodeT * PNode;typedef struct NodeT Node;PNode createRing(int num); //创建环的个数//void delNext(PNode pNode); //这个用不着,在遍历删除时已经进行了int ring(PNode pNode,int num) ; //约瑟夫环的遍历函数#endif // _LINK_RING_H_
linkRing.c
#include "linkRing.h"//创建环的个数PNode createRing(int num){ PNode p,pNode; int i = 0; assert(num>0);// pNode=(PNode)calloc(1,sizeof(Node));//分配内存空间 //pNode=(PNode)calloc(1,sizeof(Node)); for(i = 0;i<num;i++) { if(i == 0) { //头节点的创建 pNode = p = (PNode)calloc(1,sizeof(Node)); } else { p->next = (PNode)calloc(1,sizeof(Node)); p = p->next; } p->data = i+1; p->next = NULL; } p->next = pNode; //将这个数据形成一个环,链表的最后一个节点指向头节点 return pNode;}//void delNext(PNode pNode)//{// PNode p = NULL;// assert(pNode!=NULL);// if(pNode->next == NULL)// {// printf("this node don't have next node");// }// else{// p = pNode->next;// pNode->next = p->next;// free(p);// p = NULL;// }//}int ring(PNode pNode,int num) //第几个出局{ PNode p = NULL; int i = 1; assert(pNode!=NULL); while(pNode->next != NULL) { if(i == num-1) { p = pNode->next; if(p->next == pNode) //当只存在两个数据时,pNode->next = p; p->next = pNode;删除数据的方式 { printf("current out num is:%d\n",p->data); free(p); pNode->next = NULL; break; } else{ //其他删除数据的方式 pNode->next = p->next; printf("current out num is:%d\n",p->data); free(p); i = 0; //当前值为pNode,没有向后移动 p = NULL; } } pNode = pNode->next; i++; } return pNode->data;}
测试的main
#include <stdio.h>#include <stdlib.h>#include "linkRing.h"int main(){ PNode pNode = NULL; pNode = createRing(5); printf("最终的结果是:%d",ring(pNode,3)); return 0;}
结果截图:
0 0
- 编程实现约瑟夫环问题
- 约瑟夫环问题编程实现
- 编程实现约瑟夫环问题
- 【约瑟夫】编程实现约瑟夫环
- 约瑟夫环的问题编程C++实现
- 约瑟夫环问题-C++编程实现
- 约瑟夫环的编程实现
- 约瑟夫环问题的实现
- 类实现 约瑟夫环问题
- java实现约瑟夫环问题
- java实现约瑟夫环问题
- Java实现约瑟夫环问题
- 约瑟夫环问题--java实现
- Java实现约瑟夫环问题
- 约瑟夫问题、约瑟夫环
- 约瑟夫环(约瑟夫问题) 采用循环单链表实现
- Java编程题目-1:约瑟夫环问题
- [原创]java实现约瑟夫环问题
- 简单的利用UrlConnection,后台模拟http请求
- uva12558 (迭代加深搜索)
- mysql千万级大数据SQL查询优化
- gflod求基因表达值 FPKM
- hdu 5742(水)
- 约瑟夫环问题编程实现
- SPARK java.io.NotSerializableException 异常处理
- 75道程序员面试逻辑测试题内含答案
- volley乱码
- python的web服务器模块
- 开发中遇到的新东西 — @try @catch @finally
- 把我们的姿态放低
- 关于selenium
- 题目216 A problem is easy