📄 综合.cpp
字号:
#include<iostream.h>
#include "stdlib.h"
#include "stdio.h"
#include<cstring>
#include <conio.h>
#define NULL 0
#define get(type) (type*)malloc(sizeof(type))
struct rcb//空闲表的结点
{
int startAdd;//起始地址
int size;//容量大小
char state[10];//状态
rcb *next;//后向指针
}*start=NULL,*tp;//tp在循环首次适应算法中只是上次中到分区的下一个空闲区
struct jcb//作业结点
{
char name[10];
int size;
int ntime;//需要cpu的时间
struct jcb *next;
}*ready=NULL;
void linkJcb(jcb *p)//结点链接,先来先服务
{
jcb *a,*b;
if(ready==NULL)
{
p->next=ready;
ready=p;
}
else
{ b=ready;
a=ready->next;
while(a)
{ b=a;
a=a->next;
}
b->next=p;
p->next=a;
}
}
//------------------------------
void creatJcb()//创建结点并链接成单链表
{
jcb *p;
int i,num;
cout<<" 请输入作业数目:";
cin>>num;
for(i=1;i<=num;i++)
{
cout<<endl<<"作业号No."<<i<<":";
p=get(jcb);
cout<<endl<<" 输入作业名:";
cin>>p->name;
cout<<"输入作业占用内存大小:";
cin>>p->size;
cout<<"输入作业占有cpu的时间:";
cin>>p->ntime;
p->next=NULL;
linkJcb(p); //调用linkJcb函数
}
}
void dispJcb() //显示作业状况
{
jcb *pr;
pr=ready;
if(pr==NULL)
cout<<"外存中没有了作业"<<endl;
else
{
cout<<endl<<"显示外存未分配作业:"<<endl;
while(pr)
{
cout<<"name \t size \t ntime "<<endl;
cout<<pr->name<<" ";
cout<<pr->size<<" ";
cout<<pr->ntime<<" "<<endl;
pr=pr->next;
}
}
}
//-------------------
void linkRcb(rcb *p)//按照 首地址优先 链接分区成链表
{
rcb *a,*b;
if(start==NULL||p->startAdd < start->startAdd)
{
p->next=start;
start=p;
}
else
{
b=start;
a=start->next;
while(a&&a->startAdd < p->startAdd)
{
b=a;
a=a->next;
}
p->next=a;
b->next=p;
}
}
//-------
void linkRcb2(rcb *p)//按照分区的大小链接
{
rcb *a,*b;
if(start==NULL||p->size < start->size)
{
p->next=start;
start=p;
}
else
{
b=start;
a=start->next;
while(a&&a->size < p->size)
{
b=a;
a=a->next;
}
p->next=a;
b->next=p;
}
}
//-----
void creatRcb(int m)// 创建分区
{
rcb *p;
int i,num;
cout<<"分区表中的分区数目:";
cin>>num;
for(i=1;i<=num;i++)
{
cout<<endl<<"分区No."<<i<<":";
p=get(rcb);
cout<<"输入分区的起址:";
cin>>p->startAdd;
cout<<"输入分区的大小:";
cin>>p->size;
strcpy(p->state,"未分配");
p->next=NULL;
if(m==1)//进行首次适应算法和循环首次适应算法
linkRcb(p);
else
linkRcb2(p);
}
}
//-------------
void dispRcb()
{
rcb *a;
int i=1;
a=start;
cout<<endl;
cout<<"---------------------"<<endl;
cout<<" 内存分区说明表 "<<endl;
cout<<"|分区号| 大小 | 起址 | 状态|"<<endl;
while(a)
{
cout<<" "<<i<<" |"<<a->size<<" | "<<a->startAdd<<" |"<<a->state<<"|"<<endl;
i++;
a=a->next;
}
cout<<"---------------------"<<endl;
}
//-----------------
void destroy(jcb *p)
{
if(p==ready)
{
ready=ready->next;
p=ready;
}
else
{
jcb *a;
a=ready;
while(a->next!=p)
a=a->next;
a->next=a->next->next;
p=a->next;
}
}
//-----------------------
void running(int hh)//hh=1时运行首次适应和最佳适应算法;hh=2时循环首次适应
{
jcb *p;
p=ready;
rcb *q;
while(p)
{
tp=start;
int flag=0;
if(hh==1)//---
q=start;
else
q=tp;
while(q&&!flag)
{
if(p->size==q->size&&!strcmp(q->state,"未分配"))
{
flag++;
strcpy(q->state,"已分配");
tp=q->next;//指示下一个空闲区
}
else if(p->size<q->size&&!strcmp(q->state,"未分配"))
{
rcb *t;
t=get(rcb);
t->size=q->size-p->size;
t->startAdd=q->startAdd+p->size;
strcpy(t->state,"未分配");
q->size=p->size;
strcpy(q->state,"已分配");
rcb *l;
l=q->next;
t->next=l;
q->next=t;
flag++;
tp=t;//指示下一个空闲区
}
else
{
q=q->next;
}
if(q==NULL&&!flag&&hh==2)
{
q=start;
hh--;
}
}
if(flag==0)
{
cout<<"此作业"<<p->name<<"无法进行分配操作"<<endl;
p=p->next;
}
else
{
if(p==ready)
{
ready=ready->next;
p=ready;
}
else
{
jcb *a;
a=ready;
while(a->next!=p)
a=a->next;
a->next=p->next;
p=a->next;
}
}
}
dispRcb();
dispJcb();
}
//--------------------------
void callBack()//回收分配区空间
{
rcb *p,*q;
p=start;
while(p)
{
strcpy(p->state,"未分配");
p=p->next;
}
q=start;
int m;
while(q)
{ p=start;
while(p)
{
m=q->startAdd+q->size;
if(p->startAdd==m)
{
q->size+=p->size;
q->next=q->next->next;
p=q->next;
}
else
{
p=p->next;
}
}
q=q->next;
}
dispRcb();
}
void menu1()
{
cout<<"***************************************"<<endl;
cout<<" 1 .采用首次适应算法"<<endl;
cout<<" 2 .采用循环首次适应算法"<<endl;
cout<<" 3 .采用最佳适应算法"<<endl;
cout<<" 0 .exit"<<endl;
cout<<"***************************************"<<endl;
}
void menu()
{
cout<<"1 .创建分区说明表"<<endl;
cout<<"2 .创建外存作业表"<<endl;
cout<<"3 .通过算法调入内存"<<endl;
cout<<"4 .分区回收空间"<<endl;
cout<<"5 .显示分区说明表和外存作业表"<<endl;
cout<<"0 .exit"<<endl;
}
int main()
{
int i=1;
int a;
system("cls");
menu1();
cout<<"输入功能键<0-3>:";
cin>>a;
if(a==1)
{
int b;
while(i)
{
system("cls");
menu();
cout<<"输入功能键<0-5>:";
cin>>b;
switch(b)
{
case 1:
creatRcb(1);
break;
case 2:
creatJcb();
break;
case 3:
running(1);
break;
case 4:
callBack();
break;
case 5:
dispJcb();
dispRcb();
break;
case 0:
default:
break;
}
if(b==0)
{i=0;break;}
cout<<"输入任意键继续...";
getch();
}
}
else if(a==2)
{
int b;
while(i)
{
system("cls");
menu();
cout<<"输入功能键<0-5>:";
cin>>b;
switch(b)
{
case 1:
creatRcb(1);
break;
case 2:
creatJcb();
break;
case 3:
running(2);
break;
case 4:
callBack();
break;
case 5:
dispJcb();
dispRcb();
break;
case 0:
default:
break;
}
if(b==0)
{i=0;break;}
cout<<"输入任意键继续...";
getch();
}
}
else if(a==3)
{
int b;
while(i)
{
system("cls");
menu();
cout<<"输入功能键<0-5>:";
cin>>b;
switch(b)
{
case 1:
creatRcb(2);
break;
case 2:
creatJcb();
break;
case 3:
running(1);
break;
case 4:
callBack();
break;
case 5:
dispJcb();
dispRcb();
break;
case 0:
default:
break;
}
if(b==0)
{i=0;break;}
cout<<"输入任意键继续...";
getch();
}
}
else
cout<<"退出系统"<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -