约瑟夫环问题(Josephus)的C解法

#include “stdio.h” #include “malloc.h” /*编写一算法来解决与瑟夫环问题。 * 设有n个人围坐在圆桌周围,从第S个人开始报数,数到第M个人出列, * 然后从出列的下一个人重新开始报数,数到第M个人出列…… * 如此重复直到所有的人全部出列为止。 * 例如当N=8,m=4,s=1,得到的新序列为4,8,5,2,1,3,7,6*/ #define M 4 #define N 8 #define S 1 typedef int elemtype; typedef struct node //单链表结点 { elemtype data; struct node *next; }lnode, *linklist; lnode *create()//创建循环链表 储存所有人的编号 { lnode *h, *p, *rear; int i; h = (lnode *) malloc( sizeof(lnode) );//创建头结点 h->data=1; h->next=NULL; rear=h; for(i=2; i<N+1; i++) // 尾插法,共创建了N个节点 { p=(lnode *)malloc(sizeof(lnode)); p->data=i;; p->next =NULL; rear->next =p; rear=p; } rear->next=h; return h; } void dis(lnode *h)// 显示循环链表的数据域(不删结点) { int i; printf(“循环链表的数据域为:/n”); for(i=1; i<N+1; i++) { printf(“%d/n”,h->data); h=h->next; } printf(“*************************/n”);//第3个循环执行不到 } void dis_order(lnode *h) //出圈算法,删除出圈结点 { int i; lnode *p, *t; printf(“出圈:/n”); while(1) { p = h; for(i=1; i<3; i++) //指针后移两个 { p=p->next ; } t=p->next; //第四个结点准备出环 printf(“%d/n”, t->data); if(p!=t) //至少两个结点 { h=t->next; p->next=h; free(t); } else { free(t); break; } } } void main() { lnode *head; head=create(); dis(head); dis_order(head); //free操作在出圈中完成 }

亮点:

尾插法创建循环链表

 

不足:

1.未保证M,N,S值可自由设定,特别是S

2.未实现相应的C++面向对象程序

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/luxer_1985/article/details/5967956
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞