算法c语言实现 3-9 循环示例(约瑟夫问题)

  1 #include <stdlib.h>
  2 
  3 typedef struct node* link;
  4 struct node {
  5     int item;
  6     link next;
  7 };
  8 
  9 void main(int argc, char* argv[]){
 10     int i;
 11     int N = atoi(argv[1]);
 12     int M = atoi(argv[2]);
 13     link t = malloc(sizeof *t);
 14     link e = malloc(sizeof *e);
 15     t->item = 1;
 16     t->next = t;
 17     e = t;// e为最后一个节点
 18     for(i = 2; i<= N; i++){
 19         link x = malloc(sizeof *e);
 20         x->item = i;
 21         x->next = e->next;// 把原来最后一个节点的next给新的最后的节点
 22         e->next = x;// 把新的节点加入原来节点后
 23         e = x;// 新的节点变成新的最后一个节点了
 24     }
 25     while(N-- > 0){
 26         printf("%d\n", t->item);
 27         t = t->next;
 28     }
 29     while ( t != t->next){
 30         for(i = 1; i < (M - 1); i++){
 31             t= t->next;
 32         }// 找出第M个的前一个
 33         printf("%d\n", t->next->item);
 34         // 注意下面两步不能写成t=t->next->next; 那样的话没有形成新的闭合循环
 35         t->next = t->next->next;// 把第M个去掉
 36         t = t->next; // 以M的下一个为新的起点
 37     }
 38 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值