先来看看程序运行的效果

joseph约瑟死亡游戏-C语言循环链表的实现_自定义


 这个 死亡游戏的大致规则就是:以上面的程序为例,先选7个人出来,再给七个人进行编号,选编号为六个人出来,然后顺时针(逆时针)每个人开始报数,从1开始,一直数到20,数到20的那个人出局,然后继续循环,直到最后一个人出局


typedef  struct  Lnode
{
int data;
struct Lnode *next;
}joseph;

自定义结构体类型    joseph为结构体变量名

void  Create_List(joseph *L,int n)
{
int i;
joseph *p,*s;
s=(joseph*)malloc(sizeof(joseph));
s->data=1;
p=s=L;
for(i=2;i<=n;i++){
s=(joseph*)malloc(sizeof(joseph));
s->data=i;
p->next=s;
p=s;
}
p->next=L;
}

创建循环链表

void  Delete_List(joseph *p,joseph *q)
{
q-> next= p-> next;
free(p);
}

删除节点(本质,释放内存空间)

void josephus ( joseph *L, int s, int m)
{
joseph *p,*q;
int i;
p=L;
for(i=1;i<=s-1;i++)
{
p=p->next;
}
q=p->next;
while(q->next!=p)
q=q->next;
while(p->next!=p)
{
for(int j=1;j<m;j++)
{
q=p;
p=p->next;
}
printf("%d,",p->data);
Delete_List(p,q);
p=q->next;
}
printf("%d,",p->data);//输出最后一个节点
printf("\n");
}

输出结果

完整程序如下,大家可以拿去玩玩

#include<stdio.h>
#include<stdlib.h>

typedef struct Lnode
{
int data;
struct Lnode *next;
}joseph;

void Create_List(joseph *L,int n)
{
int i;
joseph *p,*s;
s=(joseph*)malloc(sizeof(joseph));
s->data=1;
p=s=L;
for(i=2;i<=n;i++){
s=(joseph*)malloc(sizeof(joseph));
s->data=i;
p->next=s;
p=s;
}
p->next=L;
}

void Delete_List(joseph *p,joseph *q)
{
q-> next= p-> next;
free(p);
}


void josephus ( joseph *L, int s, int m)
{
joseph *p,*q;
int i;
p=L;
for(i=1;i<=s-1;i++)
{
p=p->next;
}
q=p->next;
while(q->next!=p)
q=q->next;
while(p->next!=p)
{
for(int j=1;j<m;j++)
{
q=p;
p=p->next;
}
printf("%d,",p->data);
Delete_List(p,q);
p=q->next;
}
printf("%d,",p->data);//输出最后一个节点
printf("\n");
}


int main()
{
joseph *L=NULL;
int m,n,s;
L=(joseph*)malloc(sizeof(joseph));
L->data=1;
printf ("请输入人数、约定编号数,出列值:\n");
scanf ("%d%d%d", &n, &s, &m);
if ((m> 1000) || (n> 1000))
printf ("输入的人数m,n不合法\n");
else
if (s>n) printf ("输入数据不合法!\n");
else
{
Create_List(L, n);
printf ("\n");
josephus(L,s,m);
}
getch();
return 0;
}