Josephus算法解答~

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);

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