数据结构约瑟夫循环

#include <stdio.h>

typedef struct Node

{

int data;

struct Node * next;

}Node,*LinkList;

/**********创建约瑟夫环****************

*                                    *

*  参数:单链表头指针CL,结点个数n  *

*                                    *

*  返回值:返回头指针                *

*                                    *

**************************************/

LinkList InitRing(int n)

{

LinkList CL;

Node *p,*q;

int i;

CL=p=(Node*)malloc(sizeof(Node));

p->data=1;

for(i=2;i<=n;i++)

{

    q=(Node *)malloc(sizeof(Node));

q->data=i;

p->next=q;

p=q;

}

q->next=CL;

return CL;

}

/**********输出约瑟夫环****************

*                                    *

*  参数:单链表头指针CL              *

*                                    *

*  无返回值                          *

*                                    *

**************************************/

void PrintLink(LinkList CL)

{

Node *p;

p=CL;

printf("循环单链表数据:");

do

{

printf("%5d",p->data);

p=p->next;

}while(p!=CL);

printf("\n\n");

}

/****************报数******************

*                                    *

*  参数:单链表头指针CL,报数上限m  *

*                                    *

*  无返回值                          *

*                                    *

**************************************/

void Delete(LinkList CL,int m)

{

int i;

Node *p,*q;    //p用于指向待删除结点的前驱结点,q用于指向待删除结点

printf("报数输出序列:");

p=CL;

q=NULL;

while(p->next!=p)//若链表为空,则报数结束

{

for(i=2;i<m;i++)

{

p=p->next;

}

q=p->next;

p->next=q->next;

printf("%4d",q->data);

free(q);

//上一轮报数结束,需调整p的指向,指向新一轮报数的起点

p=p->next;

    }

printf("%4d",p->data);

free(p);

printf("\n\n");

}

void main()

{

LinkList CL;

int n,m;

printf("请输入约瑟夫总人数:");

scanf("%d",&n);

CL=InitRing(n);

PrintLink(CL);

printf("请输入报数上限:");

scanf("%d",&m);

Delete(CL,7);

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容