约瑟夫环问题

来源:互联网 发布:怎样在淘宝上注册网店 编辑:程序博客网 时间:2024/06/05 20:16

约瑟夫环问题可以用循环链表解决,即链表的尾指针指向链表的头结点,形成循环链表,从第一个有数据域的结点开始报数,报到m的数的结点删除,最后剩下一个结点,这个结点就是约瑟夫环的问题的解。

#include <stdio.h>#include <stdlib.h> typedef struct num{int data;struct num *next;}list,*link;link create()   //创建链表 {link head,temp,pnew;int n;head = (link)malloc(sizeof(list));temp = head;scanf("%d",&n);while( n!=0 )  //输入0结束创建链表{pnew = (link)malloc(sizeof(list));pnew->data = n;pnew->next = NULL;temp->next = pnew;temp = pnew;scanf("%d",&n);}temp->next = head->next;return head;}void yuesefu(link head)  //约瑟夫环的实现函数 {link p,q,r;int i,m;p = head;printf("请输入循环数:");scanf("%d", &m);while(p->next != p)    //判断是否是最后一个结点 {for(i=0;i<m;i++)   //利用循环数m找到要输出的p结点 {q = p;    // 找到要输出p结点之前的结点q p = p->next; //找到要输出的p结点 } printf("%d ",p->data);   //输出p结点的数据域数 q->next = p->next; //q的next指针指向p的next域,即删除p结点 } }int main(){link head;head = create();yuesefu(head);}

最后输出的1就是约瑟夫环问题的解。

0 0