c语言实现约瑟夫问题链表,C语言循环单链表解决约瑟夫问题

6b5c501bd9949b56eb9c7d712976d154.png

1、你的链表创建的不对,你的建表方式促使最终两个节点为一个循环;

2、报数过程也是难题c 循环链表,遇到头节点要空开;并且过程逻辑似乎不对

下面是改好的代码,没有测试很多实例

#include

#include

typedef int Elemtype;

typedef struct LNode

{

Elemtype data;

struct LNode *next;

}LNode,*LinkList;

void createlist(LinkList head,int n)

{

int i;

1553936042408630.jpg

LinkList p,q;

*head=(LinkList)malloc(sizeof(LNode));

(*head)->next=*head;

p=(*head)->next;//p相当于尾指针

/*for(i=0;i{

q=(LinkList)malloc(sizeof(LNode));

q->data=i+1;

q->next=p;//这上面既要切记顺序问题,又要注意逻辑上能否恰当

p->next=(*head);

p=q;//这句代码意义是哪个呢?

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

}/

for(i=0;i{

q=(LinkList)malloc(sizeof(LNode));

863a040f4e2c13a04415c70ba3828a.gif

q->data=i+1;

p->next=q;

p=q;//使p指向最后一个节点

p->next=(*head);

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

}

}

void yuesefuList(LinkList head,int n,int m,int k)

{

int i,rec=0;

LinkList p,q;

p=head;

if(m>n)

{

c9d617dcd73527a28a5d791e51b6ebef.png

printf("error!");

}

//将p依然指向报1的前一个人

//找到第m-1个人的位置c 循环链表,从下一个人开始报数

for(i=1;i{

p=p->next;

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

/*if(p->next==head->next)

p=p->next;*///上面已经处理了m>n的情况

}

//开始报数

while(rec!=n){

q=p->next;//q指向报1的

for(i=1;i

{

p=q;

q=q->next;//q指向报i+1的人

if(q==head)//由于加了头结点,当循环到头结点时需要移动到下一个节点

{q=q->next;p=p->next;}//此时q记录的是报到k的人的前一个人

}

//本次循环之后,p指向报k-1的,q指向报k的

//delete

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

p->next=q->next;

free(q);

rec++;

}

}

int main()

{

4adf67243ad6b290f17b1d830fb21389.png

LinkList head;

int n,m,k;

printf("please enter the number of person\n");

printf("n=");

scanf("%d",&n);

printf("please enter the location of beginning\n");

printf("m=");

scanf("%d",&m);

printf("please enter the number of gap\n");

printf("k=");

scanf("%d",&k);

createlist(&head,n);

//inputlist(head,n);

yuesefuList(head,n,m,k);

return 0;

}

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-124774-1.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值