/**********************************************************************
程序作者:冰糖
章 节:第一次上机
题 号:3.1 顺序
题 目:输入正整数n、m(m<n),设有n个人坐成一圈,
从第1个人开始循环报数,报到m的人出列,然后再从下一个人开始报数,
报到m的人又出列,如此重复,直到所有的人都出列为止。
要求用链式结构和顺序结构实现,按出列的先后顺序输出每个人的信息。
最后修改日期:2019年10月19日
***********************************************************************/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef int Position;
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType* elem;
Position length;
}List;
Status InitList(List &L);
Status OutList(List &L,int n,int m);
int main()
{
int m,n,t,i;
List L;
InitList(L);
printf("请输入总人数n:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
t=i;
L.elem[i]=t+1;
L.length++;
}//********************************************建立含n个数的线性表
printf("请输入m:\n");
scanf("%d",&m);
OutList(L,n,m);
return 0;
}
Status InitList(List &L)
{
L.elem=(ElemType*)malloc(MAXSIZE*(sizeof(ElemType)));
if(!L.elem)
{
printf("分配内存失败!");
return ERROR;
}
else
{
L.length=0;
return OK;
}
}
Status OutList(List &L, int n,int m)
{
int i,j=0,flag=0;//j用于标记第j个出列的人的序号 , flag用于计数
int l=L.length;
while(L.length>1)
{
if(L.elem[i]!=0)
{
flag++;
if(flag==m)
{
printf("第%d个出列的人是%d号\n",j++,L.elem[i]);
L.elem[i]=0;
flag=0;//flag达到一个计数周期重置为零进入下一个计数周期
L.length--;
}
}
i++;
i=i%n; //取模运算,从头开始
}
for(i=0;i<l;i++)
{
if(L.elem[i]!=0)
{
printf("最后剩下来的是:%d号",L.elem[i]);
}
}
}
数据结构 上机1 3_(1) 顺序实现报数出列 设有n个人坐成一圈,从第1个人开始循环报数,报到m的人出列,然后再从下一个人开始报数,报到m的人又出列,如此重复,直到所有的人都出列为止。
最新推荐文章于 2020-11-14 14:46:26 发布