N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
#include <stdio.h>
#include <stdlib.h>
typedef int Datatype;
typedef struct Node
{
Datatype data;
struct Node *next;
}ListNode;
ListNode * InitNode(Datatype data) //带数据的头节点
{
ListNode * head=(ListNode *)malloc(sizeof(ListNode));
if(head != NULL){
head->data = data;
head->next = head;
}else{
return NULL;
}
return head;
}
//创建
ListNode * CreateNode(Datatype data)
{
ListNode * new=(ListNode *)malloc(sizeof(ListNode));
if (new!=NULL){
new->next = NULL;
}else{
return NULL;
}
new->data = data;
return new;
}
//尾插
void InsertNodeTail(ListNode *head,ListNode * new)
{
ListNode *p=head;
while(p->next!=head)
{
p=p->next;
}
p->next = new;
new->next=head;
}
//头插
void InsertNodeHead(ListNode *head,ListNode *new)
{
new->next = head->next;
head->next=new;
}
void Display(ListNode *head)
{
ListNode *p=head;
printf("%d ",head->data);
while(p->next!=head)
{
printf("%d ",p->next->data);
p=p->next;
}
printf("\n");
}
ListNode * DeleteNode(ListNode *head,ListNode *delNode)
{
ListNode *p=head;
while(p->next!=head)
{
if(p->next == delNode)
{
ListNode *tmp = p->next;
p->next = tmp->next;
free(tmp);
tmp=NULL;
return p->next;
}
p=p->next;
}
return NULL;
}
void ClearNode(ListNode *head) //清空全部节点
{
ListNode *p=head;
if(head == NULL ||head->next ==NULL)
return;
while(p->next!=head)
{
ListNode *tmp = p->next;
p->next = tmp->next;
free(tmp);
tmp->next=NULL;
tmp=NULL;
}
free(head);
head->next=NULL;
head=NULL;
}
void GetSurvival(ListNode *head,int num,int pos)
{
if(num == 0)
return;
if(num<pos)
{
Display(head);
ClearNode(head); //清空全部节点
return;
}
ListNode *p=head;
int flag=1;
while(1)
{
ListNode *tmp=p;
for(int i=1;i<pos-1;i++) //移动节点
{
tmp=tmp->next;
}
//删除节点
ListNode *delnode = tmp->next;
printf("kill %d\n",delnode->data);
tmp->next = delnode->next;
free(delnode);
delnode=NULL;
// DeleteNode(p,tmp);
p=tmp->next;
--num;
if(num == pos)
{
for(int i=1;i<pos;i++)
{
if (flag)
{
printf("存活的人为:");
flag=0;
}
printf("%d ",p->data);
p=p->next;
}
printf("\n");
ClearNode(p); //清空全部节点
return;
}
}
}
int main(int argc, char const *argv[])
{
int num=11,pos;
ListNode *head=NULL;
while(1)
{
head = InitNode(1);
printf("输入总人数:");
scanf("%d",&num);
printf("输入杀死第几个人:");
scanf("%d",&pos);
for(int i=2;i<=num;i++)
{
InsertNodeTail(head,CreateNode(i));
}
Display(head);
GetSurvival(head,num,pos);
if(num ==0)
break;
head=NULL;
}
return 0;
}