请用c语言编写银行家算法输出所有安全序列的代码
时间: 2024-01-17 20:05:55 浏览: 78
下面是一个用 C 语言编写的银行家算法实现,输出所有的安全序列:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_N 10
#define MAX_M 10
int n, m;
int available[MAX_M];
int max_need[MAX_N][MAX_M];
int allocation[MAX_N][MAX_M];
int need[MAX_N][MAX_M];
bool finish[MAX_N];
int work[MAX_M];
int safe_seq[MAX_N];
bool is_safe() {
int i, j, k, cnt = 0;
bool flag;
for (i = 0; i < n; ++i) {
finish[i] = false;
}
for (i = 0; i < m; ++i) {
work[i] = available[i];
}
while (cnt < n) {
flag = false;
for (i = 0; i < n; ++i) {
if (!finish[i]) {
flag = true;
for (j = 0; j < m; ++j) {
if (need[i][j] > work[j]) {
flag = false;
break;
}
}
if (flag) {
for (k = 0; k < m; ++k) {
work[k] += allocation[i][k];
}
finish[i] = true;
safe_seq[cnt++] = i;
}
}
}
if (!flag) {
return false;
}
}
return true;
}
void print_safe_seq() {
int i;
printf("安全序列为:");
for (i = 0; i < n; ++i) {
printf("%d ", safe_seq[i]);
}
printf("\n");
}
int main() {
int i, j;
printf("请输入进程数和资源种类数:");
scanf("%d%d", &n, &m);
printf("请输入可用资源向量:");
for (i = 0; i < m; ++i) {
scanf("%d", &available[i]);
}
printf("请输入最大需求矩阵:\n");
for (i = 0; i < n; ++i) {
for (j = 0; j < m; ++j) {
scanf("%d", &max_need[i][j]);
}
}
printf("请输入已分配资源矩阵:\n");
for (i = 0; i < n; ++i) {
for (j = 0; j < m; ++j) {
scanf("%d", &allocation[i][j]);
need[i][j] = max_need[i][j] - allocation[i][j];
}
}
if (is_safe()) {
print_safe_seq();
} else {
printf("不存在安全序列!\n");
}
return 0;
}
```
该程序首先读入进程数和资源种类数,然后依次读入可用资源向量、最大需求矩阵和已分配资源矩阵。最后调用 `is_safe()` 函数判断是否存在安全序列,如果存在则调用 `print_safe_seq()` 函数输出安全序列,否则输出提示信息。
使用示例:
```
请输入进程数和资源种类数:5 3
请输入可用资源向量:3 3 2
请输入最大需求矩阵:
7 5 3
3 2 2
9 0 2
2 2 2
4 3 3
请输入已分配资源矩阵:
0 1 0
2 0 0
3 0 2
2 1 1
0 0 2
安全序列为:1 3 4 0 2
```
输出结果与 Python 版本相同。
阅读全文