【C】循环淘汰 (用结构体完成; 头文件不要加malloc.h 或 alloc.h)

循环淘汰 (用结构体完成; 头文件不要加malloc.h 或 alloc.h)
有N 个同学,编号分别为1,2,3……,N,围成一圈,随便选定一个整数m,让大家按顺时
针依次报数,报到m 的同学便会从圈子中退出,从而被淘汰,直到最后剩下一个人。
编写函数实现上述循环淘汰功能。
编写一个程序测试上述函数的功能,要求用户能够任意输入N 与m;程序输入最后剩下人的编号。
结构体定义:
struct stu
{
    int num;
    struct stu *next;
};
输入提示信息:"请输入N的值: "
输入信息格式:"%d"
输入提示信息:"请输入m的值: "
输入信息格式:"%d"
输出信息数据格式:"最后剩下同学的编号是 %d 号\n\n"


运行样例1:
请输入N的值: 10↙
请输入m的值: 2↙
最后剩下同学的编号是 5 号
#include <stdio.h>
#include <stdlib.h>

#define LEN sizeof(struct stu)
struct stu
{		   	     
    int num;
    struct stu *next;
}		   	     ;
struct stu *create(int n);
int select(struct stu *head, int n, int m);
void main()
{		   	     
    struct stu *head;
    int m, n, last;
    printf("请输入N的值: ");
    scanf("%d", &n);
    printf("请输入m的值: ");
    scanf("%d", &m);
    head = create(n);
    last = select(head, n, m);
    printf("最后剩下同学的编号是 %d 号\n\n", last);
}		   	     
struct stu *create(int n)
{		   	     
    int i;
    struct stu *p1, *p2;
    struct stu *head = NULL;
    p2 = p1 = (struct stu*) malloc(LEN);
    for (i = 1; i <= n; i++)
    {		   	     
        if (i == 1)
            head = p1;
        else
            p2->next = p1;
        p1->num = i;
        p2 = p1;
        p1 = (struct stu*) malloc(LEN);
    }
    p2->next = head;
    return head;
}		   	     
int select(struct stu *head, int n, int m)
{		   	     
    int i, j;
    struct stu *p1 = head, *p2 = p1;
    if (n == 1 || m == 1)
        return n;
    for (i = 1; i < n; i++)
    {		   	     
        for (j = 2; j < m; j++)
            p1 = p1->next;
        p2 = p1;
        p1 = p1->next;
        p1 = p1->next;
        p2->next = p1;
    }
    return p1->num;
}		   	     

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值