约瑟夫问题(单循环链表解决)
2016-03-11 22:37
549 查看
/*Joseph Problem *利用单循环链表解决约瑟夫问题。 *问题描述:将n个数链接成一个环,从第m个开始,每次从1计数到s时 * 将s删除。从下一个开始再次从1计数至s时删除s。直到全 * 部删除为止。 * */ #include<stdio.h> #include<stdlib.h> typedef struct Node{ int data; struct Node* next; }Node; typedef struct Node* LinkList; void CreateJosephLoop(LinkList *L,int number){ //创建Joseph环,在头结点中放入了元素1. *L = (LinkList)malloc(sizeof(struct Node)); if(!(*L)){ printf("Error:malloc:0!\n"); exit(1); } (*L)->next = (*L); (*L)->data = 1; int i; LinkList new; LinkList tail = *L; for(i = 1; i < number; i++){ new = (LinkList)malloc(sizeof(struct Node)); if(!new){ printf("Error:malloc:1+i"); exit(1); } new->data = i+1; new->next = tail->next; tail->next = new; tail = new; } } void JosephProblem(int loopSize,int from,int stepBy){ //loopSize:Joseph环的大小 //form:从from开始 //stepBy:每次计数到stepBy时删除stepBy所指向的元素 LinkList L; CreateJosephLoop(&L,loopSize); int seekStart = 1; while(seekStart < from){ L = L->next; seekStart += 1; } while(L->next != L){ int i = 1; LinkList temp; for(i = 1;i < stepBy - 1; ){ L = L->next; i++; } temp = L->next; printf("%d-->",temp->data); L->next = L->next->next; L = L->next; free(temp); } printf("%d\n",L->data); } int main(){ JosephProblem(10,3,4); JosephProblem(41,1,3); return 0; }
相关文章推荐
- Android之NetworkOnMainThreadException异常
- CodeForces-630 O. Arrow【向量+几何】
- Android开发-Gradle基础
- hdu3709Balanced Number【数位dp】
- linux awk命令详解
- 创业的第一百四十一天
- NGINX做前端,页面上的连接却变成后端地址
- 为ubuntu添加不同版本openstack源
- 实验0 了解和熟悉操作系统(操作系统)
- Makefile知识点总结
- [Android开发那点破事]解决android.os.NetworkOnMainThreadException
- PHP代码实现MySQL读写分离
- 操作系统
- 分布式模式之Broker模式
- CodeForces-630 N. Forecast【求根公式】
- Yahoo!团队:网站性能优化的35条黄金守则
- android studio在添加了jdk环境变量后依然无法打开问题解决
- Java中的流与文件:正则表达式
- Mybatis原理学习2:框架整体设计
- Mybatis原理学习3:Mybatis的初始化(配置文件的读取和解析)