c语言的一个题,约瑟夫环,循环链表

img


c语言的一个题,约瑟夫环,用循环链表解释一下,谢谢,这些内容一直学不会,看不懂

循环链表方式实现,运行结果:

img

完整代码如下:

#include<stdio.h>
#include <stdlib.h>
#define MAXN 100

typedef struct _data 
{
    int flag; //标记
    char name[30]; //姓名 
    int index;  //序号

    struct _data *next;
}Stdata;


void CountOff(int n,int w,int s,Stdata* out);

int main()
{
    int i,n,w,s;
    Stdata* head=0,*p,*t;
    scanf("%d",&n);  //读取N
    getchar();//吸收回车符
    for(i=0;i<n;i++)
    {
        p = (Stdata*)malloc(sizeof(Stdata)); 
        //读取N个名字,并存如链表
        scanf("%s",p->name);
        p->flag = 0;
        p->index = i+1;
        p->next = 0;
        if(head==0)
        {
            head = p;
            t=head;
        }else
        {
            t->next = p;
            t = p;
        }
    }
    t->next = head; //最后一个节点指向头节点
    scanf("%d %d",&w,&s); //读入w和s

    CountOff(n,w,s,head);

    //释放空间
    while(head)
    {
        p = head->next;
        free(head);
        head = p;
    }
    head = 0;
    return 0;
}

void CountOff(int n,int w,int s,Stdata* head)
{
    int i=1,t=n,k=0;//t表示剩余人数
    Stdata* out=head;

    //找到第w个位置
    while(i<w)
    {
        out = out->next;
        i++;
    }


    //开始出队
    while(t!=1)
    {
        if(out->flag==0)
        {
            k++;
            if(k%s==0)
            {
                k = 0;
                out->flag=1;
                printf("%d %s\n",out->index,out->name);
                t--;
            }
        }
        out = out->next;
    }
}

循环 链表
这里你首先要知道,链表是啥,而所说的循环又是啥,为什么这样用。
链表,其实就是一个个的节点,然后可以按顺序的依次从第一个节点访问到后面所有的节点,(有序的)
而为什么叫循环链表,其实就是把链表的头和尾连接在一起,只是适应了这里的围成一个圈的场景而已。

至于题目逻辑,无非就是从这个链表中依次按顺序往后取数,直到到达目标,对链表进行删除操作,再到最后的终止条件。

这个题目的重点是你要熟练理解链表是啥,掌握他的增删改查。
先去理解链表,试着练习一下,再回头看这个问题,还有不会,再问

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632