头疼的算法与数据结构——约瑟夫环

    xiaoxiao2021-03-25  60

    一:约瑟夫环简介

    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39  个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

    二:约瑟夫环的实现

    前见天写了循环链表,用循环链表要实现这个问题。 #include <stdio.h> struct node{ int data; struct node *next; }; typedef struct node Node; #define SIZE sizeof(Node) int num=1;//计算循环链表的节点个数 头节点已经创建好了 有一个节点了 //创建节点 Node* creteNode(int d) { Node* pn=malloc(SIZE); pn->data=d; pn->next=NULL; return pn; } //创建链表 void creatList(Node** h) { Node* pn=NULL; Node* p=NULL; int d; printf("请输入数据\n"); scanf("%d",&d); pn=creteNode(d); *h=pn; p=*h; while(1) { printf("请输入数据\n"); scanf("%d",&d); if(d==0) { p->next=*h; break; } pn=creteNode(d); ++num; p->next=pn; p=p->next; } } int main() { int i,m=3; Node* head=NULL; creatList(&head); Node* p=head; Node* temp=NULL; m%=num; while(p!=p->next) { for(i=1;i<m-1;i++) { p=p->next; } printf("%d->",p->next->data); temp=p->next;//删除死亡的人 p->next=temp->next; free(temp); p=p->next; } printf("%d\n",p->data); return 0; } 请输入数据 8 请输入数据 9 请输入数据 7 请输入数据 65 请输入数据 4 请输入数据 1 请输入数据 2 请输入数据 3 请输入数据 0 7->1->8->4->9->3->65->2
    转载请注明原文地址: https://ju.6miu.com/read-40679.html

    最新回复(0)