约瑟夫环扩展问题

来源:互联网 发布:忘记mac的开机密码 编辑:程序博客网 时间:2024/05/22 07:43

       编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码,(正整数,可以自由输入),开始入选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报到M时停止报数。报M的人出列,将他的密码作为新的M值,从他的顺时针方向上的下一个人开始从1报数,如此下去,直到所有人出列为止。

具体代码如下:

#include <iostream>using namespace std;typedef struct CListNode{int value;CListNode *next;}CListNode, *CListLink;void Show_(CListLink *lt){if (*lt == NULL){return;}CListNode *p = *lt;while (p->next != *lt){cout << p->value << "-->";p = p->next;}cout << p->value << "-->" << "Node" << endl;}CListNode *Create_N(int n){//无头结点的循环链表CListNode *p = NULL, *head;head = (CListNode*)malloc(sizeof(CListNode));p = head; //指向当前结点int i = 1;srand(time_t(0));CListNode *s = NULL;if (0 != n){while (i <= n){s = (CListNode*)malloc(sizeof(CListNode));s->value = rand()%10 + 1;p->next = s;p = s;i++;}s->next = head->next;}free(head);return s->next;//第一个节点}void ChuLie(int n){CListNode *temp;CListNode *p = Create_N(n);CListNode *q = NULL;Show_(&p);int m = p->value;m %= n;while (p != p->next){if (m <= 1){cout << q->next->value << "-->";temp = q->next;q->next = temp->next;p = temp->next;q = p;}else{for (int i = 1; i < m - 1; ++i){p = p->next;}cout << p->next->value << "-->";temp = p->next;      //删除的元素p->next = temp->next;q = p;p = p->next;}m = temp->value;m %= n;free(temp);          //删除}cout << p->value << endl;}int main(){int n;cin >> n;ChuLie(n);return 0;}

在对m进行比较值进行分类比较,针对m==0||m==1是一种处理方法,其余是一种处理方法。

显示输出如下:


0 0
原创粉丝点击