约瑟夫环问题

来源:互联网 发布:js水平时间轴 编辑:程序博客网 时间:2024/06/17 02:04
/*面试例题:已知n个人(以编号1,2,3,...n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,          他的下一个人又从K开始报数,数到m的那个人出列;依此规律重复下去,知道圆桌周围的人全部出列。解析:约瑟夫环的问题----要通过输入n,m,k 3个正整数,求出列的序列,采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。核心步骤:     1.建立一个具有n个链节点,无头结点的循环链表     2.确定第一个报数人的位置     3.不断地从链表中删除链节点,直到链表为空。*/#if 0#include<stdio.h>#include<malloc.h>#define  ERROR  0typedef struct LNode{int data;struct LNode *link;  }LNode,*LinkList;void JOSEPHUS(int n,int k,int m)  // n--总人数 k--第一个开始报数的人 m--出列者喊到的数{LinkList p,r,list,curr;//p为当前节点,r为辅助节点,指向p的前驱节点 list为头节点//创建循环链表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->link = t;// 让表尾指向表头形成循环链表curr = t;}// 把当前指针移动到第一个报数的人r = curr;  //把指针移动到编号为k的那个人上面while(k--)   r = p;     p = p->link ;while(n--){for(int s = m-1;s--;r = p,p = p->link);r->link = p->link;// p指向的是删除的那个数printf("%d->",p->data);free(p);p = r->link;}}int main(){JOSEPHUS(13,4,7);}#endif
原创粉丝点击