n人围圈报数问题(指针解决)

//n人围圈报数问题
#include<stdio.h>
#include<stdlib.h>
struct LinkList{
	int data;//用来存编号 
	struct LinkList*next;
};
int main(){
	int n;
	scanf("%d",&n);
	if(n==1){//如果只有一个人则不用报数直接出队 
		printf("最后出队的人初始序号为1\n");
		return 0;
	}
	LinkList *p;
	p=(LinkList*)malloc(sizeof(LinkList));//用malloc申请空间,申请大小为LinkList类型的空间,将申请空间的地址赋给LinkList*类型的指针变量p 
	p->data=1;//存放初始编号,首元节点特殊处理一下 
	p->next=p;
	LinkList *t=p;
	//尾插法按顺序存入初始编号 
	for(int i=2;i<=n;i++){
		LinkList *q;//局部变量q 
		q=(LinkList*)malloc(sizeof(LinkList));//每次循环为指针变量q开辟一个新的空间,去存不同的数据 
		q->next=t->next;
		q->data=i;
		t->next=q;
		t=q;
	}
	LinkList *baoshu(LinkList *s);//函数声明 
	LinkList *p2=p;//将首元节点的地址赋给指针变量p2 
	for(int j=1;j<n;j++){//循环n-1次,出队n-1个人 
		 p2=baoshu(p);//用p2来接收下一个报数的人的地址 
		p=p2;
	}
	printf("%d",p2->data);
	return 0;
}
LinkList *baoshu(LinkList *s){//baoshu函数返回的是LinkList*类型的指针变量(也即返回指针变量内部所存储的地址)
	LinkList *q,*p;
	q=s;//报一1
	p=s->next;//报2 
	for(int i=3;i<=3;i++){
		p=p->next;//报3 
		q=q->next;
	}
	q->next=p->next;//报到3的人出队 
	//printf("%d\n",p->data);//输出每一次报到3的人的编号 
	free(p);//释放内存 
	return q->next;//返回下一个开始报数的地址 
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值