约瑟夫环问题
来源:互联网 发布:三毛淘宝小号交易平台 编辑:程序博客网 时间:2024/05/22 09:46
/*约瑟夫环问题: 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。*/#include<stdio.h>#include<stdlib.h>//链表节点typedef struct _RingNode{int pos;//位置struct _RingNode *next;}RingNode,*RingNodePtr;//创建约瑟夫环,pHead:链表头节点,count:链表元素个数void CreateRing(RingNodePtr pHead, int count){RingNodePtr pCurr=NULL,pPrev =NULL;int i=1;pPrev=pHead;while(--count > 0){ pCurr=(RingNodePtr)malloc(sizeof(RingNode));i++; pCurr->pos=i;pPrev->next=pCurr;pPrev=pCurr;} pCurr->next=pHead;//构成环状链表}void PrintRing(RingNodePtr pHead){RingNodePtr pCurr;printf("%d ",pHead->pos);pCurr=pHead->next;while(pCurr !=NULL){ if(pCurr->pos==1) {break; }printf("\n%d",pCurr->pos);pCurr=pCurr->next;}}void KickFromRing(RingNodePtr pHead,int m){RingNodePtr pCurr,pPrev;int i=1; //计数pCurr=pPrev=pHead;while(pCurr !=NULL){if(i==m){ //踢出环 printf("\n%d",pCurr->pos); //显示出圈循环顺序 pPrev->next=pCurr->next; free(pCurr); pCurr=pPrev->next; i=1;} pPrev=pCurr; pCurr=pCurr->next; if(pPrev ==pCurr) { //最后一个printf("\n%d",pCurr->pos);//显出出圈顺序free(pCurr); break; } i++;}}int main(void){ int m=0,n=0; RingNodePtr pHead = NULL; printf("---------------Josephus Ring---------------\n"); printf("N(person count) = "); scanf("%d", &n); printf("M(out number) = "); scanf("%d", &m); if(n <= 0 || m <= 0) { printf("Input Error\n"); system("pause"); return 0; } //建立链表 pHead = (RingNodePtr)malloc(sizeof(RingNode)); pHead->pos = 1; pHead->next = NULL; CreateRing(pHead, n); #ifdef _DEBUG PrintRing(pHead); #endif // 开始出圈 printf("\nKick Order: "); KickFromRing(pHead, m); printf("\n"); system("pause"); return 0;}
(以上是网上看的,下面是自己学习时的)
#include<stdio.h>#include<stdlib.h>#define N 10#define TRUE 1#define FALSE 0typedef int data_t;typedef struct node{data_t data;struct node *next;}linknode ,*linklist;void joseph(int n,int k,int m){linklist p,q;q=NULL;int i=1;q=p=(linklist)malloc(sizeof(linknode));q->data=i;for(i=2;i<=n;i++){p->next=(linklist)malloc(sizeof(linknode));p=p->next;p->data=i;}p->next=q;//将链表连成一个环p=q;//让p指针回到第一个元素位置/*将指针q移到要开始的成员的前一个位置处*/for(i=1;i<k-1;i++){q=q->next;}/*开始kill成员循环*/while(q->next !=q)//判断是不是环链表是不是只剩下一个元素的时候{for(i=1;i<m;i++)//开始按照间隔M个元素kill成员{q=q->next;}/*删除要找到的元素并打印出来*/p=q->next;q->next=p->next;printf("%d ",p->data);free(p);}printf("%d ",q->data);//打印最后一个元素printf("\n");return ;}int main(void){int a=N;//成员int k=2;//从第K个成员开始算起int m=3;//间隔m个成员开始kill成员joseph(a,k,m);return 0;}
0 0
- 约瑟夫问题、约瑟夫环
- Josephus约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题--java
- 约瑟夫环问题 Josephus
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 求解约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 求两个数组的交集
- Java通过InputStream读取和写入文件操作
- 导入文件路径
- 关于sizeof()的一些思考
- U3D<<SPACESHOOT>>个人重制版。代码分享(三)DestroyByContact
- 约瑟夫环问题
- 在TabActivity中无法使用bindService的解决方法
- NYOJ 题目108士兵杀敌(一)
- 完全背包2
- shell语句查询mysql数据库的常用方法
- putty 连接 qnx虚拟机
- 第十一章(二) 线程锁的使用
- gsoap的几个常用设置选项
- 左右滑动评分