| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2517 人关注过本帖, 1 人收藏
标题:我初学C语言,弄了一个简单的人员出列程序。请高人指点。如有人帖上链表解法 ...
取消只看楼主 加入收藏
linpinjin
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-12-30
收藏(1)
 问题点数:0 回复次数:3 
我初学C语言,弄了一个简单的人员出列程序。请高人指点。如有人帖上链表解法,在下感激不尽。
/*出列问题的解法*/

#include<stdio.h>
struct men
 {int nextp;
  int no;
 }link[1000];

void main(void)
  { int i,k=0,m,n,y,count=0;   /**n存储总人数,m存储从第几个人报数,y存储报到此数时该人出列值********/
                               /**count统计已经出列的总人数,初始为0*********************************/
    printf("请输入总人数?");
    scanf("%d",&n);
    printf("从第几个人开始报数?");
    scanf("%d",&m);
    printf("当报数多少时此人出列?");
    scanf("%d",&y);

    for(i=0;i<n;i++)           /*为结构赋初值,成员nextp用来判断是否已经出列,这里全部初始成1,即全部在列*/
     {link[i].nextp=1;link[i].no=i+1;}      /*成员no为人员的编号****************************************/

   while(count!=n)               /*当已出列人数count等于总人数n时,即所有人都已出列,结束循环**********/
    {if(link[m-1].nextp)k++;
 /*由于数组下标是从0开始,这里第m个人所在数组的下标为m-1,k记录报数值,当所对应的nextp为1时,表示该人*/
 /*在列,参予报数;为0时,表示该人已出列,跳过。**********/
     if(k==y)                   /*当k等于y时,满足出列条件*******************************************/
      {printf("%-4d",link[m-1].no);        /*输出该人的编号,即该人对应的结构成员no的值*/
       k=0;link[m-1].nextp=0;         /*计数变量K归零,重新从1开始计数,并把已出列人对应的nextp置为0,不*/
       if((++count)%20==0)printf("\n");} /*再参予报数,count累加出列人数,出列人数达到20人时,换行重新输出*/

      m++;if(m>n)m=1; /*m++驱使下一个人接着报数,当其数值超过报数总人数时,令其为1,又由第1个人接着报数*/
     }
  }
搜索更多相关主题的帖子: 表解 C语言 出列 上链 
2008-02-13 19:50
linpinjin
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-12-30
收藏
得分:0 
因为我手上这本C教程看完了都没有提到链表。网上找了一些资料也看不明白。想知道是怎么回事。
2008-02-13 20:19
linpinjin
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-12-30
收藏
得分:0 
感谢你们的回帖。
2008-02-13 21:24
linpinjin
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-12-30
收藏
得分:0 
终于弄清楚了链表解法,谢谢楼上各位朋友。
/*谢谢楼上诸位的回帖,现在我终于搞清楚了链表怎么解这个题,请高人们指点一下缺陷和不足*/

#include<stdio.h>

typedef struct men
 {int no;
  struct men *next;
 }list;

list *create(int n)                  /*初始化链表*/
{
 list *h,*t,*p;
 int i;
 h=(list*)malloc(sizeof(list));
 h->no=1;
 t=h;
 for(i=2;i<=n;i++)
  {p=(list*)malloc(sizeof(list));
   t->next=p;
   p->no=i;
   p->next=h;
   t=p;
  }
 return (h);
}

void main(void)
 {
  int i,j,k,s,x;
  list *h,*a;
  printf("请输入总人数:");
  scanf("%d",&s);
  printf("从第几人开始报数:");
  scanf("%d",&j);
  printf("报数到多少时该人出列:");
  scanf("%d",&k);

  h=create(s);

  for(i=1;i<j;i++)              /*从第几个人开始报数*/
  h=h->next;

  i=x=0;                        /*i保存报数值,x保存出列人数*/
  while(x!=s)                   /*结束循环的条件和数组解题办法一样,当出列人数为总人数时结束循环*/
   {i++;
    if(i+1==k)
/*这里(i+1=k)实际代表的是当报数到k-1时,后一个人出列,这样做是为了方便释放内存***
 *因为结构中只有指向下一个结点的指针域,如果你们有更好的办法,请帖出来,先谢谢了*/

     {printf("%4d",(h->next)->no);
      a=h->next;h->next=(h->next)->next;free(a);i=0;x++;
      if(x%10==0)printf("\n");
     }
    h=h->next;
   }
}
2008-02-20 04:24
快速回复:我初学C语言,弄了一个简单的人员出列程序。请高人指点。如有人帖上链 ...
数据加载中...
 
   



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

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