059.约瑟夫环

简介: 059.约瑟夫环
#include <stdio.h>
#include <malloc.h>
#define  N 7                                         //定义N=7,表示有7个链表单元
#define  OVERFLOW  0
#define  OK  1
typedef struct LNode{                              //定义链表结构
  int password;
  int order;
  struct LNode *next;
}LNode,*LinkList;
int  PassW[N]={3,1,7,2,4,8,4};
void  Joseph(LinkList p,int m,int x);          //声明函数
int main()
{    
  int  i,m;
  LinkList  Lhead,p,q;     //定义三个指向链表结构的指针
  Lhead=(LinkList)malloc(sizeof(LNode));  //初始化头节点
  if(!Lhead)return OVERFLOW;                   //分配空间失败返回
  Lhead->password=PassW[0];
  Lhead->order=1;
  Lhead->next=NULL;
  p=Lhead;
  for(i=1;i<7;i++){
    if(!(q=(LinkList)malloc(sizeof(LNode))))return OVERFLOW;
    q->password=PassW[i];                      //初始化循环列表中的密码值
    q->order=i+1;
    p->next=q;p=q;                 //新创建一个指针节点并使p->next指向它,再使p=q
  }
  p->next=Lhead;                        //使p->next指向头节点,从而形成循环链表
  printf("请输入第一次计数值m:  \n");
  scanf("%d",&m);                                      //用户输入第一次计数值m
  printf("第一次计数值m= %d \n",m);
  Joseph(p,m,N);
    return OK;
}
void  Joseph(LinkList p,int m,int x){
  LinkList q;
  int i;
  if(x==0)return;                          //链表中没有节点的话,立即返回上一层函数
  q=p;
  m%=x;                                  //m对x求余,从而求出链表中的第几个单元是所求节点
  if(m==0)m=x;               //若m刚好可以整除x,则令m=x,因为如果m=0,则不进行下一个
  //for循环,那样就无法使q指向要删除节点,p指向他的的前一节点,那样则无法进行删除操作  
  for(i=1;i<=m;i++){
    p=q;
    q=p->next;                    //使q指向要删除的节点,p指向q的前一个节点
  }
  p->next=q->next;                              //从循环链表中删除q指向的节点
  i=q->password;
  printf("%d  ",q->order);                     
  free(q);                                        //释放q指向的空间
  Joseph(p,i,x-1);
}
相关文章
|
9月前
|
存储 算法
|
5月前
约瑟夫环问题的几种解法
约瑟夫环问题的几种解法
74 0
|
6月前
|
算法
约瑟夫环问题(三种方法)
约瑟夫环问题(三种方法)
94 0
|
9月前
|
Java
(五)Java数据结构之循环链表解决约瑟夫(Josephus)环问题
(五)Java数据结构之循环链表解决约瑟夫(Josephus)环问题
65 0
|
10月前
|
算法 索引 Python
细究“约瑟夫环”
细究“约瑟夫环”
77 0
|
11月前
约瑟夫环问题
使用queue<int>q记得加上头文件#include<queue>
55 0
约瑟夫环
题目: 已知n个人(以编号1,2,3--n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人有出列;以此规律重复下去,知道圆桌周围的人全部出列。输出出列顺序和最后剩下的人。
74 0
|
Java
约瑟夫环问题Java实现
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。
94 0
|
算法 Java
算法 | 链表的应用,约瑟夫问题
算法 | 链表的应用,约瑟夫问题
100 0
算法 | 链表的应用,约瑟夫问题