循环链表 ——解决约瑟夫环

来源:互联网 发布:linux切换图形界面命令 编辑:程序博客网 时间:2024/06/05 12:41

已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

#include <iostream>using namespace std;struct Node {    int data;    Node* next;};Node* create(int n) { // 1 2 3 ……n    Node* cur, *q, *head;     cur = (Node*)malloc(sizeof(Node));    head = cur;    cur->data = 1;    for (int i = 2; i <= n; i++) {        q = (Node*)malloc(sizeof(Node));        q->data = i;        cur->next = q;        cur = q;    }    cur->next = head;    return head;}void printLink(Node* head) {    if (head == NULL) {        cout << "空链表" << endl;        return;    }    Node* p = head;    while (head != NULL) {        cout << p->data << endl;        p = p->next;    }}void processLink(Node* head, int k, int m) { //从编号为k(1<=k<=n)的人开始报数,数到m的那个人出列;    Node* cur = head;    Node* tmp = cur;    //找到编号为k的节点    while (cur->data != k) {        cur = cur->next;      }    while (cur->next != cur) {        //找到第m个数        for (int i = 0; i < m; i++) {            tmp = cur;            cur = cur->next;        }        cout << cur->data;        tmp->next = cur->next;        free(cur);        cur = tmp->next;            }    cout << cur->data;    free(cur);}//12345  41325int main() {    Node *node = create(5);    processLink(node, 3, 1);}
0 0
原创粉丝点击