您的位置:首页 > 编程语言

约瑟夫环问题编程实现

2016-07-29 13:25 211 查看

问题:

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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;
}


结果截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  约瑟夫环 编程