约瑟夫环的代码及算法思想

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}//主函数

相关文档
最新文档