約瑟夫環本身就是一個不斷在調用輸出刪除函數
所以運用遞推完成 結束條件爲只剩一個節點 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++中意思指未聲明函數