【数据结构】用单链表求解约瑟夫环问题

实验2  单链表的基本操作

一、实验目的

熟练应用链表存储结构,实现顺序单链表,顺序双向链表上的初始化、查找、插入、删除等基本操作。

二、实验软硬件要求

硬件:一台安装了windows操作系统的计算机。

软件:C语言编程工具

  • 实验内容(需写出源程序)

用链表存储结构,求解以下问题:

2、求解约瑟夫环问题:已知 n 个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。

  1. 输入玩游戏人数n、起始编号k和计数m
  2. 输出依次出圈的玩家编号和胜利者编号

2.求解约瑟夫环问题

#include<stdio.h>

#include<stdlib.h>

typedef struct link

{

    int id;

    struct link*next;

}Link;

Link* Creat(int n)//创建循环链表并返回链表尾结点

  {

      Link *head=NULL,*p=NULL,*pr=NULL;

      int i;

      for(i=1;i<=n;i++)//从1开始创建n个链表节点,并依次赋值i

      {

          p =(Link*)malloc(sizeof(Link));

          if(p==NULL)

          {

              printf("ERROR");

              return NULL;

          }

          p->id=i;

          if(head==NULL)

          {

              head=p;

          }

          else

          {

              pr->next=p;

          }

          pr=p;

      }

      pr->next=head;

      return pr;

  }

  void YueSeFu(Link*tail,int n,int m,int *a)//用于确定出圈顺序

  {

      int count=0,flag=0;//报数值与死亡人数值

      Link*p=tail->next,*q=tail;

      while(flag<n-1)

      {

          count++;//报数

          if(count==m)

          {

              *a=p->id;

              a++;

              q->next=p->next;

              free(p);

              p=q->next;//p移动到下一个人

              count=0;

              flag++;

          }

          else// 移动到下一个人

          {

              q=p;p=p->next;

          }

      }

      *a=p->id;

      free(p);

  }

  int main(void)

  {

      int n,m;

      scanf("%d %d",&n,&m);//总人数与出圈人数

      int a[n];

      Link*tail=NULL;

      tail=Creat(n);

      YueSeFu(tail,n,m,a);

      for(int i=0;i<n;i++)

      {

          printf("%d ",a[i]);

      }

结果



我的其他专栏:

单片机原理

模式识别原理

数字电子技术实验

自动控制原理

模拟电子技术

数据结构

 

关注我了解更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值