数据结构——约瑟夫环(循环链表)

版权声明:莉莉莉 https://blog.csdn.net/qq_41700151/article/details/83547837

n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
提示:用一个无头结点的循环单链表来实现n个元素的存储。

样例:
输入:
10 3 1 //分别为总数,出列的人数到的数字,开始数的人的编号。
输出:
3 6 9 2 7 1 8 5 10 4 //按照出列的先后顺序给出的出列的人的编号。

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef  int ElemType; /*定义表元素的类型*/
typedef struct LNode   /*线性表的单链表存储*/
{
    ElemType data;
    struct LNode *next;
} LNode,*LinkList;

LinkList Creat(int t)
{
    int n;
    LinkList p1,p2,head;
    p1=(LinkList)malloc(sizeof(LNode));
    p2=(LinkList)malloc(sizeof(LNode));
    head = NULL;
    n = 1;
    while(n<=t)
    {
        p1->data = n;
        if(n==1)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
        if(n!=t)
            p1 = (LinkList)malloc(sizeof(LNode));
        n++;
    }
    p2->next = head;
    return head;

}
LinkList Start(LinkList L,int k)
{
    int i;
    i=1;
    while(i!=k)
    {
        L=L->next;
        i++;
    }
    return L;

}
LinkList Delete(int n,int m,LinkList L)
{
    int i,j,k;
    LinkList p;
    p=L;
    k=0;
    while(n>1)
    {
        j=0;
        for(i=1+k; i<=n; i++)
        {
            if((i+1)%m==0)
            {
                printf("%d ",p->next->data);
                p->next=p->next->next;
                i++;
                j++;

            }
            p=p->next;
            k=i%m;
        }
        n=n-j;
    }
    printf("%d\n",p->data);
    return p;
}
int main()
{
    int m,n,k;
    scanf("%d%d%d",&n,&m,&k);
    LinkList L,cur;
    L=Creat(n);
    cur=Start(L,k);
    Delete(n,m,cur);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41700151/article/details/83547837