059.约瑟夫环
【摘要】
#include <stdio.h>#include <malloc.h>#define N 7 //定义N=7,表示有7个链表单元#define OVERFLOW 0#define OK 1typedef struct L...
#include <stdio.h>
#include <malloc.h>
#define N 7 //定义N=7,表示有7个链表单元
#define OVERFLOW 0
#define OK 1
typedef struct LNode{ //定义链表结构
int password;
int order;
struct LNode *next;
}LNode,*LinkList;
int PassW[N]={3,1,7,2,4,8,4};
void Joseph(LinkList p,int m,int x); //声明函数
int main()
{
int i,m;
LinkList Lhead,p,q; //定义三个指向链表结构的指针
Lhead=(LinkList)malloc(sizeof(LNode)); //初始化头节点
if(!Lhead)return OVERFLOW; //分配空间失败返回
Lhead->password=PassW[0];
Lhead->order=1;
Lhead->next=NULL;
p=Lhead;
for(i=1;i<7;i++){
if(!(q=(LinkList)malloc(sizeof(LNode))))return OVERFLOW;
q->password=PassW[i]; //初始化循环列表中的密码值
q->order=i+1;
p->next=q;p=q; //新创建一个指针节点并使p->next指向它,再使p=q
}
p->next=Lhead; //使p->next指向头节点,从而形成循环链表
printf("请输入第一次计数值m: \n");
scanf("%d",&m); //用户输入第一次计数值m
printf("第一次计数值m= %d \n",m);
Joseph(p,m,N);
return OK;
}
void Joseph(LinkList p,int m,int x){
LinkList q;
int i;
if(x==0)return; //链表中没有节点的话,立即返回上一层函数
q=p;
m%=x; //m对x求余,从而求出链表中的第几个单元是所求节点
if(m==0)m=x; //若m刚好可以整除x,则令m=x,因为如果m=0,则不进行下一个
//for循环,那样就无法使q指向要删除节点,p指向他的的前一节点,那样则无法进行删除操作
for(i=1;i<=m;i++){
p=q;
q=p->next; //使q指向要删除的节点,p指向q的前一个节点
}
p->next=q->next; //从循环链表中删除q指向的节点
i=q->password;
printf("%d ",q->order);
free(q); //释放q指向的空间
Joseph(p,i,x-1);
}
文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_41055260/article/details/124495225
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)