zoukankan      html  css  js  c++  java
  • 数据结构之约瑟夫循环

    #include<stdio.h> 
    
    #include<malloc.h>  
    
    //1.元素类型,结点类型和指针类型
    
     typedef struct LNode         //定义结构体,
    
    
    {  
    
     int num,pwd;                 //num用来存储人的序号,pwd用来存储人的密码
    
     struct LNode *next; 
    
    };  
    
    struct LNode *head,*p,*pt;    //定义结点
    
    //2创建循环链表函数、 
    
    int creatLinkList(int n)      //参数n传递人数,
    
    { 
    
       int i;  
    
       head=(struct LNode*)malloc(sizeof(struct LNode)); 
    //创建一个带头结点的链biao
    
       if(!head)  {return 0;}    //创建不成功,返回0 
    
       p=head;  
    
       for(i=1;i<n;i++) 
    
      {  
    
         pt=(struct LNode*)malloc(sizeof(struct LNode)); 
    
         if(!pt)  {return 0;} 
    
         p->next=pt; 
    
         p=pt; 
    
      }  
    
        p->next=head; 
    
     
    
    //构成循环链表
        pt=head; 
          return 0;  
    
    }   
    
    //3.创建输入密码函数
     int enterPwd(int n)        //参数n传递人数
    
    {  
    
       int i,j;  
    
       printf("
    请输入密码: 
    "); 
    
        for( i=1;i<=n;i++) 
    
        {  
    
           scanf("%d",&j);  
    
           pt->num=i;        //num存储人的序号
    
     
    
           pt->pwd=j;         //pwd存储人的密码
    
     
    
           pt=pt->next; 
    
        } 
    
        pt=p; 
    
     
    
    return j; 
    
    }   
    
     //4、创建输出函数
    
     int outList(int m,int n)    //参数m、n传递报数上限值和人数
    {  
    
       int i,a;  
    
       for(i=1;i<=n;i++)         //用一个for循环搜索循环链表
    
       {  
    
          for(a=1;a<m;a++)      //删除结点
    
     
    
          {  
    
            pt=pt->next; 
    
          }  
    
          p=pt->next; 
    
          m=p->pwd;  
    
          printf("%d ",p->num);    //输出人的序号
    
     
    
          pt->next=p->next;  
    
          free(p);          //释放动态申请的结点空间
    
       }  
    
       return 0; 
    
    } 
    
     //主函数
    
     
    
    void main()  
    
    {   int m,n;   //m为报数上限值,n为人数
    
    printf("
    参数m、n传递报数上限值和人数
    "); 
    
        printf("
    请输入m 和n: 
    "); 
    
        scanf("%d %d",&m,&n);  
    
        creatLinkList( n);  //调用创建链表函数
    
     
    
        enterPwd( n);       //调用输入密码函数
    
        printf("
    出队的人依次是:
    "); 
    
        outList( m,n);      //调用输出链表函数
    
     
    
    }
    
  • 相关阅读:
    Java并发--线程间协作的两种方式:wait、notify、notifyAll和Condition
    Java并发--Java线程面试题 Top 50
    Java并发--Timer和TimerTask
    Spring配置--Aop配置详情
    Spring配置--tx事务配置方式
    java并发--Callable、Future和FutureTask
    java并发--CountDownLatch、CyclicBarrier和Semaphore
    精通Matlab数字图像处理与识别
    油砂资源状况与储量评估方法
    家庭自制药蛋
  • 原文地址:https://www.cnblogs.com/gdp176119/p/4962152.html
Copyright © 2011-2022 走看看