使用循环链表实现约瑟夫环(围圈报数问题)

刚开始学C,碰到经典的围圈报数问题,现先将实现代码附下:

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

struct LNODE{            //链表定义
 int data;
 struct LNODE *next;
};
typedef struct LNODE Lnode;
typedef struct LNODE *LinkList;
struct LNODE *create(int s[])      //创建单项循环链表
{
 struct LNODE *head=NULL,*p=NULL,*last=NULL;
 int i=0;
 head=(struct LNODE *)malloc(sizeof(struct LNODE));
 if(!head)
 printf("memory allocation error!");
 if(s[0]!=0)
 {
  
  head->data=s[0];
  head->next=head;
  last=head;
   i++;
  while(s[i]!=0)      //判断是否为0,为0则结束
  {
   p=(struct LNODE*)malloc(sizeof(struct LNODE));
   last->next=p;
   p->data=s[i];  
   p->next=head;
   last=p;
   i++;
  }
 }
 return head;
}
void printlist(struct LNODE *head)    //打印循环链表
{
 struct LNODE *q;
 int i;
 printf("the linked list is :\n");
 if(!head)
  printf("NULL");
 else
 {
  q=head;
  do
  {
   printf("%d\t",q->data);
   q=q->next;
  }while(q!=head);
 }
 printf("\n");
 
}
  
  
int main()
{
 int  circlelist[100],n,i,k=1;
 printf("please input the number:");
 scanf("%d",&n);      //输入人数
 getchar();
 for(i=0;i<n;i++)
  circlelist[i]=i+1;      //给每个人编号
 circlelist[i]=0;        //最后值赋0
 for(i=0;i<=n;i++)
  printf("%d\t",circlelist[i]);    //打印编号
 LinkList p=NULL,q=NULL;
 p=create(circlelist);
 printlist(p);          //打印编号链表
 while(p->data!=p->next->data)    //自身与自身相等时退出循环
 {
  if(k!=3)                //设置报到数3的人退出
  {
   k++;
   q=p;
   p=p->next;
  }
  else
  {
   k=1;
   printf("%d\t",p->data);      //打印先后推出的人员编号
   q->next=p->next;        //删除报3的人员结点
   p=q->next;
  }
 }
 printf("\n%d\n",p->data);

}

刚开始指针定义时都没有赋值为NULL,调试没错误,可是却无法执行。

书中说,建议定义时如果暂时不使用指针,先赋值为NULL,我觉得最好这样做,而且,在使用指针时,都应该判断一下是否为空。

时间: 2024-08-23 13:24:51

使用循环链表实现约瑟夫环(围圈报数问题)的相关文章

C++循环链表解决约瑟夫环问题

约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? “约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.”(百度百科中的解决办法列出了很多,可以看到循环链表并不是最简单的方法) 这道面试题考察了循环链表的“创建”,

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

1334:【例2-3】围圈报数

1334:[例2-3]围圈报数 时间限制: 1000 ms         内存限制: 65536 KB提交数: 2253     通过数: 1482 [题目描述] 有nn个人依次围成一圈,从第11个人开始报数,数到第mm个人出列,然后从出列的下一个人开始报数,数到第mm个人又出列,…,如此反复到所有的人全部出列为止.设nn个人的编号分别为1,2,…,n1,2,…,n,打印出列的顺序. [输入] nn和mm. [输出] 出列的顺序. [输入样例] 4 17 [输出样例] 1 3 4 2 [提示]

围圈报数 c

#include<stdio.h> /*围圈报数*/ void left(int *p,int m,int n) { int i,j,count; i = j = count = 0; while(count < m-1) { if(*(p+i) != 0) j++; if(j == n) { *(p+i) = 0; count++; j = 0; } if(++i == m) i = 0; } } int main(void) { int x,y; scanf("%d%d&q

【例2-3】围圈报数

[例2-3]围圈报数 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1334时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,-,如此反复到所有的人全部出列为止.设n个人的编号分别为1,2,-,n,打印出列的顺序. [输入] n和m. [输出] 出列的顺序. [输入样例] 4 17 [输出样例]

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

用循环链表解决约瑟夫环的问题

约瑟夫环问题简介 约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,直到所有人全部出圈为止.当任意给定n和m后,设计算法求n个人出圈的次序.  稍微简化一下. 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 解题思路 将每个人的编号作为结点值,因为报数是循环着来的,故可

C++ 用循环链表解决约瑟夫环问题

约瑟夫环问题 已知 n 个人(n>=1)围坐一圆桌周围,从 1 开始顺序编号,从序号为 1 的人开始报数,顺时针数到 m 的那个人出列.下一个人又从 1 开始报数,数到m 的那个人又出列.依此规则重复下去,直到所有人全部出列.请问最后一个出列的人的初始编号. 要求 输入人数 n,所报数 m,输出最后一个人的初始编号. 解决思路 首先因为是圆桌问题,使用链表解决的话需要构建循环链表. 接着是出列问题,这里我的设计思路是将指向链表的指针移动到需要出列的人的位置,然后根据正常的链表删除进行操作即可.

用循环链表解决约瑟夫环问题

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 下面我们用循环列表模拟这个过程: 1 //节点定义与单链表相同,在此省略 2 //use cyclical linked list to solve josephus problem 3 template <typename Type> class Linked