约瑟夫环问题

来源:互联网 发布:三毛淘宝小号交易平台 编辑:程序博客网 时间:2024/05/22 09:46
/*约瑟夫环问题: 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。*/#include<stdio.h>#include<stdlib.h>//链表节点typedef struct _RingNode{int pos;//位置struct _RingNode *next;}RingNode,*RingNodePtr;//创建约瑟夫环,pHead:链表头节点,count:链表元素个数void CreateRing(RingNodePtr pHead, int count){RingNodePtr pCurr=NULL,pPrev =NULL;int i=1;pPrev=pHead;while(--count > 0){ pCurr=(RingNodePtr)malloc(sizeof(RingNode));i++; pCurr->pos=i;pPrev->next=pCurr;pPrev=pCurr;}   pCurr->next=pHead;//构成环状链表}void PrintRing(RingNodePtr pHead){RingNodePtr pCurr;printf("%d ",pHead->pos);pCurr=pHead->next;while(pCurr !=NULL){     if(pCurr->pos==1)     {break;     }printf("\n%d",pCurr->pos);pCurr=pCurr->next;}}void KickFromRing(RingNodePtr pHead,int m){RingNodePtr pCurr,pPrev;int i=1; //计数pCurr=pPrev=pHead;while(pCurr !=NULL){if(i==m){   //踢出环    printf("\n%d",pCurr->pos); //显示出圈循环顺序    pPrev->next=pCurr->next;    free(pCurr);    pCurr=pPrev->next;    i=1;}    pPrev=pCurr;    pCurr=pCurr->next;    if(pPrev ==pCurr)    {   //最后一个printf("\n%d",pCurr->pos);//显出出圈顺序free(pCurr); break;            }  i++;}}int main(void){   int m=0,n=0;   RingNodePtr pHead = NULL;     printf("---------------Josephus Ring---------------\n");      printf("N(person count) = ");     scanf("%d", &n);     printf("M(out number) = ");     scanf("%d", &m);     if(n <= 0 || m <= 0)     {         printf("Input Error\n");         system("pause");         return 0;     }    //建立链表      pHead = (RingNodePtr)malloc(sizeof(RingNode));      pHead->pos = 1;      pHead->next = NULL;      CreateRing(pHead, n);      #ifdef _DEBUG      PrintRing(pHead);      #endif      // 开始出圈     printf("\nKick Order: ");     KickFromRing(pHead, m);         printf("\n");     system("pause");     return 0;}

(以上是网上看的,下面是自己学习时的)

#include<stdio.h>#include<stdlib.h>#define N 10#define TRUE 1#define FALSE 0typedef int data_t;typedef struct node{data_t data;struct node *next;}linknode ,*linklist;void joseph(int n,int k,int m){linklist p,q;q=NULL;int i=1;q=p=(linklist)malloc(sizeof(linknode));q->data=i;for(i=2;i<=n;i++){p->next=(linklist)malloc(sizeof(linknode));p=p->next;p->data=i;}p->next=q;//将链表连成一个环p=q;//让p指针回到第一个元素位置/*将指针q移到要开始的成员的前一个位置处*/for(i=1;i<k-1;i++){q=q->next;}/*开始kill成员循环*/while(q->next !=q)//判断是不是环链表是不是只剩下一个元素的时候{for(i=1;i<m;i++)//开始按照间隔M个元素kill成员{q=q->next;}/*删除要找到的元素并打印出来*/p=q->next;q->next=p->next;printf("%d ",p->data);free(p);}printf("%d ",q->data);//打印最后一个元素printf("\n");return ;}int main(void){int a=N;//成员int k=2;//从第K个成员开始算起int m=3;//间隔m个成员开始kill成员joseph(a,k,m);return 0;}









0 0
原创粉丝点击