数据结构与算法:约瑟夫问题

41个人手拉手,第三个人自杀, 16与31个位置不会死

这里用到循环链表;

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

#构造节点的自定义结构体类型变量
typedef struct node
{
     #数据部分
     int data;
     #指向下个节点的指针部分
     struct node *next;
}

node *create(int n)
{
     #声明一个当前节点p,和一个指向头结点指针head
     node *p = NULL, *head;
     head = (node*)malloc(sizeof (node));
     p = head;
     #声明一个新节点s
     node *s;
     #记录当前节点数
     int i = 1;

     if( 0! = n){
          while(0! = n){
               #动态分配内存生成新节点s
               s = (node*)malloc(sizeof (node));
               s->data = i++
               #让p的指针部分指向s
               p->next = s;
               让当前节点指向s
               p = s;
          }
          #相当于闭链吧,将s的指针指向头节点
          s->next = head->next;
     }
     #释放内存
     free(head);
     #返回该链表的首地址
     return s->next;
}

int main(){
    
     int n=41;
     int m=3;
     int i;
     #生成单向循环链表
     node *p=create(n);
     node *temp;
     #删除m个节点
     m %= n;
     
     #判断是否为空
     while(p != p->next){
          for(i = 0;i < m-1;i++){
               #第二个节点
               p = p->next;
          }
          #打印删除的第三个节点
          printf("%d",p->next->data);
          
          #用temp删除节点
          temp=p->next;
          p->next=temp->next;
          free(temp);
          
          p=p->next;
     }
     #打印循环结束存活的节点
     printf("%d\n",p->data)
     return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值