www.pudn.com > osnew.rar > osnew.cpp
#include#include static address=0; struct FreeList { //FreeList *h1; FreeList *next; int Freesize;//空闲区大小 int isempty;//判断空闲区接点是否为空.1-空,2-满 int Allocatesize;//分配区大小 int name;//作业名称 int start;//起始地址 }; struct ApplyList { //ApplyList *h2; int name;//申请作业名称 int Applysize;//申请作业大小 int flag; ApplyList *next; }; FreeList *h1; ApplyList *h2; ApplyList *np; //ApplyList *temp; class M { public: void setApplyList(); void setAllocateList(FreeList *,ApplyList *); void DeleteProcess(FreeList *); void showApplyList(ApplyList *); void showAllocateList(FreeList *); void showFreeList(FreeList *); bool Find(FreeList *,int); bool declare(ApplyList *,int); }; void M::setAllocateList(FreeList *head1,ApplyList *cp) { FreeList *p=head1->next; while(p) { if((p->Freesize>=cp->Applysize)&&(p->isempty==1)) { if(p->next==NULL) { p->isempty=2; p->Allocatesize=cp->Applysize; p->name=cp->name; p->start=address; /*静态全局变量address的初值是0*/ address+=cp->Applysize; FreeList *newfree=new FreeList; newfree->Freesize=p->Freesize-cp->Applysize; newfree->isempty=1; newfree->start=address; newfree->next=NULL; p->next=newfree; cp->flag=2; } else { p->name=cp->name; p->Allocatesize=cp->Applysize; p->isempty=2; p->start=address; cp->flag=2; } break; } else /*申请区大于空闲区或空闲区结点不为空*/ { p=p->next; } } if(cp->flag==1) cout<<"内存暂时不够,作业"< name<<"内存分配失败!!!"< >name>>Applysize; //if(declare(h2,name)) // continue; ApplyList *cp; cp=new ApplyList; cp->name=name; cp->Applysize=Applysize; cp->flag=1; np->next=cp; np=cp; //np->next=NULL; setAllocateList(h1,cp); cout<<"是否继续输入作业,y-是,任意键-否:"; cin>>op; } np->next=NULL; } bool M::declare(ApplyList *head,int name)/*判断申请的作业名是否已经存在*/ { ApplyList *p=head->next; while(p) { if(p->name==name) { cout<<"有同名作业存在于申请表中,请重新输入作业名称!"; return true; } p=p->next; } return false; } bool M::Find(FreeList *head,int name)//判断要删除的作业是否在分配表中 { FreeList *p=head->next; while(p) { if(p->isempty==2&&p->name==name) return true; p=p->next; } return false; } void M::DeleteProcess(FreeList *head) { FreeList *p=head->next; FreeList *front=head; FreeList *q; char option='y'; int name; while(option=='y') { cout<<"请从分配表中输入要删除的作业名称:"< >name; if(!Find(head,name))//如果想要删除的作业不在分配表中,则重新输入 { cout<<"你要删除的作业不在分配表中,请重新输入!"< name!=name&&p!=NULL)/*往下查找,找到,p为止*/ { front=p; p=p->next; } q=p->next; if(q==NULL)//要删除的是最后一个结点 { if(front->isempty==1) { address-=p->Allocatesize;/*删除后,释放空闲区*/ front->Freesize+=p->Allocatesize; front->next=NULL; delete p; } else { address-=p->Allocatesize; p->Freesize=p->Allocatesize; p->isempty=1; } } else if(p==head->next)//要删除的是第一个结点 { if(p->next->isempty==1)/*如果下一段相邻内存是空闲区的话,*/ { /*则把它与释放掉后的空闲区连起来*/ address-=p->Allocatesize; p->Freesize=p->Allocatesize+p->next->Freesize; p->isempty=1; p->next=q->next; delete q; } else { address-=p->Allocatesize; p->Freesize=p->Allocatesize; p->isempty=1; } } else//要删除的是中间结点 { if(front->isempty==1&&q->isempty==2) { address-=p->Allocatesize; front->Freesize+=p->Allocatesize; front->next=p->next; delete p; } else if(front->isempty==2&&q->isempty==1) { address-=p->Allocatesize; p->Freesize=p->Allocatesize+q->Freesize; p->isempty=1; p->next=q->next; delete q; } else if(front->isempty==1&&q->isempty==1) { address-=p->Allocatesize; front->Freesize+=p->Allocatesize+q->Freesize; front->next=q->next; delete p; delete q; } else { address-=p->Allocatesize; p->Freesize=p->Allocatesize; p->isempty=1; } } } cout<<"是否继续删除作业,y-是,任意键-否:"< >option; } } void M::showAllocateList(FreeList *head)//输出分配表的函数 { FreeList *p=head->next; cout<<"分配的作业名称,大小,地址为:"< isempty==2) { cout< name<<" "< Allocatesize<<" "< start< next; } } void M::showApplyList(ApplyList *head)//输出申请表 { ApplyList *p=head->next; cout<<"申请的作业名称和大小:"< name<<"\t"< Applysize< next; } } void M::showFreeList(FreeList *head)//输出空闲表 { FreeList *p=head;//->next; cout<<"空闲区起始地址和大小:"< isempty==1) cout< start<<" "< Freesize< next; } } void main() { h1=new FreeList; FreeList *f=new FreeList; f->Freesize=640; f->Allocatesize=0; f->isempty=1; f->start=0; f->next=NULL; h1->next=f; h2=new ApplyList; h2->next=NULL; np=h2; int choosen; M m; char c='y'; while(c=='y') { cout<<"输入你的选择:1-输入,2-删除,3-退出"; cin>>choosen; switch(choosen) { case 1: m.setApplyList(); m.showApplyList(h2); m.showAllocateList(h1); m.showFreeList(h1); break; case 2: m.DeleteProcess(h1); m.showApplyList(h2); m.showAllocateList(h1); m.showFreeList(h1); break; case 3: exit(1); } cout<<"是否继续,y-是,任意键-否:"; cin>>c; } }