约瑟夫环问题的程序

原创 2004年07月17日 14:53:00

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

typedef struct lnode
{
    int data;
    int code;
    struct lnode* next;
}lnode, * list;

///////////////////////////////////////////////////////////////////////////////
//辅助函数
lnode* CreateNode()
{
    lnode* p = (lnode*) malloc (sizeof(lnode));
    if (!p)
    {
        exit(0);
    }
    return p;
}

void DestoryNode(lnode* p)
{
    free(p);
}

list ListInsertFront(list l)
{
    lnode *p = CreateNode();
    p->next = l;
    return p;
}

lnode* ListRemoveNext(list prev)
{
    lnode* p = prev->next;
    prev->next = p->next;
    return p;
}

///////////////////////////////////////////////////////////////////////////////
// 创建过程
list CreateRingQueue(int nCount)
{
    list tail, l= CreateNode();
    l->data = 1;
    l->code = nCount;

    tail = l;
    //printf("创建第0个,编号为%d, 自己在%pn",l->code, l);
    for(int i = 1; i < nCount; i++)
    {  
        l = ListInsertFront(l);
        l->code = nCount - i;
        l->data = 0;
        //printf("创建第%d个,编号为%d, 自己在%p, 下一个是%pn", i, l->code, l, l->next);
    }
    tail->next = l; //环形表

    return l;
}

//输入过程
void InitRingQueue(list l, int nCount)
{
    list begin = l;
    int j = 0;

    while( j != nCount)
    {
        printf("输入第%d个的参数", j + 1);
        scanf("%d", &begin->data);
       
        if(begin->data > 0)
        {
            begin = begin->next;
            j++;
        }
    }
   
}


//删除过程
list RemoveFromQueue(list l, int nIdx)
{
    list begin = l, end = l->next;
    int idx = nIdx;

    while(begin != end)
    {
        //printf("从第%d个开始查找第%d个n", begin->code, idx); 
        //查找第n-1个,
        for(int i = 0; i < idx; i++)
        {
            //printf("从第%d个编号为%dn", i, begin->code);
            begin = begin->next;
        }
        //删除第n个
        lnode * p = ListRemoveNext(begin);
       
        //取出下一次的n值
        idx = p->data;

        DestoryNode(p);
        end = begin->next;
    }
    return begin;
}

int main()
{
    int n = 0;
    printf("输入链表长度");
    scanf("%d", &n);
   
    if( n <= 0)
    {
        return 0;
    }
   
    list l = CreateRingQueue(n);
    InitRingQueue(l, n);
    lnode * last = RemoveFromQueue(l, 3);

    printf("last is %d, data is %d", last->code, last->data);
    return 0;
}

【算法设计】约瑟夫环

本科系列课程参见:《软件学院那些课》 问题描述 约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限...
  • xiaowei_cqu
  • xiaowei_cqu
  • 2013年02月21日 14:20
  • 8414

约瑟夫环(数学高效率解法,很详细)

 5.5.4 用数学方法解约瑟夫环(1) 原文copy:http://book.51cto.com/art/201403/433941.htm 5.5.4  用数学方法解约瑟夫环(1...
  • qq_25973267
  • qq_25973267
  • 2015年12月25日 22:49
  • 4626

C++面向对象方法求解约瑟夫环问题

约瑟夫问题有很多种解法及其变种,这里的约瑟夫环问题是这样的: [b]约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数...
  • u010155023
  • u010155023
  • 2015年02月14日 12:39
  • 1028

java循环链表实现约瑟夫环问题

文章主要用循环链表实现了约瑟夫环问题。约瑟夫环问题详细问题可以百度。...
  • mz690048mz
  • mz690048mz
  • 2015年11月19日 19:44
  • 771

C++经典题目:约瑟夫环问题

问题描述: 有n个人围成一圈,顺序排号。从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。 分析: 首先由用户输入人数n,然后对这n个人进行编号【因为如果不编号的话...
  • QianShouYuZhiBo
  • QianShouYuZhiBo
  • 2013年09月26日 23:48
  • 2986

Java实现约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;...
  • qq_21150865
  • qq_21150865
  • 2017年03月05日 14:48
  • 4309

C语言经典算法100例-069-简单约瑟夫环问题

这里我们实现一个简单的约瑟夫环问题,描述如下: 有N个人站成一圈,从
  • mrbourne
  • mrbourne
  • 2014年05月07日 09:24
  • 1442

【数据结构实验】约瑟夫环的实现

#include #include using namespace std; typedef int ElemType; typedef struct LNode {  ElemType num;...
  • qq_32353771
  • qq_32353771
  • 2015年11月10日 11:39
  • 731

约瑟夫环问题

描述了约瑟夫问题的两种解法。一种模拟过程,一种用数学方法推导。
  • KangRoger
  • KangRoger
  • 2014年09月13日 21:11
  • 45197

数据结构:约瑟夫环问题

约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如...
  • HMYANG314
  • HMYANG314
  • 2014年09月23日 12:47
  • 1883
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:约瑟夫环问题的程序
举报原因:
原因补充:

(最多只允许输入30个字)