/*約瑟夫問題:循環鏈表的實現*/
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
#定義假0
#定義真1
typedef int數據類型;/*將元素類型定義為整數,也可以定義為其他類型*/
結構節點;/*單鏈表節點類型*/
typedef結構節點* PNode/*節點指針類型*/
Struct Node /*單鏈表節點結構*/
{數據類型信息;
PNode鏈接;
};
typedef結構節點*鏈表;
typedef LinkList * PLinkList
int init_clist( PLinkList pclist,int n)
/*用1,2初始化*pclist中所示的循環表,...,n */
{ PNode p,q;
int I;
q = (PNode)malloc( sizeof( struct節點));
if ( q == NULL)返回(FALSE);
* PC list = q;
q->;info = 1;
q->;link = q;
if (n==1)返回(TRUE);
for(I = 2;我& ltn+1;i++)
{ p =(PNode)malloc(sizeof(struct Node));
if (p==NULL)返回(FALSE);
p->;info = I;
p->;link = q-& gt;鏈接;
q->;link = p;
q = p;
}
返回(真);
}
void josephus _ clist(PLinkList pclist,int s,int m)
{PNode p,pre
int I;
p = * pclist
/*查找第s個元素*/
如果(s==1)
{ pre = p;
p = p-& gt;鏈接;
而(p!=*pclist)
{
pre = p;
p = p-& gt;鏈接;
}
}
else for(I = 1;我& lts;i++)
{
pre = p;
p = p-& gt;鏈接;
}
而(p!= p->;Link) /*當鏈表中的節點數大於1時*/
{ for(I = 1;我& ltm;I++) /*找到第m個節點*/
{ pre = p;
p = p-& gt;鏈接;
}
printf(" out元素:%d \n ",p-& gt;info);/*輸出此節點*/
If (*pclist ==p) /*當此節點為第壹個節點時,刪除時需要特殊處理*/
* PC list = p-& gt;鏈接;
pre->;link = p-& gt;鏈接;/*刪除此節點*/
免費(p);
p = pre->鏈接;
}
printf(" out元素:%d \n ",p-& gt;info);/*輸出最後壹個節點*/
* pclist = NULL
免費(p);
}
主( )
{ LinkList jos _ clist
int n,s,m;
/*輸入所需參數的值*/
做{
printf("\n請輸入n = ")的值;
scanf("%d ",& ampn);
} while(n & lt;1);
做{
printf("請輸入s = ")的值;
scanf("%d ",& amps);
} while(s & lt;1);
做{
printf("請輸入m = ")的值;
scanf("%d ",& ampm);
} while(m & lt;1);
if(init _ clist(& amp;何塞_克裏斯特,北)
約瑟夫·克裏斯特(& ampjos_clist,s,m);
其他
printf("空間不足!\ n ");
}