C语言银行家算法实现 链表实现

C语言银行家算法实现 链表实现

两天写完的,更改痕迹还没删,可能不是很严谨,有不足的地方欢迎更正。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> 
#define N 10

#define LEN sizeof(PCB)

/*typedef struct Ziyuan
{
	int a[N];
	int b;
}Zy;*/

/*typedef struct Juzhen
{
	Zy max;//最大资源
	Zy allocation;//已分配
	Zy need;
}Jz;*/
int z = 3;
int m = 5;
int available[N];
int request[N];
int copy[N];
int copy2[N];
typedef struct PCB
{
	char name;
	int max[N];//最大资源
	int allocation[N];//已分配
	int need[N];
	int biaoji;//完成标记
	struct PCB* up;
	struct PCB* next;
}PCB;
PCB* safe[N];
PCB* creat() {
	m = 0;
	char name;
	char k = '0';
	int alloction,need;
	PCB* head, *p1, *p2;
	head = p1 = p2 = NULL;
	head = (PCB*)malloc(LEN);
	if (head)head->next = NULL;
	p2 = head;
	while (true) {
		//int lei = 1;
		printf("进程名(输入0结束):");
		scanf_s("%c", &name, sizeof(name));
		if (name == k) {
			break;
		}else {
			p1 = (PCB*)malloc(LEN);
			if(p1)p1->name = name;
			if(p1)p1->biaoji = 0;
			m++;//进程个数
			printf("\nallocation\n");
			for (int i = 0; i < z; i++) {
				printf("第%d类资源:", i + 1);
				scanf_s("%d", &alloction);
				p1->allocation[i] = alloction;
			}
			printf("need\n");
			for (int i = 0; i < z; i++) {
				printf("第%d类资源:", i + 1);
				scanf_s("%d", &need);
				p1->need[i] = need;
			}
			getchar();
			if (p2)p2->next = p1;
			if (p1)p1->up = p2;
			if (p1)p1->next = NULL;
			p2 = p1;
		}
	}
	return head;
}
/*void cp1() {//备份更改后
	for (size_t i = 0; i < z; i++)
	{
		copy[i] = available[i];
	}
}
void cp2() {//备份更改前
	for (size_t i = 0; i < z; i++)
	{
		copy2[i] = available[i];
	}
}
void hf1() {//恢复更改后
	for (size_t i = 0; i < z; i++)
	{
		available[i] = copy[i];
	}
}
void hf2() {//恢复更改前
	for (size_t i = 0; i < z; i++)
	{
		available[i] = copy2[i];
	}
}*/
void hhh() {
	printf("*******\navailable:");
	for (size_t i = 0; i < z; i++)
	{
		printf("%d  ",available[i]);
	}
	printf("\n");
}
void xs(PCB* tou) {
	PCB* u, * n;
	u = tou;
	n = tou->next;
	printf("进程\talloction\tneed\n");
	while (n) {
		printf("%c\t", n->name);
		for (size_t i = 0; i < z; i++)//unsigned int
		{
			printf("%d  ",n->allocation[i]);
		}
		printf("\t");
		for (size_t i = 0; i < z; i++)
		{
			printf("%d ", n->need[i]);
		}
		printf("\n");
		n = n->next;
	}
}
PCB* cx(PCB* tou,char x) {
	PCB* p = tou;
	int i = 0;
	if (p) {
		p = tou->next;
		while (p)
		{
			if (p->name == x) {
				printf("已找到该进程:%c\n",p->name);
				i = 1;
				break;
			}
			p = p->next;
		}
	}
	if (i == 1) {
		return p;
	}
	else {
		printf("未找到进程\n");
		return NULL;
	}
}
void huisu(PCB* tou,PCB *k){
	int b = 0;
	int wanchen = 0;
	PCB* qq = k;
	PCB* l = tou->next;
	for (size_t i = 0; i < z; i++)
	{
		if (request[i] > qq->need[i])b = 1;//请求大于需求
		if (request[i] > available[i])b = 2;//请求大于系统空闲
	}
//	cp2();
	if (b == 0) {
		printf("试分配成功,正在寻找安全序列......\n");
		for (size_t i = 0; i < z; i++)
		{
			k->allocation[i] = k->allocation[i] + request[i];
			k->need[i] = k->need[i] - request[i];
			available[i] = available[i] - request[i];
		}
//		cp1();//备份更改后
		while (l)
		{
			if (l->biaoji == 0) {//未完成进程才比较资源
				int leijia = 0;
				for (size_t i = 0; i < z; i++)
				{
					if (available[i] >= l->need[i])leijia++;
				}
				if (leijia == 3)
				{
					for (size_t i = 0; i < z; i++)
					{
						available[i] = available[i] + l->allocation[i];//完成进程并回收已分配的程序
					}
					l->biaoji = 1;
					safe[wanchen] = l;
					wanchen++;
					l = tou;
				}
			}
			l = l->next;
		}
	}
	if (wanchen != m) {//没有都完成
		for (int i = wanchen - 1; i >= 0; i--)
		{
			for (size_t j = 0; j < z; j++)
			{
				available[j] = available[j] - safe[i]->allocation[j];
				printf("1");
			}
		}
		if (b == 0) {
			for (size_t i = 0; i < z; i++)
			{
				k->allocation[i] = k->allocation[i] - request[i];
				k->need[i] = k->need[i] + request[i];
				available[i] = available[i] + request[i];
			}
		}
//		hhh();
//		hf2();
		printf("寻找安全序列失败,已回溯到请求前\n");
		hhh();//显示当前空闲资源
	}
	else
	{
		printf("分配成功!\n安全序列为:");
		for (size_t i = 0; i < m; i++)
		{
			printf("%c",safe[i]->name);
		}
//		hf1();//恢复
		printf("\n");
		hhh();
	}
}

int main() {
	PCB* h = NULL;
	PCB* chax = NULL;
	char jc;
	printf("资源个数:");
	scanf_s("%d",&z);
	getchar();
	h = creat();
	xs(h);
	printf("当前系统空闲资源:\n");
	for (size_t i = 0; i < z; i++)
	{
		printf("第%d类资源:", i + 1);
		scanf("%d",&available[i]);
	}
	while (true)
	{		
		getchar();
		printf("需要请求资源的进程名:(0结束)");
		scanf_s("%c", &jc, sizeof(jc));
		if (jc == '0')break;
		chax = cx(h, jc);
		//while (chax){	}
		if (chax) {
			printf("增量请求资源:");
			for (size_t i = 0; i < z; i++)
			{
				printf("第%d类资源:", i + 1);
				scanf("%d", &request[i]);
			}
			huisu(h, chax);
			xs(h);
		}
		else
		{
			printf("11111111");
			xs(h);
		}
	}
}```

操作系统课的实验(银行家算法)#include "malloc.h"   #include "stdio.h"   #include "stdlib.h"   #define alloclen sizeof(struct allocation)   #define maxlen sizeof(struct max)   #define avalen sizeof(struct available)   #define needlen sizeof(struct need)   #define finilen sizeof(struct finish)   #define pathlen sizeof(struct path)   struct allocation   {   int value;   struct allocation *next;   };   struct max   {   int value;   struct max *next;   };   struct available /*可用资源数*/   {   int value;   struct available *next;   };   struct need /*需求资源数*/   {   int value;   struct need *next;   };   struct path   {   int value;   struct path *next;   };   struct finish   {   int stat;   struct finish *next;   };   int main()   {   int row,colum,status=0,i,j,t,temp,processtest;   struct allocation *allochead,*alloc1,*alloc2,*alloctemp;   struct max *maxhead,*maxium1,*maxium2,*maxtemp;   struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1;   struct need *needhead,*need1,*need2,*needtemp;   struct finish *finihead,*finish1,*finish2,*finishtemp;   struct path *pathhead,*path1,*path2;   printf("\n请输入系统资源的种类数:");   scanf("%d",&colum);   printf("请输入现时内存中的进程数:");   scanf("%d",&row);   printf("请输入已分配资源矩阵:\n");   for(i=0;i<row;i++)   {   for (j=0;jnext=alloc2->next=NULL;   scanf("%d",&allochead->value);   status++;   }   else   {   alloc2=(struct allocation *)malloc(alloclen);   scanf("%d,%d",&alloc2->value);   if(status==1)   {   allochead->next=alloc2;   status++;   }   alloc1->next=alloc2;   alloc1=alloc2;   }   }   }   alloc2->next=NULL;   status=0;   printf("请输入最大需求矩阵:\n");   for(i=0;i<row;i++)   {   for (j=0;jnext=maxium2->next=NULL;   scanf("%d",&maxium1->value);   status++;   }   else   {   maxium2=(struct max *)malloc(maxlen);   scanf("%d,%d",&maxium2->value);   if(status==1)   {   maxhead->next=maxium2;   status++;   }   maxium1->next=maxium2;   maxium1=maxium2;   }   }   }   maxium2->next=NULL;   status=0;   printf("请输入现时系统剩余的资源矩阵:\n");   for (j=0;jnext=available2->next=NULL;   work1->next=work2->next=NULL;   scanf("%d",&available1->value);   work1->value=available1->value;   status++;   }   else   {   available2=(struct available*)malloc(avalen);   work2=(struct available*)malloc(avalen);   scanf("%d,%d",&available2->value);   work2->value=available2->value;   if(status==1)   {   avahead->next=available2;   workhead->next=work2;   status++;   }   available1->next=available2;   available1=available2;   work1->next=work2;   work1=work2;   }   }   available2->next=NULL;   work2->next=NULL;   status=0;   alloctemp=allochead;   maxtemp=maxhead;   for(i=0;i<row;i++)   for (j=0;jnext=need2->next=NULL;   need1->value=maxtemp->value-alloctemp->value;   status++;   }   else   {   need2=(struct need *)malloc(needlen);   need2->value=(maxtemp->value)-(alloctemp->value);   if(status==1)   {   needhead->next=need2;   status++;   }   need1->next=need2;   need1=need2;   }   maxtemp=maxtemp->next;   alloctemp=alloctemp->next;   }   need2->next=NULL;   status=0;   for(i=0;inext=finish2->next=NULL;   finish1->stat=0;   status++;   }   else   {   finish2=(struct finish*)malloc(finilen);   finish2->stat=0;   if(status==1)   {   finihead->next=finish2;   status++;   }   finish1->next=finish2;   finish1=finish2;   }   }   finish2->next=NULL; /*Initialization compleated*/   status=0;   processtest=0;   for(temp=0;temp<row;temp++)   {   alloctemp=allochead;   needtemp=needhead;   finishtemp=finihead;   worktemp=workhead;   for(i=0;istat==0)   {   for(j=0;jnext,worktemp=worktemp->next)   if(needtemp->valuevalue)   processtest++;   if(processtest==colum)   {   for(j=0;jvalue+=alloctemp->value;   worktemp1=worktemp1->next;   alloctemp=alloctemp->next;   }   if(status==0)   {   pathhead=path1=path2=(struct path*)malloc(pathlen);   path1->next=path2->next=NULL;   path1->value=i;   status++;   }   else   {   path2=(struct path*)malloc(pathlen);   path2->value=i;   if(status==1)   {   pathhead->next=path2;   status++;   }   path1->next=path2;   path1=path2;   }   finishtemp->stat=1;   }   else   {   for(t=0;tnext;   finishtemp->stat=0;   }   }   else   for(t=0;tnext;   alloctemp=alloctemp->next;   }   processtest=0;   worktemp=workhead;   finishtemp=finishtemp->next;   }   }   path2->next=NULL;   finishtemp=finihead;   for(temp=0;tempstat==0)   {   printf("\n系统处于非安全状态!\n");   exit(0);   }   finishtemp=finishtemp->next;   }   printf("\n系统处于安全状态.\n");   printf("\n安全序列为: \n");   do   {   printf("p%d ",pathhead->value);   }   while(pathhead=pathhead->next);   printf("\n");   return 0;   } #include "string.h" #include #include #define M 5 #define N 3 #define FALSE 0 #define TRUE 1 /*M个进程对N类资源最大资源需求量*/ int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; /*系统可用资源数*/ int AVAILABLE[N]={10,5,7}; /*M个进程对N类资源最大资源需求量*/ int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; /*M个进程已经得到N类资源的资源量 */ int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; /*M个进程还需要N类资源的资源量*/ int Request[N]={0,0,0}; void main() { int i=0,j=0; char flag='Y'; void showdata(); void changdata(int); void rstordata(int); int chkerr(int); showdata(); while(flag=='Y'||flag=='y') { i=-1; while(i=M) { printf("请输入需申请资源的进程号(从0到"); printf("%d",M-1); printf(",否则重输入!):"); scanf("%d",&i); if(i=M)printf("输入的进程号不存在,重新输入!\n"); } printf("请输入进程"); printf("%d",i); printf("申请的资源数\n"); for (j=0;jNEED[i][j]) { printf("进程"); printf("%d",i); printf("申请的资源数大于进程"); printf("%d",i); printf("还需要"); printf("%d",j); printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); /*printf("申请不合理,出错!请重新选择!\n");*/ flag='N'; break; } else { if(Request[j]>AVAILABLE[j]) { printf("进程"); printf("%d",i); printf("申请的资源数大于系统可用"); printf("%d",j); printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); /*printf("申请不合理,出错!请重新选择!\n");*/ flag='N'; break; } } } if(flag=='Y'||flag=='y') { changdata(i); if(chkerr(i)) { rstordata(i); showdata(); } else showdata(); } else showdata(); printf("\n"); printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: "); scanf("%c",&flag); } } void showdata() { int i,j; printf("系统可用的资源数为:\n"); printf(" "); for (j=0;j<N;j++){ printf(" 资源"); printf("%d",j); printf(":"); printf("%d",AVAILABLE[j]); /*printf("\n");*/ /* cout<<endl; // cout<<"各进程资源的最大需求量:"<<endl<<endl; // for (i=0;i<M;i++) // { // cout<<"进程"<<i<<":"; // for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<MAX[i][j]; // cout<<endl; */ } printf("\n"); printf("各进程还需要的资源量:\n"); for (i=0;i<M;i++) { printf(" 进程"); printf("%d",i); printf(":"); for (j=0;j<N;j++){ printf("资源"); printf("%d",j); printf(":"); printf("%d",NEED[i][j]); /*printf("\n");*/ } printf("\n"); } printf("各进程已经得到的资源量: \n"); for (i=0;i<M;i++) { printf(" 进程"); printf("%d",i); /*printf(":\n");*/ for (j=0;j<N;j++){ printf("资源"); printf("%d",j); printf(":"); printf("%d",ALLOCATION[i][j]); /*printf("\n");*/ } printf("\n"); } } void changdata(int k) { int j; for (j=0;j<N;j++) { AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j]; } }; void rstordata(int k) { int j; for (j=0;j<N;j++) { AVAILABLE[j]=AVAILABLE[j]+Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j]; } }; int chkerr(int s) { int WORK,FINISH[M],temp[M]; int i,j,k=0; for(i=0;i<M;i++)FINISH[i]=FALSE; for(j=0;j<N;j++) { WORK=AVAILABLE[j]; i=s; while(i<M) { if (FINISH[i]==FALSE&&NEED[i][j]<=WORK) { WORK=WORK+ALLOCATION[i][j]; FINISH[i]=TRUE; temp[k]=i; k++; i=0; } else { i++; } } for(i=0;i<M;i++) if(FINISH[i]==FALSE) { printf("\n"); printf("系统不安全!!! 本次资源申请不成功!!!\n"); printf("\n"); return 1; } } printf("\n"); printf("经安全性检查,系统安全,本次分配成功。\n"); printf("\n"); printf(" 本次安全序列:"); for(i=0;i"); } printf("\n"); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值