选首领。N个游戏者围成一圈,从第一个r人开始报1,2,3.凡报到3者退出圈子,最后留在圈内的人为首领。
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int id;
struct node *next;
}NODE,*LinkList;
LinkList create_list(int n)
/*创建一个节点数为n的单向循环链表,返回值为游戏编号为1的节点的指针*/
{
LinkList head,p;
int k;
head=(NODE *)malloc(sizeof(NODE));/*创建循环链表的第一个节点*/
if(!head){
printf("memory allocation error!\n");
return NULL;
}
head->id=1;
head->next=head;
for(k=n;k>1;--k){/*尾插法创建循环链表的其余n-1个节点*/
p=(NODE*)malloc(sizeof(NODE));
if(!p){
printf("memory allocation error!\n");
return NULL;
}
p->id=k;
p->next=head->next;
head->next=p;
}/*for*/
return head;
}/*create_list*/
void output (LinkList head)
{
LinkList p;
p=head;
do{
printf("%4d",p->id);
p=p->next;
}while(p!=head);
printf("\n");
}/*output*/
void play(LinkList head,int n)
{
LinkList p,s;
int c=0,k;
p=head;
c=1;
k=n;
while(k>1){
if(c==2)/*当c等于2时,p指向的节点的后继即为将被删除的节点*/
{
s=p->next;
p->next=s->next;
free(s);
c=0;
k--;
}/*if*/
c++;
p=p->next;
}/*while*/
printf("\n%4d was the winner.",p->id);/*输出最后留在圈子里的游戏者编号*/
}/*play*/
int main(void)
{
LinkList headptr;
int n;
printf("input the number of players:");
scanf("%d",&n);
headptr=create_list(n);/*创建单向循环链表*/
if(headptr){
output(headptr);/*输出单向循环链表中的节点信息*/
play(headptr,n);
}
return 0;
}