| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 545 人关注过本帖
标题:数据结构的一道题(约瑟夫环),麻烦看一下哪错啦???
只看楼主 加入收藏
拂晓晨曦
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-24 19:37
拂晓晨曦
Rank: 2
等 级:论坛游民
帖 子:87
专家分:44
注 册:2010-10-31
收藏
得分:0 
给点人气呀,各位斑竹们都看看呀,找不出来错在哪了。。。。。。
2011-03-24 20:36
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:2 
下面输入情况
The first password is :20
The total number is:7
1 3
2 1
3 7
4 2
5 4
6 8
7 4
6
7
4
1
5
3
2
ok
程序代码:
#include <stdio.h>
#include <malloc.h>
typedef struct LNode{
     int number;
     int password;
     struct LNode *next;
}linklist;

   
linklist* 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;
     return q;
}


void Delete(linklist *q,int m,int n)
{
     int x,i=n;
     linklist *t;//t是q前驱
     x=m%n;
     t=q->next;
     while(t->next!=q)//寻找q前驱
         t=t->next;
     while(i>0)//计数器递减到0
     {
         while(--x>0)//寻找删除节点
         {
             t=q;
             q=q->next;
         }
         printf("%d\n",q->number);
         x=q->password%n;

         t->next=q->next;//t指向删除节点的后续
         free(q);//删除
         q=t->next;//重新确定开始位置
         i--;

     }
     printf("ok\n");
}


void main()
{
     linklist *q,*head;
     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;
     head=q;
     scanf("%d%d",&q->number,&q->password);
     for(i=1;i<=n-1;i++)
     {
         q=insert(q);//使用地址返回
     }
     q=q->next;
     Delete(q,m,n);
} 

帮人《---》帮己
2011-03-24 22:02
lisanhu1
Rank: 2
等 级:论坛游民
帖 子:31
专家分:78
注 册:2010-6-24
收藏
得分:8 
楼上的测试结果是错的啊,害得我调试了好久,以为做错了。下面是我的代码
由于LZ没有写注释的习惯,实在看不下去了,于是直接重写了,就结构体是复制的别的都不一样好像
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include "malloc.h"
#define List struct LNode
#define Length sizeof(List)
#define K NULL
int i=0;
struct LNode{
     int id;
     int code;
     struct LNode * next;
};

List * creat(int n)
{
    if(n==0){printf("error!!");return K;}//没有数据时报错

    List *head=K,*np,*tail;//定义链表的头,尾,及新链表
    np=tail=(List *)malloc(Length);//创建起始的链表

    for(i=0;i<n;i++)
    {
        if(i==0)head=np;//只有一个表时头指向它

        printf("Please enter the data:id code\n");
        scanf("%d%d",&np->id,&np->code);
        tail->next=np;//表中元添加素
        tail=np;
        np=(List *)malloc(Length);//新建
    }
    free(np);//释放np指向的内存,最后一个浪费了
    tail->next=head;//让链表打成一个环,好做一些
    return head;//返还head的值,作为引用链表的入口
}

int main (void)
{
    printf("Please enter the numbers: m n\n");
    int m,n;
    scanf("%d%d",&m,&n);//输入m,n

    List *p,*q;//创建指针
    q=creat(n);//指针初始化
    p=(List *)malloc(Length);//由于第一个人报的是1以p指向的下一个为报第一个的人在这里加个过程
    p->next=q;

baoshu:
    for(i=0;i<m-1;i++) p=p->next;//模拟报数到喊M的人前一个

    List *temp;
    temp=p->next;
    m=temp->code;
    printf("%d",temp->id);
    p->next=temp->next;//将temp从链表中抹去,M取得新值
    free(temp);//释放内存

    if(p->next==p)printf("%d",p->id);//判断是否剩一个人
    else goto baoshu;//循环
    system("pause");
    return 0;
}


[ 本帖最后由 lisanhu1 于 2011-3-25 12:14 编辑 ]
2011-03-25 02:57
快速回复:数据结构的一道题(约瑟夫环),麻烦看一下哪错啦???
数据加载中...
 
   



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

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