约瑟夫环问题编程实现

来源:互联网 发布:合肥飞友网络怎么样 编辑:程序博客网 时间:2024/05/18 07:12

问题:

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1] 结果+1即为原问题的解

问题分析

  • 构建一个环(由链表来构建)最后一个的指针指向我们最开始的节点
  • 环遍历删除问题
    • 特别是剩下两个元素时需要进行的操作

linkRing.h

#ifndef _LINK_RING_H_#define _LINK_RING_H_#include <assert.h>#include <malloc.h>#include <memory.h>struct NodeT{    int data;           //数据域    struct NodeT * next; //指针域 };typedef struct NodeT * PNode;typedef struct NodeT Node;PNode createRing(int num);  //创建环的个数//void delNext(PNode pNode); //这个用不着,在遍历删除时已经进行了int ring(PNode pNode,int num) ;  //约瑟夫环的遍历函数#endif // _LINK_RING_H_

linkRing.c

#include "linkRing.h"//创建环的个数PNode createRing(int num){    PNode p,pNode;    int i = 0;    assert(num>0);//    pNode=(PNode)calloc(1,sizeof(Node));//分配内存空间    //pNode=(PNode)calloc(1,sizeof(Node));    for(i = 0;i<num;i++)    {        if(i == 0)        {       //头节点的创建           pNode = p = (PNode)calloc(1,sizeof(Node));        }        else {           p->next = (PNode)calloc(1,sizeof(Node));           p = p->next;        }        p->data = i+1;        p->next = NULL;    }    p->next = pNode;  //将这个数据形成一个环,链表的最后一个节点指向头节点    return pNode;}//void delNext(PNode pNode)//{//    PNode p = NULL;//    assert(pNode!=NULL);//    if(pNode->next == NULL)//    {//       printf("this node don't have next node");//    }//    else{//        p = pNode->next;//        pNode->next = p->next;//        free(p);//        p = NULL;//    }//}int ring(PNode pNode,int num)  //第几个出局{   PNode p = NULL;   int i = 1;   assert(pNode!=NULL);   while(pNode->next != NULL)   {      if(i == num-1)      {         p = pNode->next;         if(p->next == pNode)   //当只存在两个数据时,pNode->next = p; p->next = pNode;删除数据的方式         {            printf("current out num is:%d\n",p->data);            free(p);            pNode->next = NULL;            break;         }         else{        //其他删除数据的方式            pNode->next = p->next;            printf("current out num is:%d\n",p->data);            free(p);            i = 0;   //当前值为pNode,没有向后移动            p = NULL;         }      }      pNode = pNode->next;      i++;   }   return pNode->data;}

测试的main

#include <stdio.h>#include <stdlib.h>#include "linkRing.h"int main(){    PNode pNode = NULL;    pNode = createRing(5);    printf("最终的结果是:%d",ring(pNode,3));    return 0;}

结果截图:

这里写图片描述

0 0