有N个小朋友围成一圈玩击鼓传花游戏,将小朋友编号为1~N,从1号开始传花,每次传3个,拿到花的小朋友表演节目后退出,任给N,问最后一个表演的小朋友编号是多少?
例如:5个小朋友,从1号开始传花,第一个表演的是3号,第二个表演的是1号,第三个表演的是5号,第四个表演的是2号,最后一个表演的是4号。
输入描述:
输入一个整数N,N不超过100。
输出描述:
输出最后一个表演的小朋友编号在单独的一行。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
}Node,*Lnode;
Node* init(); //初始化链表,创建头结点
void create(Node *L,int n); //尾插法往链表中加入n个小朋友
int Delete(Node *L,Node *p); //删除链表中结点,并返回删除结点的值
int main(){
Node *L=init();
int n=0,num=0;
scanf("%d",&n);
create(L,n);
Node *q=L;
while(L->next!=NULL){
Node *p=q;
for(int i=0;i<3;i++)
{ q=p;
p=p->next;
}
num=Delete(L,p);
}
printf("%d",num);
}
Node* init(){ //初始化链表,创建头结点
Node *L;
L=(Node *)malloc(sizeof(Node));
L->next=NULL;
return L;
}
void create(Node *L,int n){ //尾插法往链表中加入n个小朋友,并构造为循环单链表
Node *p=L;
for(int i=0;i<n;i++)
{
Node *q=(Node*)malloc(sizeof(Node));
q->data=i+1;
p->next=q;
q->next=L->next;
p=q;
}
}
int Delete(Node *L,Node *p){ //删除链表中结点,并返回删除结点的值
if(L->next==NULL)
return 0;
Node *q=L;
Node *tmp=L->next;
int num=p->data;
if(tmp->next==tmp) //检查是否只剩一个结点
{
L->next=NULL;
}
else if(q->next==p) //删除的是第一个结点
{
q->next=p->next;
while(tmp->next!=p){
tmp=tmp->next;
}
tmp->next=p->next;
}
else{ while(tmp->next!=p){
tmp=tmp->next;
}
tmp->next=p->next;
}
free(p);
return num;
}
运行结果: