文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>线性表的向量存储结构和链表存储结构来实现约瑟夫..

线性表的向量存储结构和链表存储结构来实现约瑟夫..

时间:2010-05-31  来源:advancing

//《数据结构》课程实习(程序实现采用C语言) //已经编译运行通过.欢迎提出改进建议,谢谢! //题目:

试用分别用线性表的向量存储结构和链表存储结构来实现约瑟夫(Josephu)问题。约瑟夫问题如下:

设有n个人围坐圆桌周围。从某个位置上的人开始从1报数,数到m的人便出列,下一个人(第m+1个)又从1报数开始,数到m的人便是第2个出列的人,依次类推,直到最后一个人出列为止,这样就可以得到一个人员排列的新次序。例如,n=8,m=4,从第1个人数起,得到的新次序为48521376.

//代码:

 

 

1)链表存储结构来实现约瑟夫(Josephu)问题:

 

/* HELLO.C -- Hello, world */
/******************************************************************************/
/*用链表实现jesophu问题*/
/******************************************************************************/
/*头文件的定义声明*/
/******************************************************************************/
#include "stdio.h"
#include "conio.h"
#include<malloc.h>
#define NULL 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2


/******************************************************************************/
/*定义一个结点,含有ID和NEXT指针*/
typedef struct Cnode
{
   int ID;
   struct Cnode *next;
}CNode;

CNode *joseph; /*定义一个全局变量*/


/*****************************************************************************/
/*创建函数Create_clist()*/
int Create_clist(CNode *clist,int n) /*创建包含N个节点的循环链表*/
{
  CNode *p,*q;
  int i;
  clist=NULL;
  for(i=n;i>=1;i--)
  {
    p=(CNode *)malloc(sizeof(CNode));
    if(p==NULL)
    {
       return OVERFLOW; /*存储分配失败*/
       }
    p->ID=i;
    p->next=clist;
    clist=p;
    if(i==n)
      q=p; /*用q指向链表的最后一个结点*/
    }
    q->next=clist; /*把链表的最后一个结点的链域指向链表的第一个结点,构成循环链表*/
    joseph=clist;/*用创建好的循环链表头指针赋给全局变量*/
    return OK;

  } /*end*/
/*end Create_list()*/


/*****************************************************************************/
/*创建函数Joseph()*/
   int Joseph(CNode *clist,int m,int n,int k)
  {
   int i;
   CNode *p,*q;
   if(m>n)
   {
      return ERROR; /*起始位置错*/
      printf("\nm cannot > n !\n");
      }
   if(!Create_clist(clist,n))
   return ERROR; /*循环链表创建失败*/
   p=joseph; /*p指向创建好的循环链表*/
   for(i=1;i<m;i++)
   p=p->next; /*p指向m位置的结点*/
   while(p) /*当p不为空时,执行循环*/
   {
      for(i=1;i<k-1;i++)
      p=p->next;/*找出第k个结点q*/
      q=p->next;
      printf("%d",q->ID); /*输出应出列的结点*/
      if(p->next==p)
      p=NULL;/*删除最后一个结点*/
      else {
             p->next=q->next;/*删除第K个节点*/
             p=p->next;
             free(q);
              }

   } /*end while*/
   clist=NULL;

  }
/*end Joseph()*/



 /**************************************************************************/
 /*函数main()*/
  void main()
{
   int m,n,k,i;
   CNode *clist;
   clist=NULL; /*初始化clist*/
   printf("\nPlease enter the number of all people!\nn=\n");
   scanf("%d",&n);
   printf("\nPlease enter the number of people who will start first!\nm= \n");
   scanf("%d",&m);
   printf("\nWho do you want to leave the table!\nk=\n");
   scanf("%d",&k);
   Create_clist(clist,n);/*创建一个有N个结点的循环链表clist*/
   printf("\nThe result is that:\n");
   Joseph(clist,m,n,k);
   getch();
}
/*end main*/
/***************************************************************************/


 

2)线性表的向量存储结构实现约瑟夫(Josephu)问题:

 

#include<stdio.h>
/*******************************************************************************/
/*定义函数josephu()*/
void josephu(int p[],int m,int n,int s)
{
    int i,j,t; /*三个变量,为后面的循环使用*/
    for(i=0;i<=n-1;i++) /*创建一个线形的向量存储结构*/
             p[i]=i+1;/*给每个节点赋值*/
    t=s-1; /*第一个开始人的位置,这是由于数组是从0开始的*/
    for(i=n;i>=1;i--) /*第一个外循环体,共循环n次*/
    {
        t=(t+m-1)%i; /*t:定位于第m人,i:当前圆桌上的人数,%:实现环的处理*/
        printf("%d",p[t]); /*输出第m人的信息*/

        for(j=t+1;j<=i-1;j++)/*第二个外循环体,实现元素迁移,并删除第m人*/
        p[j-1]=p[j];
    }
}

void main()
{
   int m,n,s,p[10];
   printf("\nPlease enter the total number:n\n");
   scanf("%d",&n); /*输入开始的总人数 */
   printf("\nPlease enter the turn who will leave:m\n");
   scanf("%d",&m); /*输入要离开的报数人*/
   printf("\nPlease enter the turn who will start first:s\n");
   scanf("%d",&s); /*输入开始报数的人*/
   josephu(p,m,n,s); /*调用函数josephu()*/
   getch(); /*屏幕暂停!*/


}


//欢迎提出宝贵建议,谢谢!

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载