本文共 1572 字,大约阅读时间需要 5 分钟。
#include#include 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; }
转载地址:http://yaimi.baihongyu.com/