循环链表实现约瑟夫环(C实现)~

来源:互联网 发布:水仙花数的算法流程图 编辑:程序博客网 时间:2024/05/02 22:38
#include<stdio.h>#include<stdlib.h>typedef struct JoNode* Node;struct JoNode{int num;Node Next;};//循环链表核心Node Josephus(int M, int N){Node P;int Times = N-1;P = (Node)malloc(sizeof(struct JoNode));if(P == NULL){printf("申请空间失败");return NULL ;}Node Head, P1, P2;int cnt = 0;int n = 0;while(N--){cnt++;if(cnt == 1){P2 = (Node)malloc(sizeof(struct JoNode));P2->num = ++n;Head = P1 = P2;}else{P2 = (Node)malloc(sizeof(struct JoNode));P2->num = ++n;P1->Next = P2;P1 = P2; }}P2->Next = Head;//循环链表 的 末尾指针 指向头部 Node Pre;Pre = P2;//最开始 链表头的前一位置为表尾 Node Tmp;int m = 1;//计数 看 每次循环开始时候 从 0 还是1 开始 可以是0代表自己 也可以是1代表自己 int people = 0;//出局人数 while(people < Times){if(M == m){printf("%d ",Head->num);Tmp = Head;Pre->Next = Head->Next;Head = Head->Next;free(Tmp);people++; m = 1;}else{m++;Head = Head->Next;Pre = Pre->Next;}}return Head;  //最后 剩下一个 自己指向自己 也就是幸存的那个 }//Node Findprevious(Node H, Node P)//{//Node Tmp = H;//while(Tmp->Next != NULL && Tmp->Next != P){//Tmp = Tmp->Next;//}//return Tmp;//} void PrintCircleList(Node P){Node Tmp;  //打印循环链表的方法   哈哈哈哈哈哈哈  printf("%d",P->num);Tmp = P->Next;while(Tmp != P){printf("%d",Tmp->num);Tmp = Tmp->Next;}}void ShowVal(Node P){printf("%d",P->num);}int main(){int M, N;Node Head, Pthis;printf("请输入总人数和每组循环报数次数:\n"); scanf("%d%d",&N,&M);printf("出局顺序为 : "); Pthis = Josephus(M, N);printf("\n");ShowVal(Pthis);printf(" is survival");return 0;}