链表I 约瑟夫问题(删除+计数!典题)

来源:互联网 发布:nginx 二级域名转发 编辑:程序博客网 时间:2024/06/18 17:05

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

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
//m的倍数!!
请输出最后一个人的编号。
Input
输入n和m值。
Output
输出胜利者的编号。
Example Input
5 3
Example Output
4

#include <stdio.h>#include <stdlib.h>struct node{    int data;    struct node *next;};struct node *creat(int n)         //建立数据域从1递增的顺序循环链表{    struct node *p,*head,*tail;    int i;    p = (struct node *)malloc(sizeof(struct node));    p->data = 1;    p->next = NULL;    head = p;    tail = p;    for(i=2; i<=n; i++)    {        p = (struct node *)malloc(sizeof(struct node));        p->data = i;        p->next = NULL;        tail->next = p;        tail = p;    }    tail->next = head;    //循环链表!!    return(head);};int del(struct node *head,int m,int n){    struct node *p,*q;    int num=0,count=0;   //num表示报数的计数变量。Count表示删去的数量。    q = head;while(q->next!=head)   //可以用更好的办法!!!Num=1;q=head;即可    {                          //q为前驱结点        q = q->next;    }    while(count<n-1)    {        p = q->next;        num++;        if(num%m==0)        {            q->next = p->next;            free(p);            count++;        }        else        {            q = p;        }    }    return (q->data);}int main(){      int n,m;      struct node *head;      scanf("%d %d",&n,&m);      head = creat(n);      printf("%d\n",del(head,m,n));    return 0;}
原创粉丝点击