前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >joseph约瑟死亡游戏-C语言循环链表的实现

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

作者头像
Gorit
发布2021-12-09 16:11:33
3440
发布2021-12-09 16:11:33
举报
文章被收录于专栏:Gorit 带你学全栈系列

先来看看程序运行的效果

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

代码语言:javascript
复制
typedef  struct  Lnode
{
    int data;
    struct  Lnode *next;
}joseph;

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

代码语言:javascript
复制
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;
}

创建循环链表

代码语言:javascript
复制
void  Delete_List(joseph *p,joseph *q)
{
    q-> next= p-> next;
    free(p);
}

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

代码语言:javascript
复制
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;jnext;
		 } 
		 printf("%d,",p->data);
		 Delete_List(p,q);
		 p=q->next;
	}
	printf("%d,",p->data);//输出最后一个节点
	printf("\n"); 
}

输出结果

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

代码语言:javascript
复制
#include
#include

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;jnext;
		 } 
		 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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/11/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档