運用遞歸完成約瑟夫環

約瑟夫環本身就是一個不斷在調用輸出刪除函數

所以運用遞推完成    結束條件爲只剩一個節點     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++中意思指未聲明函數


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章