| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 689 人关注过本帖
标题:求助:约瑟夫环问题--用链表写的
只看楼主 加入收藏
lichence
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2009-10-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
求助:约瑟夫环问题--用链表写的
约瑟夫环问题:N个人围坐一圈,1,2,3一次报数,数到3的出列,只到剩下一个人,并给出最后一个人的座号
我写的程序如下:
#include<stdio.h>
#include<stdlib.h>
struct number
{
    int n;
    struct number *p_num;
}*head=NULL;

main()
{
    int i,j=1,count=2;                                               //count控制报数
    struct number *p_temp,*p_last,*p_del;                            //建立表头结构指针p_temp和表尾结构指针p_last
    printf("请输入报数筛选的总人数:\n");
    scanf("%d",&i);
   
    p_temp=(struct number *)malloc(sizeof(struct number));           //申请第1级链表节点空间
    p_temp->n=j;
    head=p_last=p_temp;
    for(j=2;j<=i;j++)                                                //建立第2级以后链表,并从2开始给n赋值
    {
        p_temp=(struct number *)malloc(sizeof(struct number));       //申请第j级链表节点空间
        p_temp->n=j;                                                 //第n个节点赋值j,其中n=j
        p_last->p_num=p_temp;
        p_last=p_temp;
    }
    p_temp=head;                                                     //让指针指向链表的表头,为输出做准备
   
    printf("共有%d人参与本次报数筛选,他们的编号如下:\n",i);        //返回用户输入值
    for(j=1;j<=i;j++)
    {
        printf("%d ",p_temp->n);
        p_temp=p_temp->p_num;
    }
    putchar(10);
   
    p_last->p_num=p_temp=head;                                        //第n个节点的尾,接第一个尾,接第一个节点的头,形成链表环

    while(end of loop)                                               //开始报数----退出循环语句不会,这里迷糊了
    {
        p_temp=p_temp->p_num;
        if(count%3==0)                                                //逢3的倍数删节点
        {
            p_del=p_temp->p_num;                                      //p_del指向要删除的节点
            p_temp->p_num=p_del->p_num;                               //隔离要删除的节点
            free(p_del);                                              //释放p_del指针所指向的内存空间,即删除节点
        }
        count++;
    }                                                               
    printf("\n最后留下的是第%d位同学!\n",p_temp->n);
}

请高手看看我的程序,尤其是报数删除节点部分的循环控制语句怎么写?鸣谢!
搜索更多相关主题的帖子: 约瑟夫 链表 
2009-10-30 16:11
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:20 
whiel循环用 while(p_temp!=p_temp->p_num)
你删除的节点不对,第一次就把值是4的节点删了。
给你改过:
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct number
{
    int n;
    struct number *p_num;
}*head=NULL;

main()
{
    int i,j=1,count=1;   /* count初值我改为1 */
    struct number *p_temp,*p_last,*p_del;
    printf("请输入报数筛选的总人数:\n");
    scanf("%d",&i);

    p_temp=(struct number *)malloc(sizeof(struct number));
    p_temp->n=j;
    head=p_last=p_temp;
    for(j=2;j<=i;j++)
    {
        p_temp=(struct number *)malloc(sizeof(struct number));
        p_temp->n=j;
        p_last->p_num=p_temp;
        p_last=p_temp;
    }
    p_temp=head;

    printf("共有%d人参与本次报数筛选,他们的编号如下:\n",i);
    for(j=1;j<=i;j++)
    {
        printf("%d ",p_temp->n);
        p_temp=p_temp->p_num;
    }
    putchar(10);

    p_last->p_num=p_temp=head;

    p_last=head;  /* 多加的 */
    while(p_temp!=p_temp->p_num)  /* while循环内和删除节点有改动,你看下。 */
    {

       if(count%3==0)
        {
         p_del=p_temp;
         p_temp=p_temp->p_num;
         p_last->p_num=p_temp;
         p_temp=p_last;
         free(p_del);
        }
      p_last=p_temp;
      p_temp=p_temp->p_num;
        count++;
    }
    printf("\n最后留下的是第%d位同学!\n",p_temp->n);
}


努力—前进—变老—退休—入土
2009-10-30 17:03
lichence
Rank: 1
等 级:新手上路
帖 子:13
专家分:8
注 册:2009-10-6
收藏
得分:0 
回复 2楼 UserYuH
非常感谢,写的多了就晕了……呵呵
2009-10-30 17:11
快速回复:求助:约瑟夫环问题--用链表写的
数据加载中...
 
   



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

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