用循环链表解决约瑟夫环问题 10
这个程序有几处没弄明白,可能是我第一次接触循环链表吧,还请帮忙解答下,谢谢!TypedefstructLNode{intdata;StructLNode*link;}LN...
这个程序有几处没弄明白,可能是我第一次接触循环链表吧,还请帮忙解答下,谢谢!
Typedef struct LNode{int data;
Struct LNode*link;}LNode,*LinkList;
void JOSEPJUS(int n,int k,int m)
{
LinkList p,r,list,curr;
p=(LinkList)malloc(sizeof(LNode));
P->data=0;
p->link=p;
curr=p;
for(int i=1;i<n;i++)
{LinkList t=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=curr->link;curr=t;}
r=curr;
while(k--) r=p,p=p->link;//这句话作用是?
while(n--)//这个循环里面表示什么,或者说究竟怎么实现约瑟夫环问题的呢?
{for(int s=m-1;s--;r=p,p=p->link);//没看懂。。。
r->link=p->link;
ptintf("%d->",p->data);
free(p);
p=r->link;}
} 展开
Typedef struct LNode{int data;
Struct LNode*link;}LNode,*LinkList;
void JOSEPJUS(int n,int k,int m)
{
LinkList p,r,list,curr;
p=(LinkList)malloc(sizeof(LNode));
P->data=0;
p->link=p;
curr=p;
for(int i=1;i<n;i++)
{LinkList t=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=curr->link;curr=t;}
r=curr;
while(k--) r=p,p=p->link;//这句话作用是?
while(n--)//这个循环里面表示什么,或者说究竟怎么实现约瑟夫环问题的呢?
{for(int s=m-1;s--;r=p,p=p->link);//没看懂。。。
r->link=p->link;
ptintf("%d->",p->data);
free(p);
p=r->link;}
} 展开
1个回答
展开全部
#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;
}
约瑟夫环,已加注释
#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;
}
约瑟夫环,已加注释
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询