| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 587 人关注过本帖
标题:一个用链表做踢人的功能,就是约瑟夫算法,看看吧
只看楼主 加入收藏
林浩
Rank: 2
等 级:论坛游民
帖 子:47
专家分:23
注 册:2011-1-12
结帖率:90.91%
收藏
已结贴  问题点数:10 回复次数:3 
一个用链表做踢人的功能,就是约瑟夫算法,看看吧
运行了下
  怎么就循环了一次。有些疑惑? 求解释  
#include<stdio.h>
#include<malloc.h>
#define NULL 0

struct person
{
    int num;
    struct person *next;
}a;

struct person *input(struct person *head)           //建立链表,对人编号,由1号到13号;
{
    int n=0;
    struct person *p1, *p2;
    p1=p2=(struct person *)malloc(sizeof(struct person));
    p1=&a;
    head=p1;
    printf("please input the bianhao:\n");
    while(++n<=13)
    {
        scanf("%d", &p1->num);
        if(n==13)
        {
            p1->next=NULL;
            break;
        }
        p2=p1;
        p1=(struct person *)malloc(sizeof(struct person));
        p2->next=p1;
    }
    return(head);
}

struct person *search(struct person *head, int n)   //0表示被提出,n记录剩下的人数,当剩一人时就退出while

{
    int k=1;
    struct person *p;
    p=head;
    while(n>1)
    {
            if(p->num!=0)
            {
                k++;
                p=p->next;
            }
            else
            {
                p=p->next;
            }
            if(k==3)
            {
                p->num=0;
                n--;   
                k=1;
                p=p->next;
            }
            if(p->next==NULL)
            {
                p=head;
                while(p->num==0)
                {
                    p=p->next;
                }
            }
    }

    return(head);
}

void main()
{
    struct person *head=NULL, *p=NULL;
    int i;
    head=input(head);
    p=search(head, 13);

    printf("the last number is:\n");
   
    for(i=0;i<13;i++)
    {
        if(p->num!=0)
        {
            printf("%d\n", p->num);
        }
        p=p->next;
    }
}
 
搜索更多相关主题的帖子: input 约瑟夫 
2011-03-17 13:37
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:10 
程序没怎么看,我看你是用链表实现,个人觉得链表实现约瑟夫环用单循环链表不错
 //0表示被提出,n记录剩下的人数,当剩一人时就退出while
我觉得你这样修改号码还不如直接删除要剔除的结点,直到*next指向自身结点,这样自然而然就剩下最后一个结点了,然后输出这个结点编号即可

2011-03-17 13:57
变幻小子
Rank: 6Rank: 6
来 自:广东陆丰
等 级:侠之大者
帖 子:188
专家分:473
注 册:2011-3-4
收藏
得分:0 
小鸟路过接分

明天的梦
2011-03-17 14:09
林浩
Rank: 2
等 级:论坛游民
帖 子:47
专家分:23
注 册:2011-1-12
收藏
得分:0 
回复 楼主 林浩
嗯有道理
2011-03-17 18:38
快速回复:一个用链表做踢人的功能,就是约瑟夫算法,看看吧
数据加载中...
 
   



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

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