约瑟夫环的代码及算法思想
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
约瑟夫环
约瑟夫环问题是指n个人围成一个圆圈,然后按照某种方式进行报数,比如我所写的是按照1,2,3的顺序报数,所有报3的人退出圈子,剩下的人继续按照1,2,3的顺序报数,直到只剩下一个人,求这个人在最初的圈子中是第几号。
源代码:
#include
#include
#include
#define LEN sizeof(ysf)
typedef struct _ysf
{
int num;
struct _ysf *next;
}ysf;//定义结构体
ysf *addTile(ysf *head,int j)
{
ysf *p = (ysf *)malloc(LEN);
ysf *pt;
int i;
pt = head;
for(i = 1;i<=j;i++)
{
if(head == NULL)
{
p->num = i;
head = p;
pt = p;
head->next = NULL;
}
else
{
p->num = i;
pt->next = p;
pt = p;
p->next =NULL;
}
p = (ysf *)malloc(LEN);
}
pt->next = head;
free(p);
p = NULL;
return head;
}//使用尾插生成一个长度为n的链表,链表节点中的数据域依次为1-n;ysf *dele(ysf *head)
{
ysf *pt = NULL;
int count = 1;
while (head->next != head)
{
count++;//标识
pt = head;
head = head->next;
if(count == 3)//寻找到报数为3的节点
{
head = head->next;
free(pt->next);
pt->next = head;
count = 1;
}
}
head->next = NULL;
return head;
}//寻找到会报数为3的节点,将其删除
void showList(ysf *head)
{
ysf *p = head;
while (p != NULL)
{
printf("最终剩下的是:");
printf("%d\n",p->num);
p = p->next;
}
}//展示最终剩下的那个节点
int main()
{
ysf *head = NULL;
int i;
printf("请输入一共几个数字:");
scanf("%d",&i);
head = addTile(head,i);
head = dele(head);
showList(head);
return 0;
}//主函数