循环链表-圆桌出列问题
2017-09-05 15:56
218 查看
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
以下是C++实现代码
//建立无头结点的循环链表
//出列函数
//主函数
以下是C++实现代码
#include <cstdlib> #include <cstdio> typedef struct LNode{ int data; struct LNode *link; }LNode,*LinkList;
//建立无头结点的循环链表
LinkList Create( int n ) { LinkList head,p,temp; head=NULL; p=head; int i; for( i=1;i<=n;i++ ){ temp=(LinkList)malloc(sizeof(LNode)); temp->data=i; if( head==NULL ){ head=temp; p=head; }else{ p->link=temp; p=temp; } } p->link=head; return head; }
//出列函数
void function( int n,int m,int k ) { LinkList head,p,q; head=Create(n); int i; printf( "the list is:\n" ); p=head; for( i=0;i<n;i++ ){ printf( "%d ",p->data ); p=p->link;} printf("\n"); p=head; //找到第一个报数的结点,即编号为k的结点 for( i=0;i<n;i++ ){ if( k==p->data ) break; p=p->link; } //循环数1到m,出列 while( n-- ){ for( i=1;i<m;i++ ){ q=p; p=p->link; } printf( " %d out\n",p->data ); q->link=p->link; free(p); p=q->link; } }
//主函数
int main() { function(5,4,2); return 0; }
相关文章推荐
- 【链表】单链表循环解决Josephus问题
- 魔术师发牌问题简单实现-循环链表
- 数据结构 循环链表之约瑟夫问题
- Have Fun with Numbers及循环链表(约瑟夫问题)
- 数据结构 循环链表的应用:约瑟夫环问题
- 单循环链表的约瑟夫问题(C++)
- 用单循环链表实现约瑟夫问题。
- 第十课 循环链表,约瑟夫环问题的解决
- 用个循环链表解决约瑟夫环问题
- C语言单向循环链表解决约瑟夫问题
- 循环链表解josephus问题
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 双循环链表解决耶稣门徒问题
- 单向循环链表队列,从头开始报数,当报到m或者m的倍数的元素出列
- 《算法之美》の链表问题の判断链表循环与否
- 约瑟夫问题循环链表实现
- C语言单向循环链表解决约瑟夫问题
- 单循环链表解决约瑟夫环问题
- 《算法之美》の链表问题の判断链表循环与否
- 约瑟夫问题的单向循环链表的解法