约瑟夫环本身就是一个不断在调用输出删除函数
所以运用递推完成 结束条件为只剩一个节点 q->next==q时结束输出最后一个节点
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int id;
int mima;
struct Node *next;
}LNode,*LinkList;
LNode * creat_LinkList(int n)
{
int k,i=1;
LinkList p,q,h;
h=(LinkList)malloc(sizeof(LNode));
printf("请输入密码:\n");
scanf("%d",&k);
h->mima=k;
h->id=i++;
p=q=h;
while(n-1)
{
p=(LinkList)malloc(sizeof(LNode));
printf("请输入密码:\n");
scanf("%d",&k);
p->mima=k;
p->id=i++;
q->next=p;
q=p;
n--;
}
p->next=h;
return h;
}
int Josephs(LinkList H,int m)
{
int r=2;
LinkList p,q;
p=H->next,q=H;
while(r<m) //利用r变量使其q跑到所需删除p的前一位
{ //因为P指向H的下一个节点 所以另其r初始值为2;
q=p;
p=p->next;
r++;
}
r=2;
q->next=p->next;
printf("%d",p->id);
m=p->mima;
free(p);
p=q->next;
if(q->next==q)
{
printf("%d\n\n",q->id);
return 0;
}
Josephs(p,m);
}
int main()
{
int n; //人数
int m; //初始密码
LinkList H;
printf("请输入人数:\n");
scanf("%d",&n);
printf("请输入初始密码:\n");
scanf("%d",&m);
H=creat_LinkList(n);
printf("出列顺序为:");
Josephs(H,m);
}
存在问题:
当链表只有一个人时由于free掉p 从而使q一起free掉 q->next==q运行错误
修改:
free(p)和p=q->next改到if判断条件之后
附录: undefined; assuming extern returning int c++中意思指未声明函数