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

  • Post author:
  • Post category:其他


用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********** */
 }



版权声明:本文为m0_73729221原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。