给你一个程序:
#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)问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)