41个人手拉手,第三个人自杀, 16与31个位置不会死
这里用到循环链表;
#include <stdio.h>
#include <stdlib.h>
#构造节点的自定义结构体类型变量
typedef struct node
{
#数据部分
int data;
#指向下个节点的指针部分
struct node *next;
}
node *create(int n)
{
#声明一个当前节点p,和一个指向头结点指针head
node *p = NULL, *head;
head = (node*)malloc(sizeof (node));
p = head;
#声明一个新节点s
node *s;
#记录当前节点数
int i = 1;
if( 0! = n){
while(0! = n){
#动态分配内存生成新节点s
s = (node*)malloc(sizeof (node));
s->data = i++
#让p的指针部分指向s
p->next = s;
让当前节点指向s
p = s;
}
#相当于闭链吧,将s的指针指向头节点
s->next = head->next;
}
#释放内存
free(head);
#返回该链表的首地址
return s->next;
}
int main(){
int n=41;
int m=3;
int i;
#生成单向循环链表
node *p=create(n);
node *temp;
#删除m个节点
m %= n;
#判断是否为空
while(p != p->next){
for(i = 0;i < m-1;i++){
#第二个节点
p = p->next;
}
#打印删除的第三个节点
printf("%d",p->next->data);
#用temp删除节点
temp=p->next;
p->next=temp->next;
free(temp);
p=p->next;
}
#打印循环结束存活的节点
printf("%d\n",p->data)
return 0;
}