约瑟夫环的三种实现方式

来源:互联网 发布:知乎客户端 编辑:程序博客网 时间:2024/05/14 15:34

链表实现

#include <stdio.h>#include <stdlib.h>typedef struct Node{int data;struct Node *next;}Node;Node *CreatList(int n)    //创建一个含n个人的循环链表{int i;Node *head,*p,*q;head=(Node*)malloc(sizeof(Node));    head->data=1;p=head;for(i=2;i<=n;i++)    //利用尾插法构建长度为n的链表{q=(Node*)malloc(sizeof(Node));p->next=q;q->data=i;p=p->next;}p->next=head;       //构建循环链表return(head);}void Joseph(Node *head,int n,int m)  //n:总人数     m:出列的数字{int i,j;Node *p,*q;    p=head;for (j=1;j<=n;j++)                                                                                                                      {        for(i=1;i<m;i++)p=p->next;        //找到应出列的人printf("% d",p->data);p->data=p->next->data;q=p->next;p->next=p->next->next;free(q);   //释放指针q所指变量的存储空间}}int main(){int n,m;Node *head;printf("请输入总人数n:   ");scanf("%d",&n);printf("\n请输入出列者报的数m:  ");scanf("%d",&m);printf("\n");head=CreatList(n);    //调用创建列表函数Joseph(head,n,m);   //调用约瑟夫环函数printf("\n");printf("\n");}


顺序存储实现

#include<stdio.h>#include<stdlib.h>#define Maxsize 100typedef struct{    int data[Maxsize];    int length;}SqList;void GreateList(SqList *&L,int n){int i;L=(SqList *)malloc(sizeof(SqList));for(i=0;i<n;i++)L->data[i]=i+1;L->length=n;}void DisplayList(SqList *L,int m){int  i, j;int k=0;for (i=L->length; i>0; i--){k=(k+m-1)%i;printf("%d ",L->data[k]);for (j=k;j<i-1; j++)L->data[j]=L->data[j+1];L->length=L->length-1;}printf("\n");}void DestroyList(SqList *&L){free(L);}int  main() {   int n,m; SqList *L;//此处为定义一个结点指针 printf("请输入人数n和初始值m:\n"); scanf("%d%d",&n,&m); GreateList(L,n); DisplayList(L,m);//此处不需要引用符号 DestroyList(L); return 0;}


静态链表实现

#include "stdio.h"    #include "stdlib.h"#define MAXSIZE 100                                    struct node{int number;int next;}string[MAXSIZE];int josephus(void){int total;int out;int start;int i,j;int flag=0;int current,front;printf("请输入人数(正整数):");scanf("%d",&total);printf("请输入报数(正整数):");scanf("%d",&out);printf("从第几个人开始报数:\n");scanf("%d",&start);    if(out==1)return total;for(i=0;i<total;i++)//初始化 { string[i].number=i+1;string[i].next=i+1;}string[i-1].next=0;front=total-1;current=0;for(i=1;i<start;i++){front=string[front].next;current=string[current].next;}while(flag<total){if(j%out==0){string[front].next=string[current].next;current=string[front].next;j=1;flag++;}else{j++;front=string[front].next;current=string[current].next;}}return(string[current].number);}main(){int t;t=josephus();printf("留下第%d个人\n", t);return 0; }


0 0
原创粉丝点击