约瑟夫环问题编程实现
2016-07-29 13:25
211 查看
问题:
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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; }
结果截图:
相关文章推荐
- 约瑟夫环的问题编程C++实现
- 编程实现约瑟夫环问题
- 编程实现约瑟夫环问题
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 全面了解 Cookie的传递流程、编程实现及安全问题
- 约瑟夫环问题(丢手帕游戏)Java 链表实现
- 程序员编程艺术:Top K算法问题的实现
- 无聊闲做,从使用PHP数组实现约瑟夫环问题谈性能
- C语言,数组实现约瑟夫环问题(两种方法)
- 约瑟夫环问题 链表实现
- 解决问题的艺术:半小时编程实现照片的反转负冲特效
- java实现简单的约瑟夫环问题(二)
- 约瑟夫环问题(Josephus Problem)C程序实现
- 约瑟夫环问题的实现
- 单链表实现猴子选大王(约瑟夫环问题)
- 约瑟夫环问题的数组实现
- 约瑟夫环的编程实现
- 用C++数组实现约瑟夫环问题
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 程序员编程艺术:第三章续、Top K算法问题的实现