c语言链表实现--约瑟夫环

之前我用数组实现过,具体的问题细节我就不细说了,有兴趣的朋友可以看一下,单链表的具体实现操作我也不讲了,之前博文有,这里只讲单链表的实现。

单链表链接:https://blog.****.net/Victor_psl/article/details/104125186

约瑟夫环链接:https://blog.****.net/Victor_psl/article/details/103160610

注意的事项:链表成环

改进的地方:

1.从第三个人开始游戏,这里也可以设置成自定义输入

2.自定义计数循环

3.打印最后一个位置

#include <stdio.h>
#include<malloc.h>
#include <stdlib.h>
typedef struct Node
{
    int data;
    struct Node* next;
}Node, *LinkList; //循环单链表
Node* IntCLinkList()
{
    int n, i;
    LinkList head, tail, temp;
    printf("输入n:");
    scanf("%d", &n);
    tail = head = NULL;
    for (i = 1; i <= n; i++)
    {
        temp = (Node*)malloc(sizeof(Node));//开辟新节点
        temp->data = i;//给节点的值域赋值成i的值
        if (head == NULL)//空链表
        {
            head = temp;
        }
        else
        {
            tail->next = temp;
        }
        tail = temp;  //尾指针指向新的节点; 
    }
    tail->next = head; //指向头,形成环
    return head;
}
int main()
{
    LinkList q = NULL;


    LinkList p = IntCLinkList();
    int m;//循环变量
    int i = 1;//起始位置
    int j = 3;//开始遍历的位置

    printf("请输入开始循环的m值为:");
    scanf("%d", &m);
    printf("出队列的位置为: ");
    while (p->next != p)
    {
        while (j > 1)//指针走到开始遍历位置
        {
            q = p;
            p = p->next;
            --j;
        }
        q = p;
        p = p->next;
        i++;
        if (i == m)
        {
            printf("  %d ", p->data);
            q->next = p->next;
            free(p);
            p = q->next;
            i = 1; //重新计数    
        }
    }
    printf("\n");
    printf("最后一个位置为:%d", p->data);
    free(p);
    return 0;
}
 

运行结果:我这里n=30, m=7 最后的位置为25

c语言链表实现--约瑟夫环