Hrbust 1548 基础数据结构——循环链表

题目描述

n个人想玩残酷的死亡游戏,游戏规则如下:

n 个人进行编号,分别从 1 到 n,排成一个圈,顺时针从 1 开始数到 m,数到 m 的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

请输出最后一个人的编号。


输入 n 和 m 值。m>1。

输出胜利者的编号。


样例输入

5 3

样例输出

4

提示

第一轮:3 被杀第二轮:1 被杀第三轮:5 被杀第四轮:2 被杀


#include<stdio.h>
#include<stdlib.h>
struct node
{
  int data;
  struct node *next;
};
//删除操作
void Del(struct node *head, int m)
{
  struct node *p, *q;
  int i = 1; //计数。
  p = q = head;
  while(p != NULL)
  {
    if(i == m)
    {
      //删除链表中元素。
      q->next = p->next;
      free(p);
      p = q->next;
      i = 1;
    }
    q = p;
    p = p->next;
    if(q == p)
    {
      //最后一个元素,按照题意应该输出。
      printf("%d\n", p->data);
      break;
    }
    i++;
  }
}
int main()
{
  int n, m;
  while(scanf("%d %d", &n, &m) != EOF)
  { 
    struct node *head = NULL;
    struct node *p, *q;
    //创建循环链表。head 为表头指针。
    p = (struct node *)malloc(sizeof(struct node));
    p->data = 1;
    head = p;
    for(int i = 2; i <= n; i++)
    {
      q = (struct node *)malloc(sizeof(struct node));
      q->data = i;
      p->next = q;
      p = q;
    }
    p->next = head;
    //创建完毕。
    Del(head, m);
  }
  return 0;
}

 

おすすめ

転載: blog.csdn.net/qq_24016309/article/details/88699000