中易网

急求C语言关于约瑟夫环问题,关于指针

答案:2  悬赏:0  
解决时间 2021-01-08 01:20
急求C语言关于约瑟夫环问题,关于指针
最佳答案
以前做过一个,函数结合指针的,还有用单链表处理的,给你贴一个,仅供参考#include
#include
//应用函数调用来实现
void Fun_Kill(int *pa,int n,int m)
{
for(int i=0;i {
*(pa+i)=i+1;//给每个人编号
}
i=0;
int mCount=0;
int iCount=0;
while(iCount {
if(*(pa+i)!=0)//报数条件,编号不为0
{
mCount++;
}
if(mCount==m)
{
printf("%d is out!\n",*(pa+i));//输出出局者的编号
mCount=0;//重新开始报数
iCount++;//出局人数统计
*(pa+i)=0;//出局者编号改为0,下次报数不进入计数
}
i++;//报数的同时指针也开始走动
if(i==n)
{
i=0;//当i==n的时候,让i=0,让指针重新指向第一个人,循环计数
}
}
for(i=0;i {
if(*(pa+i)!=0)
{
printf("%d is survival!",*(pa+i));
}
}
}int main()
{
int n,m;
printf("请输入总人数:");
scanf("%d",&n);
printf("请输入要报的数:");
scanf("%d",&m);
int *pKill=(int *)malloc(sizeof(int)*n);
Fun_Kill(pKill,n,m);
free(pKill);
pKill=NULL;
return 0;
}
全部回答
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define ElemType int
typedef int Status;// 链表类型
typedef struct Node
{
ElemType data;
struct Node *next;
} Node, *LinkList;// 判断存储分配是否成功
Status MallocOK(LinkList P)
{
if(P) return(1);
printf("\n Malloc Error \n");
return(0);
}// 建立一个带头结点的、能够产生n个数据元素的线性链表L
void CreateJosephus(LinkList &L,int n)
{
L=(LinkList) malloc(sizeof(Node));
if (MallocOK(L)==0) return;
L->next=L;
LinkList p,q=L;
int i;
for (i=1; i<=n; ++i)
{
p = (LinkList)malloc(sizeof(Node)); //生成新结点
if (MallocOK(p)==0) return;
q->next=p;
p->data=rand()%100+1;
q=p;
}
p->next=L;
}// 输出线性链表L中的所有数据元素
void PrintJosephus(LinkList L)
{
LinkList p=L->next;
printf("\nJosephus = ( ");
while (p!=L && L->next!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf(")\n");
}// 销毁线性链表L
void DestroyJosephus(LinkList &L)
{
free(L);L=NULL;
printf("\n线性链表L已销毁\n");
}// 根据计数情况依次弹出线性链表L中的n个数据元素
void Josephus(LinkList &L,int n,int k,int m)
{
int j=0;
int i=1;
LinkList q,p=L->next;
while (i<k)
{
++i;
p=p->next;
if (p==L) p=p->next;
}
printf("\nResult is ( ");
while (j<n)
{
i=1; //指针指向第m个结点
while (i<m)
{
++i;
p=p->next;
if (p==L) p=p->next;
}
printf("%d ",p->data); //输出被弹元素
q=p->next;
if (q==L) q=q->next;
p->data=q->data;
p->next=q->next;
free(q); //删除并释放结点
++j;
}
printf(")\n");
}
void main()
{
LinkList L;
int n0,k0,m0;
printf("\nPlease input Terms n = ");
scanf("%d",&n0);
if (n0<1)
{
printf("\n%d < 1\n",n0);
return;
}
CreateJosephus(L,n0);
PrintJosephus(L); printf("\nPlease input k, m = ");
scanf("%d, %d",&k0,&m0);
if (n0>0 && k0>0 && m0>0) Josephus(L,n0,k0,m0); DestroyJosephus(L);
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
当涂料场距大坝多少米时 可选用推土机施工
王杨卢骆,合称什么﹖
低通滤波,怎么滤波?
街机疯狂斗地主在打牌时开机关机有什么用
梦见和蟒蛇睡觉怎样解释
东莞史凯威科技园不满十八要不要
远水不解近渴什么意思
股票本金40万 有什么办法可以每月赚2%-3%
朋友过生日,守零点,发说说,说说内容要怎么
程序翻译有解释和什么两种方式
学钢琴的好处和坏处
最终幻想15乌龟打完给什么
梁的截面尺寸梁高以及板的厚按规范要求允许偏
Trek(崔克)平谷专卖店怎么去啊,我要去那办事
n后面加韵母的拼音有哪些
推荐资讯
win7的64位的电脑要不要装Microsoft Visual C
是用be concerned about 还是用concern about
DVI-I接口和DVI-D接口一样么
十字绣 猛虎气象图 有这样绣的吗?
对甲氧基苯胺结构式怎么写
对联铅华谢尽,不韵流年的下联怎么对?
那些隔过黑暗的花与水的全文是什么?
丹麦与秘鲁战局结果如何?
上海凯朴文化传播有限公司怎么样?
盼盼儿童摄影怎么去啊,有事要去办理
=SUM(B18:H18+F35)什么意思
电影圣经的一至十名
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?