#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
int data; //存放密码
int number; //存放序号
struct node* next;
}node;
int main(){
int n,m;//人的个数 ,随机数
struct node *head=NULL;
struct node *p,*q;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
p=(node*)malloc(sizeof(node));
p->number=i+1;//人的序号
scanf("%d",&p->data);//人的密码
p->next=NULL;
if(head==NULL){//链表为空
head=p;
}
else{
q->next=p;
}
q=p;//都是尾节点
}
if(head!=NULL){//如果链表不为空
q->next=head;
}
node* current = head;
node* previous = NULL;
//创建不带节点的循环单链表结束
//遍历删除节点
int Num=0,length=n;
for(int i=0;i<n;i++)
{
node* temp=NULL;
Num=m%length;
// 遍历链表找到待删除节点的前一个节点
for (int i = 1; i < Num; i++) {
previous = current;
current = current->next;
}
temp=current;
printf("%d ",current->number);
m=current->data;//更新m值
// 如果删除的是头节点,需要更新头指针
if (current == head) {
head = current->next;
}
// 修改前一个节点的 next 指针,跳过当前节点
if (previous != NULL) {
previous->next = current->next;
}
// 释放当前节点的内存
free(temp);
length--;
current=previous->next;
}
return 0;
}
-
-
我答案正确了,但是oj上边确给了25分,我不知道哪里出问题了,麻烦解惑