哲学家就餐问题C原代码,第1张

哲学家就餐问题C原代码,第2张

题目:

  一群哲学家围坐在一个圆桌,手上持有密码m,并从1开始编了号取初值m,哲学家从1开始报数, 报到m的哲学家停止吃饭,退出圆桌,求哲学家退出的顺序。要求:n和初值m由完家输入.手上的密码随机产生.最后要打印出编号对应的密码,输出哲学家离开的相后顺序

  分析:可用循环链表实现,链表数据类型为结构体,记录编号和相应密码,另外设标志哲学家报数的变量mouth, 它的值和哲学家嘴上报的数相等,则如果mouth和m相等,该哲学家就应该离开离开前取他的密码交给m,同时将他的编号放另一单链表numbsave保存。注意编号要从numbsave的最后节点插入。当循环链表指向自身时停止比较,这个哲学家即是最后离开的一个.依次打印出numbsave中的数即为按编号哲学家离开的先后顺序。

  */

  #include "stdio.h"

  #include "conio.h"

  #include "stdlib.h"

  struct philosopher /*哲学家就餐结构体*/

  { int number; /*编号*/

  int password;

  int mouth; /*嘴上报的数*/

  struct philosopher *next;

  };

  struct philosopher *phead,*pend,*pp;

  struct numbsave /*存放离开顺序*/

  { int numsave;

  struct numbsave *next;

  };

  struct numbsave *top=NULL,*numbnew,*numbthis;

  void main(void)

  { char *p,d;

  int b=1,k,n,m,mouthm=1;

  clrscr(); gotoxy(9,8);

  printf("please input n m:");

  scanf("%d%d",&n,&m); /*n为哲学家人数,m为初始密码*/

  phead=(struct philosopher *)malloc(sizeof(struct philosopher));

  pend=phead;phead->mouth=1;

  for(b=1;b<=n-1;b++) /*给哲学家分配随机密码*/

  {pend->number=b;

  k=random(20); /*k为0

  while(k<=0)

  k=random(20);

  pend->password=k;

  pp=(struct philosopher *)malloc(sizeof(struct philosopher));

  pend->next=pp; pend=pp;

  }

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 哲学家就餐问题C原代码

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情