银行家算法

来源:互联网 发布:云打印软件 编辑:程序博客网 时间:2024/04/30 02:19
#include <stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
#define N 10
#define M 10
typedef struct{
 int ip;
 int able[N];//
 int visited[N];
 int remain[M];
}WorkNode;   /*工作节点,第分配一次,就得到了一个新状态,这个新状态就保存在这个结构体中。

 /*ass为进程已分配资源,need为最大需求,r为各种资源的个数*/
int ass[N][M],need[N][M],r[M],top=-1,pnum=0,rnum=0;    

/*currnet为当前工作节点*/
WorkNode stack[N],current; 
 void add(int [],int []);     //进程完成,释放资源,第一个参数为已剩余的,第二个参数为已分配的
 int small(int [],int []);      //已有的资源是否能满足最大请求,第一个参数为需求数,第二个参数为剩余数。
 void init();                     /*初始化*/
 void output();/*输出堆栈中的一种可能*/
 int bankalgo();               /*银行家算法主要部分,回溯法*/
int main(){
  int i,ct;
  init();
  for(i=0;i
<pnum;i++)
  if(small(need[i],current.remain) )

   current.able[++current.ip]
=i;

 
if(current.ip==-1){
  
printf("it is unsafe ");
 }
 else if(ct
=bankalgo())
  
printf("it is safe,and it has %d solutions ",ct);
 else printf(" it is unsafe ");
 return 0;
}

void init(){
 int i,j,sum
=0;
 
system("cls");
 printf("输入进程数:");
 scanf("%d",&pnum);
 printf("输入资源种类数:");
 scanf("%d",&rnum);
 printf("输入还剩余资源: ");
 for(i
=0;i<rnum;i++)scanf("%d",&r[i]);//对剩余资源数赋值

//对分配资源赋值
 printf("输入已分配矩阵: ");
for(i
=0;i<pnum;i++){
  
printf("p%d:",i);
  for(j
=0;j<rnum;j++)
   
scanf("%d",&ass[i][j]);
 }
//输入最大需求矩阵
 printf("输入最大需求矩阵: ");
 for(i
=0;i<pnum;i++){
  
printf("p%d:",i);
  for(j
=0;j<rnum;j++)
   
scanf("%d",&need[i][j]);
 }
//将最大需求矩阵转换为还需求矩阵
 for(i
=0;i<pnum;i++){
     
for(j=0;j<rnum;j++)
         
need[i][j]-=ass[i][j];
 
}
 memset(current.visited,0,sizeof(current.visited) );
 for(i
=0;i<rnum;i++)
 
current.remain[i]=r[i];//求当前资源剩余数
 
current.ip=-1;
}

void output(){
 int i;
 for(i
=0;i<=top;i++)
     
if(i==top)
         
printf("p%d",stack[i].able[stack[i].ip]);
     else
         printf("p%d--
>",stack[i].able[stack[i].ip]);
    printf(" ");
}
void add(int x[],int y[]){  //进程完成,释放资源,第一个参数为已剩余的,第二个参数为已分配的
 int i;
 for(i=0;i
<rnum;i++)
  x[i]+
=y[i];
}

int small(int x[],int y[]){
 int i;
 for(i
=0;i<rnum;i++){
  
if(x[i]>y[i])break;//需求数大于剩余数,则退出循环,返回0
 }
 if(i==rnum)return 1;
 return 0;
}

int bankalgo(){
 int i,ct=0;
 while(1){
  stack[++top]=current;
  current.visited[current.able[current.ip]]=1;//标志
  add(current.remain,ass[current.able[current.ip]]);//
  current.ip=-1;
  for(i=0;i
<pnum;i++)
   if(!current.visited[i] && small(need[i],current.remain) )//第i个进程还没被操作且可以分配
    current.able[++current.ip]
=i;
  
if(current.ip==-1)
  
{
   if(top
==pnum-1){
    
output();
    ct++;
   }
   else if(top<0)break;
   current
=stack[top--];
   
while(current.ip==0)current=stack[top--];
   
current.ip--;
  }
 }
 return ct;
/*
http://f2.9612.org//vcpp/webinfo/WebInfoBata1.asp
QQ群:
34409541 讨论网页 
34409326 讨论JAVA 已满
34408784 讨论VC++ 
34409699 讨论VC++ 
9143041 讨论MFC编程 
10614204 讨论C# 
10613030 讨论Win32编程 
10613067 讨论游戏开发 
18779860 讨论JAVA 
*/
 
原创粉丝点击