大二,数据结构,约瑟夫问题的一种描述:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。首先任选一个整数作为报数上限值m,从第一个人开始顺时针自1开始顺序报数,求代码

用c语言写出来的代码,可以通关

头歌上的作业

希望大家前程似锦,码字不易,点个小认同吧~

 

 #include<stdio.h>
 #include<stdlib.h>

 typedef struct {
     int no;
    int key;
 } elemty;      
typedef struct link{
elemty data;
struct link *next;
} *list,linklist;      //链表结构

list build(int n)
{
    /*创建存储n个人编号及密码的循环链表!链表结构采用上述定义的linklist */
    /* **********begint********** */
 list head=(list)malloc(sizeof(linklist));
 head->next=NULL;
 list p=(list)malloc(sizeof(linklist));
 head->next=p;
 p->next=NULL;
 for(int i=1;i<=n;i++){
     scanf("%d",&p->data.no);
     scanf("%d",&p->data.key);
     if(i!=n){
         list k=(list)malloc(sizeof(linklist));
         p->next=k;
         p=k;
         k->next=NULL;
     }
     else if(i==n)p->next=head->next;
 }
 return(head);
    /* **********end********** */
}
int main()
 {
     /* 要求采用循环链表完成!*/
     /* **********begint********** */
     int n;
     int m;
     scanf("%d",&n);
     list head;
     head=build(n);
     scanf("%d",&m);
     list q=head;
     list h;
     int i=0;
     int r=0;
     while(r!=n){
         h=q;
         q=q->next;
         i++;
         if(i==m){
             r++;
             printf("%d",q->data.no);
             m=q->data.key;
             h->next=q->next;
             i=0;
             q=h;
         }
     }
     return 0;
     /* **********end********** */
 }

         

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值