数据结构 约瑟夫环

#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;
}

 

posted @ 2020-11-22 13:46  Sonoda_Umi  阅读(163)  评论(0)    收藏  举报