Joseph环(顺序表、链队列)

1.顺序表

#include<stdio.h>
void Joseph(int str[][2],int m,int n);

int main()
{
    int m,n,i;                   //n表示环长,m表示是密码
    int str[100][2];               //二维数组用来存储元素值和标志变量
    printf("请输入环长和密码:");
    scanf("%d,%d",&n,&m);
    for(i=0;i<n;i++)
    {
        printf("请输入第%d个元素值:",i+1);
        scanf("%d",&str[i][0]);
        str[i][1]=1;             //设标志变量为1
    }
    printf("\n");
    Joseph(str,m,n);
    return 0;
}

void Joseph(int str[][2],int m,int n)
{
    int count=1,a=0,i;      //a表示出环元素的个数,count计数是否达到密码值
    for(i=0;i<n;)
    {
        if(str[i][1]==1)
        {
            if(count==m)
            {
                printf("%-3d",str[i][0]);     //输出被选中的元素
                count=1;      //重新计数
                str[i][1]=0;  //将已输出的元素的标志变量变为0
                a++;
            }
            else  count++;
        }
        i++;
        if(i==n&&a<n)  i=0;   //当输出的元素个数小于总个数时,继续循环
    }
}






2.链队列

#include <stdio.h>
#include<malloc.h>
typedef struct Node
{
    int data;
    struct Node *next;
}Node;
void Joseph(Node *front,Node *r,int m,int n);

int main()
{
    int m,n,i;
     Node *front=NULL,*s,*r;   //front为头结点,r为尾指针
  printf("请输入环长和密码:");
  scanf("%d,%d",&n,&m);
    front=(Node *)malloc(sizeof(Node));
    r=front;
    for(i=1;i<=n;i++)
    {
        s=(Node *)malloc(sizeof(Node));
  s->data=i;
        r->next=s;
        r=s;
    }
    r->next=NULL;
    Joseph(front,r,m,n);
    return 0;
}

void Joseph(Node *front,Node *r,int m,int n)
{
    Node *p=front->next,*q,*a;
    int count=1,i;
    for(i=0;i<n;)
    {
        if(count<m && p->next != NULL)         
        {
   a=p;
   p=p->next;
   front->next = p;
   a->next=NULL;
            r->next=a;
   r=a;
            count++;
        }
        else
        {
            printf("%-3d",p->data);
   q=p;
   p=p->next;
   front->next=p;
            free(q);
            i++;   
            count=1;
   
        }
    }
}


你可能感兴趣的:(Joseph环(顺序表、链队列))