kai


私信TA

用户名:dotcpp0593017

访问量:307

签 名:

等  级
排  名 3462
经  验 1526
参赛次数 0
文章发表 18
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

/*

13个人围成一圈,
从第1个人开始顺序报号1,2,3。
凡报到3者退出圈子。
找出最后留在圈子中的人原来的序号。
要求用链表实现

*/

#include<stdio.h>
#define NUM 13
//建立链表 
typedef struct people{
	int num;
	struct people *next;
}people;
int main()
{
	int count = NUM;
	people p[NUM];
	people *head;
	head = p;//自定义头节点 
	
	for(int i = 0;i<NUM;i++)//对链表进行赋值  
	{
		head->num = i+1;
		head->next = &p[i+1];
		head = head->next;	
	}
	
	p[NUM-1].next = p;//构成环形列表
	
	int i = 1;
	head = p;
	while(count>1)//count的值表示的是没被淘汰的个数 
	{
		//被淘汰的节点赋值为0,if的目的是跳过被淘汰的节点 
		if(head->num == 0)
		{
			head = head->next;
			continue;
		}
		if(i == 3)
		{
			//被淘汰的节点,num置为0
			printf("第 %d 位置被淘汰\n", head->num);
			head->num = 0;
			count--;
		}
		head = head->next;//让head后移继续判断 
		i++;//模拟循环报数 
		if (i > 3)//当i的值超过3之后开始重新对i循环 
		{
			i = 1;
		}
	 } 
	 printf("--------------\n");
	while (head->num == 0)//此时节点里只有一个不为零的数 
	{
        //非0节点即为最后留下的
		head = head->next;
		if (head->num != 0)
		{
			printf("留到最后的是 %d \n", head->num);
		}
	}
	return 0;
}


 

0.0分

0 人评分

  评论区