用循环链表解决报数淘汰问题

来源:互联网 发布:Windows命令删除文件夹 编辑:程序博客网 时间:2024/06/06 01:21

问题:

100人围成一个圈,每人有一个编码,编码从1到100。他们开始从1开始依次报数,报到M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人小于M。输出剩下的人原先的号码,M=3时为:58,91,M=4时为34,45,97.

分析:建立一个循环链表,删除报到数的人。其中删除子函数是将报数前一个人的指针作为形参。

程序:

#include<iostream>using namespace std;typedef struct node*  prtonext;typedef prtonext position;typedef prtonext list;struct node {int element;prtonext next;};void erase(position p){position tmp;tmp = p->next;p->next = p->next->next;free(tmp);}void list_way(){list head = NULL;;list p1, p2;int m;m = 4;head = (struct node*)malloc(sizeof(struct node));head->element = 1;head->next = NULL;p2 = head;for (int i = 0; i < 99; i++){p1 = (struct node*)malloc(sizeof(struct node));p1->element = i + 2;p2->next = p1;p2 = p2->next;}p2->next = head;p1 = head;int j = m;while (j - 2){p1 = p1->next;j--;}erase(p1);for (int i = 0; i < 100 - m; i++){j = m;while (j - 1){p1 = p1->next;j--;}erase(p1);}for (int i = 0; i < m - 1; i++){cout << p1->element;p1 = p1->next;}}int main(){list_way();while (1);}


原创粉丝点击