银行家算法
来源:互联网 发布:云打印软件 编辑:程序博客网 时间: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;
}
#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
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
*/
34409541 讨论网页
34409326 讨论JAVA 已满
34408784 讨论VC++
34409699 讨论VC++
9143041 讨论MFC编程
10614204 讨论C#
10613030 讨论Win32编程
10613067 讨论游戏开发
18779860 讨论JAVA
*/
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 简要AT命令介绍
- 电子书下载站
- VC++与汇编语言混合编程事例-----冒泡排序:
- ExeShield Deluxe 1.41
- CSS Tab Designer
- 银行家算法
- 短信收发类无错版SerialStream.cs
- 短信收发类SerialStream.cs的用例--SerialStreamReader.cs
- 精简指令集RISC
- 计算机图形学-----画直线
- 有关MMU的问题!
- 短信猫GSM Modem
- C10K问题
- showModalDialog/showModelessDialog实例,父窗口向子窗口传递值,子窗口设置父窗口的值,子窗口关闭的时候返回值到父窗口.关闭刷新父窗口