//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;//返回下一个开始报数的地址
}
n人围圈报数问题(指针解决)
于 2024-03-23 23:05:25 首次发布