天天育儿网,内容丰富有趣,生活中的好帮手!
天天育儿网 > c语言围圈报数链表 使用循环链表实现约瑟夫环(围圈报数问题)(示例代码)

c语言围圈报数链表 使用循环链表实现约瑟夫环(围圈报数问题)(示例代码)

时间:2018-10-05 15:59:02

相关推荐

c语言围圈报数链表 使用循环链表实现约瑟夫环(围圈报数问题)(示例代码)

刚开始学C,碰到经典的围圈报数问题,现先将实现代码附下:

#include

#include

struct LNODE{//链表定义

int data;

struct LNODE *next;

};

typedef struct LNODE Lnode;

typedef struct LNODE *LinkList;

struct LNODE *create(int s[])//创建单项循环链表

{

struct LNODE *head=NULL,*p=NULL,*last=NULL;

int i=0;

head=(struct LNODE *)malloc(sizeof(struct LNODE));

if(!head)

printf("memory allocation error!");

if(s[0]!=0)

{

head->data=s[0];

head->next=head;

last=head;

i++;

while(s[i]!=0)//判断是否为0,为0则结束

{

p=(struct LNODE*)malloc(sizeof(struct LNODE));

last->next=p;

p->data=s[i];

p->next=head;

last=p;

i++;

}

}

return head;

}

void printlist(struct LNODE *head)//打印循环链表

{

struct LNODE *q;

int i;

printf("the linked list is :\n");

if(!head)

printf("NULL");

else

{

q=head;

do

{

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

q=q->next;

}while(q!=head);

}

printf("\n");

}

int main()

{

int circlelist[100],n,i,k=1;

printf("please input the number:");

scanf("%d",&n);//输入人数

getchar();

for(i=0;i

circlelist[i]=i+1;//给每个人编号

circlelist[i]=0;//最后值赋0

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

printf("%d\t",circlelist[i]);//打印编号

LinkList p=NULL,q=NULL;

p=create(circlelist);

printlist(p);//打印编号链表

while(p->data!=p->next->data)//自身与自身相等时退出循环

{

if(k!=3)//设置报到数3的人退出

{

k++;

q=p;

p=p->next;

}

else

{

k=1;

printf("%d\t",p->data);//打印先后推出的人员编号

q->next=p->next;//删除报3的人员结点

p=q->next;

}

}

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

}

刚开始指针定义时都没有赋值为NULL,调试没错误,可是却无法执行。

书中说,建议定义时如果暂时不使用指针,先赋值为NULL,我觉得最好这样做,而且,在使用指针时,都应该判断一下是否为空。

如果觉得《c语言围圈报数链表 使用循环链表实现约瑟夫环(围圈报数问题)(示例代码)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。