| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 780 人关注过本帖, 1 人收藏
标题:找错误(约瑟夫环)
只看楼主 加入收藏
北辰羽光
Rank: 2
来 自:福建
等 级:论坛游民
帖 子:50
专家分:26
注 册:2009-4-17
结帖率:66.67%
收藏(1)
已结贴  问题点数:20 回复次数:9 
找错误(约瑟夫环)
[问题描述]
       约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数),一开始任选一个整数作为报数上限m,从第一人开始按顺时针方向从自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。
[基本要求]
    采用单向循环链表模拟此过程,按照出列的顺序印出各人的编号
 [测试数据]
      m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8, 4,首先m的值为6(正确的出列顺序应为6,1,4,7,2,3,5)

代码:
#include<stdio.h>
#include<stdlib.h>
#define N 7
typedef int elemtype;
typedef struct lnode
{
    elemtype code;
    elemtype key;
    struct lnode *next;
}lnode,*linklist;
void create_L(linklist &L,int n)  //创建一个无头结点的循环链表,n为结点个数
{
    linklist p,q;int i=1;
    L=(linklist)malloc(sizeof(lnode));
    p=(linklist)malloc(sizeof(lnode));    p=q=L;
    p->code=1;
    scanf("%d",&p->key);
    for(i=1;i<n;i++)
    {
        p=(linklist)malloc(sizeof(lnode));
        p->code=i+1;
        scanf("%d",&p->key);
        q->next=p;p->next=L;
        q=q->next;
    }
}
void del_L(linklist &L,linklist &p,int &m)  //删除第m个节点
{
    linklist q;
    if(L->next==L) printf("%d",L->code);
    else
    {   int i=1;
        while(i!=m)
        {
            i++;
            q=p;
            p=p->next;
        }
         m=p->key;
         printf("%d\n",p->code);
         q->next=p->next;
         free(p);
         p=q->next;
    }
}
void main()
{    linklist L,p;int m=20;
     printf("输入链表数据\n");
     create_L(L,N);
     p=L;
     while(L->next!=L)
         del_L(L,p,m);
      printf("\n");
}

编译时无错误,但运行测试数据时出错,只能输出出列顺序6,1,4,7,2,3,最后一个数据出不来。请大家帮帮忙
搜索更多相关主题的帖子: 约瑟夫 
2009-11-09 15:39
tdy1006
Rank: 4
等 级:业余侠客
帖 子:173
专家分:240
注 册:2009-5-13
收藏
得分:5 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define N 7
typedef int elemtype;
typedef struct lnode
{
    elemtype code;
    elemtype key;
    struct lnode *next;
}lnode,*linklist;
void create_L(linklist &L,int n)  //创建一个无头结点的循环链表,n为结点个数
{
    linklist p,q;int i=1;
    L=(linklist)malloc(sizeof(lnode));
    p=(linklist)malloc(sizeof(lnode));    p=q=L;
    p->code=1;
    scanf("%d",&p->key);
    for(i=1;i<n;i++)
    {
        p=(linklist)malloc(sizeof(lnode));
        p->code=i+1;
        scanf("%d",&p->key);
        q->next=p;p->next=L;
        q=q->next;
    }
}
void del_L(linklist &L,linklist &p,int &m)  //删除第m个节点
{
    linklist q;
    if(L->next==L) printf("%d",L->code);
    else
    {   int i=1;
        while(i!=m)
        {
            i++;
            q=p;
            p=p->next;
        }
         m=p->key;
         printf("%d\n",p->code);
         q->next=p->next;
         free(p);
         p=q->next;
    }
}
void main()
{    linklist L,p;int m=20;
     printf("输入链表数据\n");
     create_L(L,N);
     p=L;
     while(L->next!=L)
         del_L(L,p,m);
    del_L(L,p,m);//最后一个结点没读
      printf("\n");
}
不知道为什么我的机器会死循环但是能读出七个点
2009-11-09 21:39
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:15 
明显倒数第二个删除的时候不当,改了下,可以运行,有时间再改好点,好像L没必要的样子···另外··怎么关于链表的题不多人看的··
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define N 7
typedef int elemtype;
typedef struct lnode
{
    elemtype code;
    elemtype key;
    struct lnode *next;
}lnode,*linklist;
void create_L(linklist &L,int n)  //创建一个无头结点的循环链表,n为结点个数
{
    linklist p,q;int i=1;
    L=(linklist)malloc(sizeof(lnode));
    p=(linklist)malloc(sizeof(lnode));    p=q=L;
    p->code=1;
    scanf("%d",&p->key);
    for(i=1;i<n;i++)
    {
        p=(linklist)malloc(sizeof(lnode));
        p->code=i+1;
        scanf("%d",&p->key);
        q->next=p;p->next=L;
        q=q->next;
    }
}
void del_L(linklist &L,linklist &p,int &m)  //删除第m个节点
{
    linklist q;
    
        int i=1;
        while(i!=m)
        {
            i++;
            q=p;
            p=p->next;
        }
         m=p->key;
         printf("%d\n",p->code);
         if(p->next->next==p)
             printf("%d",p->next->code),free(p),exit(0);
         q->next=p->next;
         free(p);
         p=q->next;
}
void main()
{    linklist L,p;int m=20;
     printf("输入链表数据\n");
     create_L(L,N);
     p=L;
     while(L->next!=L)
         del_L(L,p,m);
      printf("\n");
}

2009-11-10 13:53
北辰羽光
Rank: 2
来 自:福建
等 级:论坛游民
帖 子:50
专家分:26
注 册:2009-4-17
收藏
得分:0 
回复 2楼 tdy1006
这样该还是不行,我觉得是循环语句控制的问题
2009-11-10 17:39
北辰羽光
Rank: 2
来 自:福建
等 级:论坛游民
帖 子:50
专家分:26
注 册:2009-4-17
收藏
得分:0 
回复 3楼 lijm1989
谢谢了,这样该就对了。但是我不太明白其中的原理,能讲一下么?
我的源程序运行时出现这样的警告
图片附件: 游客没有浏览图片的权限,请 登录注册

这是怎么引起的?
2009-11-10 17:48
jackwain
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:134
注 册:2009-3-21
收藏
得分:0 
1、算法思路
(1)对于已知的n个人的密码可有inputdata函数实现,该函数构造建立带头接点的单向循环链表,指向单向循环链表的指针可以作为该函数值返回。该函数被主函数调用。空间均在响应的函数中动态存储分配,首地址返回;n值也要从响应的函数中返回。这些函数被主函数调用。
 (2)从得到的单向循环链表,根据约瑟夫问题的要求,构造Joseph函数,该函数中要设置2个指针position和 pre,position指向当前报数的结点,pre为position结点前面的结点,开始时,position和 pre都指向单向循环链表的头结点。对于出列的人(结点),在该函数中输出其编号。该函数被主函数调用。
(3)、在主函数中要设置是选择已知的n和n个人的密码的情况和还是要从键盘输入的n和n个人的密码的情况,然后调用响应的函数来得到n和n个密码。
2、数据结构
typedef struct node /* 单向循环链表结点结构 */
{int num;
 int m;
 struct node *next;
}node;
3、基本操作
(1)    node *inputdata(int n) /* 从键盘输入n和n个人的密码,n用其地址
{ …                       传入,n值要返回 */
head=(node *)malloc(sizeof(node)); /* 其空间由动态存储分配,起
                                   始地址由该函数返回。*/
for(i=0;i<*n;i++)  /* 输入n个人的密码,同时产生n个人的编号 */

    }
(2) void joseph(node *head,int n)/*根据单向循环链表l,求解约瑟夫问题 */
{

for (i=1;i<n;i++)
  {
    ……
    do
      {                              
……
       count++;
     }while (count!=m);
输出出列人的编号;
      删除出列人 ;
     }
}
4、主程序
main()
{ node *head;
    int n;
printf("输入人员总数\n");
scanf("%d",&n);
 head=inputdata(n);
 joseph(head,n);
}
5、输出结果
(1)    对于要从键盘输入的n和n个人的密码的情况(任选)
初始密码为7
 input n: 10
no:  1  input m: 9
no:  2  input m: 15
no:  3  input m: 3
no:  4  input m: 7
no:  5  input m: 14
no:  6  input m: 10
no:  7  input m: 19
no:  8  input m: 6
no:  9  input m: 12
no: 10  input m: 8
   6    7   10    1    4    8    2    9    5    3
2009-11-10 20:42
fuqingjun
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:48
专家分:80
注 册:2009-11-2
收藏
得分:0 
回复 5楼 北辰羽光
程序调用了不该调用的内存后被系统中的内存管理软件检测出来了。给了个提示。 所以做软件或程序时学好内存 管理 会对你有很大帮助的。
这种情况叫 内存冲突

我是猪猪,我很想进步,寻志同道合者革命途中并肩行路!
2009-11-10 21:45
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
         q->next=p->next;
         free(p);
         p=q->next;
问题就出在你的删除节点处理的时候,如LS所说建议LZ去看看关于删除节点的操作···
这是我以前学的时候收藏的链接··http://blog.
讲的挺具体的···看了后对比下大概就知道出在哪了···
2009-11-10 22:53
北辰羽光
Rank: 2
来 自:福建
等 级:论坛游民
帖 子:50
专家分:26
注 册:2009-4-17
收藏
得分:0 
回复 7楼 fuqingjun
多谢
2009-11-12 11:05
北辰羽光
Rank: 2
来 自:福建
等 级:论坛游民
帖 子:50
专家分:26
注 册:2009-4-17
收藏
得分:0 
回复 8楼 lijm1989
   先去初略看了下  挺好的  谢谢
2009-11-12 11:09
快速回复:找错误(约瑟夫环)
数据加载中...
 
   



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

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