链表--循环链表

不敢死队问题

Time Limit: 1000MS Memory limit: 65536K

题目描述

说到“敢死队”,大家不要以为我来介绍电影了,因为数据结构里真有这么道程序设计题目,原题如下:

有M个敢死队员要炸掉敌人的一个碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。以此类推,直到任务完成为止。

这题本来就叫“敢死队”。“谁都不想去”,就这一句我觉得这个问题也只能叫“不敢死队问题”。今天大家就要完成这道不敢死队问题。我们假设排长是1号,按照上面介绍,从一号开始数,数到5的那名战士去执行任务,那么排长是第几个去执行任务的?

输入

输入包括多试数据,每行一个整数M(0<=M<=10000)(敢死队人数),若M==0,输入结束,不做处理。

输出

输出一个整数n,代表排长是第n个去执行任务。

示例输入

962230

示例输出

26132

	#include<stdio.h>
	#include<stdlib.h>

	 struct node{
		int data;
		struct node *next;
	};

	 struct node *creat(int n)
	 {
		struct node *head, *tail, *p;
		head = (struct node *)malloc(sizeof(struct node));
		head->next = NULL;
		tail = head;
		for(int i=1; i<=n; i++)
		{
			p = (struct node *)malloc(sizeof(struct node));
			p->next = NULL;
			p->data = i;
			tail->next = p;
			tail = p;
		}
		tail->next = head->next;//使最后的的一个节点指向第一个实际结点,成环。
		free(head);
		return tail->next;	
	 }

	void sel(struct node *head, int m, int n)
	{
		int num =0; 
		int count = 0;//出去执行任务的人数
		struct node *p, *q;//前驱指针, 后继指针
		q = head;

		while(q->next != head)
			q = q->next;

		while(1)
		{
			p = q->next;
			num++;
			if(num%m == 0)
			{
				q->next = p->next;
				count++;
				if(p->data == 1)
				{
					printf("%d
", count);
					break;
				}
				free(p);
			}
			else
				q = p;
		}
	}

	 int main()
	 {
		int n, i, j;
		struct node *head;
		while(~scanf("%d", &n))
		{
			if(n == 0)
				break;
		head = creat(n);
		sel(head, 5, n);
		}
		return 0;
	 }


每天训练发现我比别人做的好慢,但是理解的更深刻,如果一开始学一个新知识点就搜模板,那么这样的人是走不远的,毕业之后带走的只有思维,什么荣誉,奖杯都已经不重要了。
原文地址:https://www.cnblogs.com/6bing/p/3931254.html