求大神 分析C语言约瑟夫环问题(最好能在程序旁边写注释) 悬赏分多多送上!!!
发布网友
发布时间:2022-06-15 23:20
我来回答
共2个回答
热心网友
时间:2023-11-21 00:03
这是我自己写的程序,直接运行就是正确结果了,要是有哪里有不懂的地方,再问吧……
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *link;
}LNode,*LinkList;
int main()
{
LinkList p,r,list=NULL;
int i,n,num,start;
//此处n是指所有人数
//此处start是指从编号为start的人开始报数
//此处num是指数到num的人出列
scanf("%d%d%d",&n,&num,&start);
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=i;
if(list==NULL)
list=p;
else
r->link=p;
r=p;
}
p->link=list;
p=list;
//以上是构建了一个循环链表,链表不带头结点
for(i=1;i<start;i++)
{
r=p;
p=p->link;
}
//以上是得到了起始编号start的指针p,其前缀指针为r
while(p->link!=p)
{
for(i=1;i<num;i++)
{
r=p;
p=p->link;
}
//此时p是应当被删除的一位,r是p的前缀指针
r->link=p->link;
printf("%d ",p->data);
free(p);
p=r->link;
}
printf("\n最后被删除的结点是%d\n",p->data);
}
热心网友
时间:2023-11-21 00:03
参考一下这个约瑟夫环程序吧
#include<stdio.h>
#include<stdlib.h>
#define N 9
#define OVERFLOW 0
#define OK 1
int KeyW[N]={4,7,5,9,3,2,6,1,8};
typedef struct LNode{
int keyword;
struct LNode *next;
}LNode,*LinkList;
void Joseph(LinkList p,int m,int x)
{
LinkList q;
int i;
if(x==0)return;
q=p;
m%=x;/*获取头结点*/
if(m==0)m=x;/*取余*/
for(i=1;i<=m;i++)/*找到下一个结点*/
{
p=q;
q=p->next;
}
p->next=q->next;/*移动结点*/
i=q->keyword;/*获取编号*/
printf("%d ",q->keyword);
free(q);/*释放结点*/
Joseph(p,i,x-1);/*递归调用*/
}
int main()
{
int i,m;
LinkList Lhead,p,q;
Lhead=(LinkList)malloc(sizeof(LNode));/*申请结点空间*/
if(!Lhead)return OVERFLOW;
Lhead->keyword=KeyW[0];/*数据域赋值*/
Lhead->next=NULL;
p=Lhead;/*指向头结点*/
for(i=1;i<9;i++)
{
if(!(q=(LinkList)malloc(sizeof(LNode))))return OVERFLOW;
q->keyword=KeyW[i];/*数据域赋值*/
p->next=q;
p=q;/*移动到下一结点*/
}
p->next=Lhead;/*尾结点指向头结点,形成循环链表*/
printf("Please input the first recode m:\n");
scanf("%d",&m);/*输入起始位置*/
printf("The output alignment is:\n");
Joseph(p,m,N);/*调用函数*/
return OK;
}