| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1098 人关注过本帖, 1 人收藏
标题:求助,约瑟夫环问题,不知道哪儿错了!
只看楼主 加入收藏
精英
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-10-12
结帖率:50%
收藏(1)
已结贴  问题点数:5 回复次数:12 
求助,约瑟夫环问题,不知道哪儿错了!
问题描述:约瑟夫环问题
       设有n个人(编号为1,2,3 ,…… ,n),围坐一圈,现从指定的第一个人从 1 开始报数,数到第m个人时出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,……,如此重复,直到剩余 1 人为止。要求:用单向循环链表实现,输出出列人的编号和最后剩余人的编号。


#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
    int num;
    struct LNode *next;
}LNode,*LinkList;

void Createlist_L(LinkList &L,int n)
{
    int i;
    LinkList p;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=L;
for(i=n;i>0;i--)
{
    p=(LinkList)malloc(sizeof(LNode));
    scanf("%d\n",&p->num);
    p->next=L->next;
    L->next=p;
}
}
void ListDelete_L(LinkList &L,int m)
{
    int i;
    LinkList p,q;
    q=p=L;
    if(q->next!=q)
    {
        for(i=1;i!=m;i++)
        {
            q=p;
            p=p->next;
        }
        if(i==m)
        {
            printf("输出:\n",p->num);
        p=p->next;
        q->next=p;
        }
    }
        if(q->next==q)
            printf("输出:\n",q->num);
}

void main()
{
    int m,n;
    LinkList L;
    scanf("%d\n",&n);
    Createlist_L(L, n);
    scanf("%d\n",&m);
    ListDelete_L(L, m);
}
搜索更多相关主题的帖子: 约瑟夫 
2009-10-12 20:34
zhangxf1989
Rank: 6Rank: 6
等 级:侠之大者
帖 子:96
专家分:419
注 册:2009-9-5
收藏
得分:5 
因为我实在是太菜,看不懂你的程序,所以只好把你的整个程序改写了,希望这个还是对你有所帮助。
程序代码:
#include<stdio.h> 
#include<malloc.h> 
typedef struct LNode 
{ 
    int num; 
    struct LNode *next; 
}LNode,*LinkList; 
 
void Createlist_L(LinkList *L,int n) /*LinkList *L是定义了一个指向指针(你在main函数中定义的L)的指针,定义指针是用*不是&(&是取地址)*/
{ 
    int i; 
    LinkList p,q; 
 
    (*L)=(LinkList) malloc(sizeof(LNode)); 
    (*L)->num=n; 
    q=(*L); 
     
    for(i=1;i<n;i++) 
    { 
        p=(LinkList)malloc(sizeof(LNode)); 
        p->num=i; 
        q->next=p; 
        q=p; 
    } 
    q->next=(*L); 
} 
 
void ListDelete_L(LinkList L,int m) 
{ 
    int i; 
    LinkList p,q,n; 
    q=L; 
    p=L->next; 
    for(i=1;;i++) 
    { 
        n=p->next; 
        if(p==q) 
            break;             
        if(i==m) 
        { 
            printf("%d\n",p->num); 
            free(p); 
            p=NULL; 
            q->next=n; 
            i=0; 
        } 
        else 
        { 
            q=p; 
        } 
        p=n;     
    } 
     printf("The last is %d\n",p->num); 
     free(p); 
} 
 
int main() 
{ 
    int m=3,n=10; 
    printf("Please input m,n:"); 
    scanf("%d%*c%d",&m,&n); 
    LinkList L; 
    Createlist_L(&L, n); 
    ListDelete_L(L, m);
    getch(); 
    return 1; 
}


[ 本帖最后由 zhangxf1989 于 2009-10-15 15:19 编辑 ]
2009-10-15 15:18
精英
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-10-12
收藏
得分:0 
回复 2楼 zhangxf1989
getch()是用来干嘛的???
2009-10-16 23:38
zhangxf1989
Rank: 6Rank: 6
等 级:侠之大者
帖 子:96
专家分:419
注 册:2009-9-5
收藏
得分:0 
让程序暂停一下,当有一键按下之后程序才运行结束退出,避免窗口一闪而过而看不到结果。在程序最后加一个getch()是一种比较好的编程习惯!
2009-10-17 20:38
精英
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-10-12
收藏
得分:0 
但是,我运行你的程序时出错了啊,就是这个,error C2065: 'getch' : undeclared identifier
2009-10-17 23:17
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
加个#include<conio.h>看看。

离恨恰如春草,更行更远还生。
2009-10-18 02:16
hzyzxj
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:76
专家分:168
注 册:2009-6-14
收藏
得分:0 
你们用的编译器应该不一样吧,getch();是在win-tc中的,其它编译器如vc是不用加的,加了也通不过。
2009-10-18 08:55
精英
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-10-12
收藏
得分:0 
回复 7楼 hzyzxj
也就是说加这个东西对我用VC来说没什么用处是吗?
2009-10-18 16:53
精英
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-10-12
收藏
得分:0 
回复 6楼 玩出来的代码
这个事干什么用的??
2009-10-18 16:54
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
#include<conio.h>是包含头文件,用getch()需要包含这个头文件,就如用标准输入输出需要头文件#include"stdio.h"不过有些编辑器是可以省的例如楼上说的WINTC,getch()功能上面已经说了。

离恨恰如春草,更行更远还生。
2009-10-18 17:07
快速回复:求助,约瑟夫环问题,不知道哪儿错了!
数据加载中...
 
   



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

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