c语言数据结构约瑟夫环程序看不懂啊求解!

c语言数据结构约瑟夫环程序看不懂啊求解!,第1张

给你一个程序:

#include<stdioh>

#include<stdlibh>

typedef struct data{ //定义一个结构体“data”

int num; //用于存放人的序号

int val; //用于存放密码

}typedata;

typedef struct node{ //定义一个结构体(结点),其中包含一个数据域和一个指针域

typedata data; //结构体的嵌套

struct node next;

}listnode;

typedef listnode linklist;

linklist head;

void main()// 进入主函数

{

int n,i,b,m,j;

linklist head=(listnode )malloc(sizeof(listnode)); //申请一个空间(头结点 head)

listnode p,q; //定义两个可以指向结点的指针

printf("输入总人数:");

scanf("%d",&n);

q=head; //用指针q指向头结点

for(j=1;j<=n;j++) //本次循环主要是将每一个人的数据(包括序号、密码)存入循环链表中

{

printf("请输入第%d号同学的密码:\n",j);

scanf("%d",&b);

printf("\n");

q->next=(listnode )malloc(sizeof(listnode));

//将头结点的next域指向刚生成的一个结点

q=q->next;

q->dataval=b; //输入密码

q->datanum=j; //输入序号

q->next=head->next; }

//将尾结点的next域指向第一个结点,构成循环链表

printf("请任意输入一个数m:");

scanf("%d",&m);

if(m<=0) printf("输入错误");

do{

i=1;

while(i!=m){ //将q指针指向所要输出的结点的前一结点

q=q->next;

i++;

}

p=q->next; //p指向输出结点

q->next=p->next; //将输出结点的前结点的next域指向输出结点的后结点

printf("num:%d\tval:%d\n",p->datanum,p->dataval); //输出

m=p->dataval; //取得输出结点的密码

free(p);

}while(q->next!=q); //只剩最后一个结点时结束

printf("num:%d\tval:%d\n",q->datanum,q->dataval); //输出最后一个结点

free(q); //释放最后一个结点

free(head); //释放头结点

printf("约瑟夫环结束,欢迎下次光临~·~\n");

}

//程序结束。

#include<stdioh> #include<stdlibh> void main() { int a[100]; /用来放环里的每个人的,人口上限(好像在打魔兽争霸)100,当然可以再改大/ int n,r,ctor,u; /n是用来循环赋值的,给r个人循环赋1~u,一共r个人,ctor计数器,到了u再重新归1/ int call(int a[],int real,int u); /报数函数/ for(n=0;n<=99;n++)a[n]=0; /给所有元素赋值为0,这样以后没赋值1~u的就都为0,可以当作不存在/ printf("/约瑟夫环 JOSEPHUS/\n\n"); printf("输入参与报数的人数\n"); scanf("%d",&r); printf("输入报数上限\n"); scanf("%d",&u); ctor=1; for(n=0;n<r;n++) /这个循环里给输入的人数都赋值,从1到u,相当于报的数/ { (a+n)=ctor; ctor++; if(ctor>u)ctor=1; } call(a,r,u);system("pause"); /调用点名函数/ } int call(int a[],int real,int u) { int n1,i; int p; p=(a+u-1); n1=0;i=u; for(;n1<real-1;p++) { if(p>(a+real-1))p=a; /如果点名点过了,就接着队伍没有出列的第一个人继续/ if((p)!=0) /如果扫描的数字不为零,说明这个人还在队列中,那么看下面/ { if(i>u)i=1; /由于是剩下的人继续报数,所以当报到u这个上限时,还是要从新归1/ if(i==u) /当到达上限,说明这个人该出列啦,它的位置就填充为0/ { (p)=0;n1++; /n1计算着一共多少人出列,通过n1<real-1,可以留下最后一个人,这是最终目的/ } i++; } } for(i=0;i<real;i++) /从新扫描数组,发现不是0的就输出,到这时候肯定只剩一个数不是0了/ if((a+i)!=0)printf("所剩最后一位原来的呼号是%d\n\n",i+1); } 《天下代码一大抄……》

#include <stdioh>

#include <stdlibh>

/n表示最初有多少个人,m表示报数到多少的人离开,函数Joseph返回最后剩下的人的编号/

int Joseph(int n, int m)

{

int count = n; /count表示当前圈内剩下的人数/

int num=0; /num表示当前报的数/

int i,j; /i表示当前报数的人对应的下标/

int a, remain;

/动态申请连续的n个存储单元用来存放每个人的编号,将空间首地址赋值给a/

a = (int )malloc(sizeof(int));

for(i=0; i<n; i++) a[i] = i+1; /a[i]保存第i个人的编号/

i = 0; /从下标为0的人开始报数/

while(count>1) /如果剩余人数大于1则循环/

{

num++;

if(num == m) /报数到m的人离开/

{

/将下标为i的元素删除/

for(j=i+1; j<count; j++) a[j-1] = a[j];

count--; /当前剩余人数减1/

num = 1; /下一个人重新从1开始报数/

}

i = m%count; /计算下一个要报数的人的下标/

}

remain = a[0]; /最后只剩下一个人,将其编号赋值给remain/

return remain;

}

以上就是关于c语言数据结构约瑟夫环程序看不懂啊求解!全部的内容,包括:c语言数据结构约瑟夫环程序看不懂啊求解!、C语言编程 约瑟夫环问题、c语言约瑟夫(Joseph)问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9794091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存