Josephus問題:
設有n個人圍坐在一個圓桌周圍,現在從第s個人開始報數,數到第m的人出列,然後從出列的下一個人重新開始報數,數到第m的人又出列。。。。如此反覆直到所有的人全部出列爲止。
問題是 :任意給定n,s,m,求按出列次序輸出姓名。
#include <stdio.h>
#include <string.h>
struct Node;
typedef struct Node * PNode;
struct Node
{
char * name;
PNode link;
};
typedef struct Node * LinkList;
LinkList CreateList(int n) //創建姓名鏈表函數
{
LinkList palist;
PNode p,q;
int i,m;
char string[10];
palist=(LinkList)malloc(sizeof(struct Node));
p=(PNode)malloc(sizeof(struct Node));
palist->link=p;
for(i=0;i<n;i++)
{
printf("input %dst name(<10)",i);
scanf("%s",string);
m=strlen(string);
p->name=(char *)malloc(sizeof(char)*m);
strcpy(p->name,string);
if(i!=n-1)
{
q=(PNode)malloc(sizeof(struct Node));
p->link=q;
p=p->link;
}
else p->link=palist->link;
}
return palist;
}
void Josephus(LinkList palist,int s,int m)//josephus函數
{
PNode p,q;
int i,flag=1;
p=(PNode)palist;
for(i=1;i<s;i++)
{
p=p->link;
}
printf("the josephus index is: /n");
do
{
for(i=1;i<m;i++)
{
p=p->link;
}
printf("out name:%s /n",p->link->name);
if(p!=p->link)
{
q=p->link;
p->link=q->link;
free(q);
}
else flag=0;
}
while(flag);
}
void main()
{
LinkList list;
int n,s,m;
char ch;
printf("please input n:");
scanf("%d",&n);
scanf("%c",&ch);
printf("please input s:");
scanf("%d",&s);
scanf("%c",&ch);
printf("please input m:");
scanf("%d",&m);
scanf("%c",&ch);
list=CreateList(n);
Josephus(list,s,m);
printf("/n");
}
每個結點的姓名由一個字符串指針指定,這樣將內存消耗減到最小。
通過下面的語句實現:
scanf("%s",string);
m=strlen(string);
p->name=(char *)malloc(sizeof(char)*m);
strcpy(p->name,string);