銀行家算法

#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  
*/
 
發佈了39 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章