| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 745 人关注过本帖
标题:约瑟夫环问题(运行不出结果来,麻烦各位大虾们看一看,谢谢。。。)
只看楼主 加入收藏
拂晓晨曦
Rank: 2
等 级:论坛游民
帖 子:87
专家分:44
注 册:2010-10-31
结帖率:94.74%
收藏
已结贴  问题点数:10 回复次数:3 
约瑟夫环问题(运行不出结果来,麻烦各位大虾们看一看,谢谢。。。)
【问题描述】
编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出列为止。
【基本要求】
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
【测试数据】
    M的初始值为20;n等于7,7个人的密码依次为:3,1,7,2,4,8,4。
输出为:6,1,4,7,2,3,5


#include <stdio.h>
#include <malloc.h>
typedef struct LNode{
    int number;
    int password;
    struct LNode *next;
}linklist;

   
void insert(linklist *q)
{
    linklist *p;
    p=(linklist*)malloc(sizeof(linklist));
    scanf("%d%d",&p->number,&p->password);
    p->next=q->next;
    q->next=p;
    q=q->next;
}


void Delete(linklist *q,int m,int n)
{
    int x;
    x=m%n;
    while(q->next!=q)
    {
        while(q->number!=x-1)
        {
            q=q->next;
        }
        printf("%d\t",q->next->number);
        m=q->next->password;
        q->next=q->next->next;
    }
    printf("%d\n",q->number);
}


void main()
{
    linklist *q;
    int m,n,i;
    printf("The first password is :");
    scanf("%d",&m);
    printf("The total number is:");
    scanf("%d",&n);
    if(n>30||n<0)
        printf("Error!");
    q=(linklist*)malloc(sizeof(linklist));
    q->next=q;
    scanf("%d%d",&q->number,&q->password);
    for(i=1;i<=n-1;i++)
    {
        insert(q);
    }
    q=q->next;
    Delete(q,m,n);
}
搜索更多相关主题的帖子: 约瑟夫 顺时针 正整数 
2011-03-23 22:01
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:3 
搞了半天还是没搞出你的预测结果来,
#include <stdio.h>
#include <malloc.h>
typedef struct LNode{
    int number;
    int password;
    struct LNode *next;
}linklist;

   
void insert(linklist *q)
{
    linklist *p;
    p=(linklist*)malloc(sizeof(linklist));
    scanf("%d%d",&p->number,&p->password);
    p->next=q->next;
    q->next=p;
    q=q->next;
}


void Delete(linklist *q,int m,int n)
{
   // int x;
    //x=m%n;
    linklist* p;
    p=q;
    while(q->next!=q)
    {
        while(m-->2)
        {
            p=p->next;
        }
        printf("%d\t",p->next->number);
        m=p->next->password;
        
        linklist* s=p->next;
        if(s==q)
            q=q->next;
        p->next=s->next;
        p=p->next;
        
        free(s);
    }
    printf("%d\n",q->number);
}


void main()
{
    linklist *q;
    int m,n,i;
    printf("The first password is :");
    scanf("%d",&m);
    printf("The total number is:");
    scanf("%d",&n);
    if(n>30||n<0)
        printf("Error!");
    q=(linklist*)malloc(sizeof(linklist));
    q->next=q;
    scanf("%d%d",&q->number,&q->password);
    for(i=1;i<=n-1;i++)
    {
        insert(q);
    }
    q=q->next;
    Delete(q,m,n);
}
2011-03-26 23:53
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:7 
#include <stdio.h>
 #include <malloc.h>
 typedef struct LNode{
     int number;
     int password;
     struct LNode *next;
 }linklist;
 
   
void insert(linklist *q,int n, linklist *head)
{  
    int i;
    for( i=1; i<n; ++i ){
        linklist *p;
        p=(linklist*)malloc(sizeof(linklist));
        scanf("%d%d",&p->number,&p->password);
        q->next=p;
        q=p;
    }
    q->next=head;
}
 

void Delete(linklist *head,int m)
 {
     linklist *q,*p;
     q=head;
     m--;
     while(q->next!=q)//判断是否只有一个结点了
     {
         while( m-1 )//循环到要删除结点的前一个
         {
             q=q->next;
             m--;
         }
         printf("%d\t",q->next->number);
         m=q->next->password;
         q->next=q->next->next;
     }
     printf("%d\n",q->number);
 }
 

void main()
 {
     linklist *head,*q;
     int m,n,i;
     printf("The first password is :");
     scanf("%d",&m);
     printf("The total number is:");
     scanf("%d",&n);
     if(n>30||n<0)
         printf("Error!");
     head=(linklist*)malloc(sizeof(linklist));
     head->next=NULL;
     scanf("%d%d",&head->number,&head->password);
     q=head;
     insert(q,n,head);//改成在末尾追加插入,你的中间插入顺序就反了
     Delete(head,m);
 }
2011-03-27 12:15
袁德凯
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2011-4-8
收藏
得分:0 
// 算法.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

typedef struct node
{
    int date;
    struct node *next;
}Node;
//Node * che(Node *a ,Node *b);
void main( )
{
    int a ,b;
    cout<<"输入人数B,取数间隔A"<<endl;
    cin >>b>>a;
    Node *p=NULL ,*q=NULL;
      Node *w;
    //Node *men=new Node[b] ;
    //p=men;
    for (int i=0;i<b-1;i++)
    {
        p=new Node ;
        static Node *s=p;
        w=s;
        p->date=i+1;
        if (q!=NULL)
        {
            q->next =p;
            q=p;
        }
        else
        {
            q=p;
        }
        //cout<<p->date<<"pq";
        //cout<<q->date;
        //system("pause");
    }

    p=new Node;
    q->next =p;
    p->date=b;
    p->next=w;
    p=p->next;
    //cout<< p->date;
//system("pause");
int c=0,d=0;
    for (int i=0;c<b;i++)
    {
        if (p->date!=0)
        {
            d++;
            
        }

        if (d%a==0 && p->date!=0)
        {
            c++;
            cout<<p->date<<"  ";
            p->date=0;
            
        }
        p=p->next;
    }
//cout<<"pause";
//system("pause");
        p=w;
        q=p;
    p=p->next;
    q->next=NULL;
    do
        {

            q=p;
            p=p->next;
    delete  q;
        }while (p->next!=NULL);
        delete p;
    cout<<"排列完成"<<endl;
    system("pause");

}


我弄的,调试过了,可以的
/*Node * che(Node *a ,Node *b)
    {
        a=b;
        b=b->next;
        return a;
    }*/
2011-04-09 13:40
快速回复:约瑟夫环问题(运行不出结果来,麻烦各位大虾们看一看,谢谢。。。)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029588 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved