数据结构 约瑟夫环
#include<stdio.h> #include<stdlib.h> typedef struct Lnode{ int data; struct Lnode *next; }Lnode; Lnode *head, *end, *biaoji; int n, m, k; //定义头、尾节点和人数n,当前结点biaoji Lnode creatnode(int i){ //创建循环链表 Lnode *p=NULL; p = (Lnode*)malloc(sizeof(Lnode)); p->data=i; end->next=p; end=p; if(p->data == n) p->next = head->next; return *p; } void Ldelete(int i){ //删除第m个报数的人,将data赋给全局变量k int j=1; Lnode *q, *prev; q=biaoji; prev=head; while(q->next != NULL && j<i){ prev = q; q = q->next; j++; } k = q->data; prev->next = q->next; biaoji = prev->next; free(q); } int main(){ printf("请依次输入人数和密码:\n"); scanf("%d%d",&n,&m); int a[n+5], b=1; head=(Lnode*)malloc(sizeof(Lnode)); end = head; for(int i=1;i<=n;i++){ creatnode(i); } biaoji = head->next; for(int i=n; i>0; i--){ //开始循环 Ldelete(m); a[b]=k; b++; } printf("依次出圈的结果是:\n"); for(int i=1; i<=n; i++){ //输出结果 printf("%d ",a[i]); } return 0; }
在洛谷oj测试的时候发现了以前用队列写的代码
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<queue> using namespace std; queue<int>q; int n, m, s=0, ss; int main(void){ cin>>n>>m; for(int i=1; i<=n; i++){ q.push(i); } while(!q.empty()){ s++; if(s!=m){ ss=q.front(); q.push(ss); q.pop(); } else{ cout<<q.front()<<' '; q.pop(); s=0; } } return 0; }
浙公网安备 33010602011771号