输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出(约瑟夫环问题)

#include <stdio.h>
#include <malloc.h>

/*利用链表实现*/
typedef struct link{
    int data;
    struct link *next;
}link_s, *link_p;

/*创建循环链表*/
void link_create(link_p &head, int num)
{
    if (num < 1)
    {
        head = NULL;
        return;
    }

    head = (link_p)malloc(sizeof(link_s));
    head->data = 1;
    head->next = NULL;

    link_p new_node = head;
    for (int i = 2; i < num+1; i++)  
    {  
        new_node->next = (link_p)malloc(sizeof(link_s));
        new_node = new_node->next;
        new_node->data = i;
        new_node->next = NULL;
    }
    new_node->next = head;  /*把最后一个节点指向头结点,构成循环链表*/

    return;
}

/*打印链表,验证是否为循环链表*/
void link_print(link_p head)
{
    int i = 0;
    link_p p_node = head;
    while (p_node && i < 100)
    {
        printf("%d->", p_node->data);
        p_node = p_node->next;
        i++;
    }

    return;
}

/*实现功能从1至N开始顺序循环数数,每数到M输出该数值*/
void fun_realize(link_p head, int num)
{
    int i = 1, remove_num = 1;
    link_p p_node = head;
    link_p p_temp = NULL;

    while (p_node)
    {
        if (num - 1 == i)
        {
            if (p_node == p_node->next) /*剩下最后一个节点时,直接打印*/
            {
                printf("num.%d remove %d\n", remove_num, p_node->data);
                free(p_node);
                p_node = NULL;
                break;
            }
            i = 1;
            printf("num.%d remove %d\n", remove_num, p_node->next->data); /*找到第M-1个节点,打印第M个节点*/
            p_temp = p_node->next->next;    /*保存第M+1个节点地址*/
            free(p_node->next);             /*释放第M个节点地址*/
            p_node->next = p_temp;          /*第M-1个节点指向第M+1个节点*/
            p_node= p_node->next;           /*p_node指向第M+1个节点*/
            remove_num++;
        }
        else
        {
            i++;
            p_node = p_node->next;
        }
    }

    return ;
}

int main(void)
{
    int n = 0, m = 0;
    printf("input n and m: ");
    scanf("%d %d", &n, &m);/*用户输入*/
    getchar();

    link_p lk = NULL;
    link_create(lk, n);
    fun_realize(lk, m);

    getchar();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wizardtoh/article/details/44622623