| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1010 人关注过本帖, 1 人收藏
标题:求高人帮我看看这个“杀人”程序哪出错了?
只看楼主 加入收藏
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:3 
程序代码:
/*
程序采用循环链表的算法实现
m个人围成圈,报到n的人退出,求最后一位的原始编号
*/
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
long int m,n;
struct node *h;
struct node /*链表结点结构*/          
{
  struct node *next;
  int data;
};
struct node * create(struct node *h)  /*创建单向循环链表*/
{
  struct node *p,*q; int i;
  h=p=q=(struct node *)malloc(sizeof(struct node));
  p->next=NULL; p->data=1;
  for(i=2;i<=m;i++)
   {
     p=(struct node *)malloc(sizeof(struct node));
     q->next=p; p->data=i; p->next=NULL;
     q=p;
   }
  p->next=h;
  return h;
}
int fun(struct node *h)  /*操作链表*/
{
  struct node *p=h,*q; int i;
  if(n>1)
  {
      while(p->next!=p)
      {
        i=1;
        while(i<n-1) {p=p->next; i++;}
        q=p->next;
        p->next=q->next;q->next=NULL;
        free(q);
        p=p->next;
      }
  }
  else if(n==1)
  {
      p->data=m;
  }
  return p->data;
}
int main()
{
  struct node *h;
  printf("请输入总人数m:");
  scanf("%d",&m);
  printf("再输入退出者号n:");
  scanf("%d",&n);
  h=create(h);
  printf("最后一位号码是:");
  printf("%d\n",fun(h));
  return 0;
}

这是论坛里的大神写的,我收藏的,你参考着写吧!约瑟夫循环

最基础的往往是你最容易忽略的!
2012-03-29 21:50
天涯海角sxl
Rank: 2
等 级:论坛游民
帖 子:20
专家分:20
注 册:2012-2-20
收藏
得分:0 
回复 9楼 platoooo
#include<stdio.h>       //我C语言也刚入门,这个程序还有很多要改进的地方。
                        // 希望大家提出批评意见,咱们共同学习
#define M 41                  //M控制总人数,可更改
void main()
{
  int sort(int no[M]);
  int no[M],i,j=0,l=M,*p;
  p=no;
  for(i=0;i<M;i++)
  {
      no[i]=i+1;
  }

  while(l>2)                  //l控制最后存活人数
  {
      for(i=0;i<l;i++)        
      {
         if((p+1-no)%3==j)   
         {
             no[i]=0;
         }
         p++;                 
      }
      l=M-sort(no);           //现存活人数
  }
        for(i=0;i<M;i++)
      {
          if(no[i]!=0)
          printf("%d\n",no[i]);
      }
}

int sort(int a[M])   //对数组排序,现存活人按顺序排在数组前面;
                    //死亡的人排在数组后半部分,数组元素赋零值
{
    int *p,*q,m,i;
    p=a;
    q=a;
    while(p-a<M)      //将现存活的人集中一起,按顺序排到数组的前几个元素中去
    {
        if(*p!=0)
        {
           *q=*p;
           q++;         //q已指向现存活的人下一位
        }   
        p++;             //q指向数组末元素的下一位
    }
     m=p-q;              //m是已死亡的人数
     for(i=1;i<=m;i++)
     {
         *(p-i)=0;       //除现存活的人的元素为非零值,其它数组元素均赋零值
     }
     return m;                 //返回已死亡人数
}

2012-03-30 11:41
新手菜鸟鸟
Rank: 2
等 级:论坛游民
帖 子:37
专家分:57
注 册:2012-1-15
收藏
得分:3 
回复 11楼 于祥

      while(p->next!=p)
      {
        i=1;
        while(inext; i++;}
        q=p->next;
        p->next=q->next;q->next=NULL;
        free(q);
        p=p->next;
      }


能不能解释下这里?
2012-03-31 00:37
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
收藏
得分:3 
这个问题是出圈问题,打印出出圈顺序,最后两个出圈的位置就是答案了

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-03-31 08:28
快速回复:求高人帮我看看这个“杀人”程序哪出错了?
数据加载中...
 
   



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

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