约瑟夫问题循环链表弄不出来,希望大神帮忙解答

Ashellves 2018-04-08 09:47:59
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
ElemType num;
struct LNode *next;
}LNode,*LinkList;
////////////////////////////////////////////////////////////////////////////////
LinkList Create(int n)
{//创建带头结点n个结点的循环链表
int i;
LinkList L,p,q;
L=(LinkList)malloc(sizeof(LNode));//头结点
p=q=L;
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
printf("请输入报数人编号:");
scanf("%d",&p->data);
p->num=i;
q->next=p;
q=p;
}
q->next=L;//构成循环链表
return(L);
}
////////////////////////////////////////////////////////////////////////////////
LNode*Locate_LinkList(LinkList L,int x)
{
LNode*p=L->next;
while (p!=NULL&&p->data!=x)
p=p->next;
return p;
}
int main()
{
LNode*Locate_LinkList(LinkList L,int x);
int DeleteList(LinkList L ,int i);
LinkList L,p,temp;
int N,S,M,X,m,i,n;
printf("请输入报数人人数: ");
scanf("%d",&N);
L=Create(N);
for(p=L->next;p!=L;p=p->next)
printf("%d\t%d\t\n",p->data,p->next);
printf("请输入第一个报数人的编号:");
scanf("%d",&S);
printf("请输入间隔的人数:");
scanf("%d",&M);
printf("请输入剩余人数");
scanf("%d",&X);
m=Locate_LinkList(L,S)->num;
for(i=0;i<m-1;i++)//use指向第m-1个,为了从m位开始数
{
L=L->next;
}
while ((n-X)>=0) {
for (i = 1; i < M; i++)//掠过M-1个
L= L->next;
temp = L->next;//temp指向第k个
L->next = temp->next;//第k个从环中脱钩
printf("%d\n", temp->data);
free(temp);//释放第k个表元占用的空间
n--;
}
}


这个代码为啥最后一直循环不出去 小白真心求教,最近学数据结构不太明白

...全文
415 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
棉猴 2018-04-09
  • 打赏
  • 举报
回复
约瑟夫环问题的描述为:编号为1,2,...n的n个人按顺时针方向围坐一圈,每人持一个密码(正整数)。任选一个正整数作为起始数字M,从第一个人开始按顺序报数,报到M的人出列,将他持的密码作为新的M,从他下一个人(顺时针)开始继续报数,报到M的人出列,更新M值。如此下去,直到所有的人出列为止。 请参考 《C++自定义链表实现约瑟夫环2-1》https://blog.csdn.net/hou09tian/article/details/78220636 《C++自定义链表实现约瑟夫环2-2》https://blog.csdn.net/hou09tian/article/details/78256196 希望能够帮到你

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧