#include<iostream>
using namespace std;
typedef struct Process
{
int processID;
int priority;
int attitude;
struct Process *next;
}*ProcessNode;
ProcessNode FindPosition(ProcessNode p,int priority)
{//插入到返回节点的后面
while(1)
{
if( p->next == NULL || p->next->priority >= priority)//要注意先后否则会出错
return p;
else
p = p->next;
}
}
void Build(ProcessNode &p)
{//建立并按照优先数排序
p = (ProcessNode)malloc(sizeof(ProcessNode));
ProcessNode q=p,position = NULL,newNode = NULL;
int n=0;
cout<<"请输入要建立进程的数量:";
cin>>n;
for(int i = 0;i < n;i++)
{
cout<<"请分别输入进程P"<<i+1<<"的进程号,优先数,运行状态:";
if(i == 0)
{
q->next = (ProcessNode)malloc(sizeof(ProcessNode));
cin>>q->next->processID>>q->next->priority>>q->next->attitude;
q->next->next = NULL;
}
else
{
newNode = (ProcessNode)malloc(sizeof(ProcessNode));
cin>>newNode->processID>>newNode->priority>>newNode->attitude;
position = FindPosition(p,newNode->priority);
newNode->next = position->next;
position->next = newNode;
}
}
}
void Display(ProcessNode p)
{
p = p->next;
while(p != NULL)
{
cout<<"进程P"<<p->processID<<"的进程号,优先数,运行状态为:"<<p->processID<<" "<<p->priority<<" "<<p->attitude<<endl;
p = p->next;
}
}
void Display1(ProcessNode p)
{
int i = 0;
p = p->next;
cout<<"*****************************"<<endl;
while(p != NULL)
{
cout<<"进程P"<<p->processID;
switch(p->attitude)
{
case 0:cout<<"正在等待..."<<endl;break;
case 1:cout<<"准备就绪..."<<endl;break;
case 2:cout<<"正在执行..."<<endl;break;
case 3:cout<<"挂起就绪..."<<endl;break;
case 4:cout<<"挂起等待..."<<endl;break;
case 5:cout<<"被杀死..."<<endl;break;
case 6:cout<<"执行完成..."<<endl;break;
}
p = p->next;
}
cout<<"*****************************"<<endl;
}
void BuildNew(ProcessNode &p)
{
cout<<"请分别输入新建进程的进程号,优先数,运行状态:";
ProcessNode newNode = (ProcessNode)malloc(sizeof(ProcessNode));
cin>>newNode->processID>>newNode->priority>>newNode->attitude;
ProcessNode position = FindPosition(p,newNode->priority);
newNode->next = position->next;
position->next = newNode;
cout<<"新进程创建成功!"<<endl;
Display1(p);
}
int FindNum(ProcessNode &p,int num)
{//找到进程号为num的进程并且修改它的状态为挂起
ProcessNode q = p->next;
while(q != NULL)
{
if(q->processID == num)
{
switch(q->attitude)
{
case 0:q->attitude = 4;break;
case 1:q->attitude = 3;break;
case 2:q->attitude = 3;break;
default:break;
}
cout<<"进程P"<<q->processID<<"成功挂起."<<endl;
return 1;
}
else
q = q->next;
}
return 0;
}
int FindNum1(ProcessNode &p,int num)
{//找到进程号为num的进程并且解挂
ProcessNode q = p->next;
while(q != NULL)
{
if(q->processID == num)
{
switch(q->attitude)
{
case 4:q->attitude = 0;break;
case 3:q->attitude = 1;break;
default:break;
}
cout<<"进程P"<<q->processID<<"成功解挂."<<endl;
return 1;
}
else
q = q->next;
}
return 0;
}
int FindNum2(ProcessNode &p,int num)
{//找到进程号为num的进程并且修改它的优先数按优先数排序
ProcessNode r=p,q = p->next;
while(q != NULL)
{
if(q->processID == num)
{
r->next = q->next;
cout<<"请输入修改的优先数:";
cin>>q->priority;
ProcessNode position = FindPosition(p,q->priority);
q->next = position->next;
position->next = q;
cout<<"进程P"<<q->processID<<"优先数修改成功."<<endl;
return 1;
}
else
{
r=q;
q = q->next;
}
}
return 0;
}
int FindNum3(ProcessNode &p,int num)
{//找到进程号为num的进程并且满足请求
ProcessNode q = p->next;
while(q != NULL)
{
if(q->processID == num)
{
q->attitude = 1;
cout<<"进程P"<<q->processID<<"请求成功满足."<<endl;
return 1;
}
else
q = q->next;
}
return 0;
}
int FindNum4(ProcessNode &p,int num)
{//找到进程号为num的进程并且满足请求
ProcessNode q = p->next;
while(q != NULL)
{
if(q->processID == num)
{
q->attitude = 5;
cout<<"进程P"<<q->processID<<"被杀死."<<endl;
return 1;
}
else
q = q->next;
}
return 0;
}
void HungUp(ProcessNode &p)
{
int num;
do
{
cout<<"请输入要挂起的进程号:";
cin>>num;
}while(FindNum(p,num) != 1);
Display1(p);
}
void FreeHungUp(ProcessNode &p)
{
int num;
do
{
cout<<"请输入要解挂的进程号:";
cin>>num;
}while(FindNum1(p,num) != 1);
Display1(p);
}
void Amend(ProcessNode &p)
{
int num;
do
{
cout<<"请输入要修改的进程号:";
cin>>num;
}while(FindNum2(p,num) != 1);
Display1(p);
}
void SatisfyWait(ProcessNode &p)
{
int num;
do
{
cout<<"请输入要满足的进程号:";
cin>>num;
}while(FindNum3(p,num) != 1);
Display1(p);
}
void ScanRun(ProcessNode &p)
{
ProcessNode q = p->next;
while(q != NULL)
{
if(q->attitude == 2)
{
q->attitude = 6;
}
else
q = q->next;
}
}
void ScanReady(ProcessNode &p)
{
ProcessNode q = p->next;
while(q != NULL)
{
if(q->attitude == 1)
{
q->attitude = 2;
}
else
q = q->next;
}
cout<<"就绪队列为空,请满足等待进程."<<endl;
}
void OrderingRun(ProcessNode &p)
{
ScanRun(p);
ScanReady(p);
Display1(p);
}
void KillProcess(ProcessNode &p)
{
int num;
do
{
cout<<"请输入要杀死的进程号:";
cin>>num;
}while(FindNum4(p,num) != 1);
Display1(p);
}
int main()
{
int i = 0;
ProcessNode p;
cout<<"进程状态:0:等待;1:就绪;2:执行."<<endl;
cout<<"******************************"<<endl;
Build(p);
Display1(p);
while(i != 8)
{
cout<<"1,创建新进程.2,挂起.3,解挂.4,修改优先级."<<endl;
cout<<"5.满足等待进程请求.6,按优先级执行.7,杀死进程.8,退出."<<endl;
cout<<"请选择功能:";
cin>>i;
cout<<"*****************************"<<endl;
switch(i)
{
case 1:BuildNew(p);break;
case 2:HungUp(p);break;
case 3:FreeHungUp(p);break;
case 4:Amend(p);break;
case 5:SatisfyWait(p);break;
case 6:OrderingRun(p);break;
case 7:KillProcess(p);break;
case 8:i = 8;break;
}
}
return 0;
}
评论0
最新资源