#include
#include
#define MAX_NODE_NUM 30
#define TRUE 1U
#define FALSE 0U
typedef struct NodeType
{ int id; /* 编号 */
int cipher; /* 密码 */
struct NodeType *next;
} NodeType;
/* 创建单向循环链表 */
static void CreaList(NodeType **, const int);
/* 运行"约瑟夫环"问题 */
static void StatGame(NodeType **, int);
/* 打印循环链表 */
static void PrntList(const NodeType *);
/* 得到一个结点 */
static NodeType *GetNode(const int, const int);
/* 测试链表是否为空, 空为TRUE,非空为FALSE */
static unsigned EmptyList(const NodeType *);
int main(void)
{ int n, m;
NodeType *pHead=NULL;
while(1)
{printf("please input the number of the person n(<=%d):",MAX_NODE_NUM);
scanf("%d",&n);
printf("and Initial password m:");
scanf("%d",&m);
if(n>MAX_NODE_NUM)
{printf("The number is too big, please input again!\n");
continue;
}
else
break;
}
CreaList(&pHead,n);
printf("\n------------Circulation chain table primitive printing-------------\n");
PrntList(pHead);
printf("\n--------------the situation of Sets out printing---------------\n");
StatGame(&pHead, m);
printf("\n\"Joseph link\"The question completes!\n");
return 0;
}
static void CreaList(NodeType **ppHead, const int n)
{
int i,iCipher;
NodeType *pNew, *pCur;
for(i=1;i<=n;i++)
{
printf("input the %d person's password:",i);
scanf("%d", &iCipher);
pNew=GetNode(i,iCipher);
if(*ppHead==NULL)
{
*ppHead=pCur=pNew;
pCur->next=*ppHead;
}
else
{
pNew->next=pCur->next;
pCur->next=pNew;
pCur=pNew;
}
}
printf("Completes the e-way circulation chain table the foundation!\n");
}
static void StatGame(NodeType **ppHead, int iCipher)
{
int iCounter, iFlag=1;
NodeType *pPrv, *pCur, *pDel;
pPrv=pCur=*ppHead;
/* 将pPrv初始为指向尾结点,为删除作好准备 */
while(pPrv->next!=*ppHead)
pPrv=pPrv->next;
while(iFlag) /* 开始搞了! */
{
/* 这里是记数,无非是移动iCipher-1趟指针! */
for(iCounter=1;iCounter
pPrv=pCur;
pCur=pCur->next;
}
if(pPrv==pCur) /* 是否为最后一个结点了 */
iFlag=0;
pDel=pCur; /* 删除pCur指向的结点,即有人出列 */
pPrv->next=pCur->next;
pCur=pCur->next;
iCipher=pDel->cipher;
printf("The %d person Leaving ranks, password: %d\n",
pDel->id, /* 这个编号标识出列的顺序 */
pDel->cipher);
free(pDel);
}
*ppHead=NULL; /* 没人了!为了安全就给个空值 */
}
static void PrntList(const NodeType *pHead)
{
const NodeType *pCur=pHead;
if (EmptyList(pHead))
return;
do
{
printf("The %d person, password: %d\n",pCur->id,pCur->cipher);
pCur=pCur->next;
} while (pCur!=pHead);
}
static NodeType *GetNode(const int iId,const int iCipher)
{
NodeType *pNew;
pNew=(NodeType *)malloc(sizeof(NodeType));
if(!pNew)
{
printf("Error,the memory is not enough!\n");
exit(-1);
}
pNew->id=iId;
pNew->cipher=iCipher;
pNew->next=NULL;
return pNew;
}
static unsigned EmptyList(const NodeType *pHead)
{
if(!pHead)
{
printf("The list is empty!\n");
return TRUE;
}
return FALSE;
}
这是一个C语言的程序,哪位高手可以改为C++的,谢谢!!!急用!!!
http://dev.csdn.net/author/jiyucn/ce084d08d6694d3796d6a477c5f74ba6.html