📄 asd.cpp
字号:
#include<iostream>
using namespace std;
typedef struct QNode{ //队列的定义
char data;
struct QNode *next;
}*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
LinkQueue ready; //实例化队列
QueuePtr p,q,t,l;
LinkQueue block;
char r=NULL; //以一个字符r表示处于运行态的进程,并且开始时此进程为空
void InitQueue(LinkQueue &Q,char c) //建立一个不带头节点的队列
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)exit(0);
Q.front->data=c;
Q.front->next=NULL;
}
void EnQueue(LinkQueue &Q,char c) //节点值插入队列
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(0);
p->data=c;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
//-----------------------------------------------------------------
int OUTPUT(LinkQueue &Q) //队列元素输出
{ q=Q.front; //指针保护
if(Q.front->data==NULL)
{cout<<"-----当前队列中已没有进程!-----"<<endl;}
else {
while(Q.front!=Q.rear->next)
{cout<<Q.front->data<<" ";
Q.front=Q.front->next;
}
Q.front=q; //恢复指针
cout<<endl;
}
if(r==NULL){
cout<<"-----当前运行态中没有进程!-----"<<endl;
cout<<"----------------------------------------------"<<endl;
return 0;}
else{
cout<<"当前运行态中进程为:"<<r<<endl;
cout<<"----------------------------------------------"<<endl;}
}
//----------------------------------------------------------------------
int runover(char &r) //执行运行态中的进程
{if(r!=NULL){
cout<<"-----运行态中当前进程“"<<r<<"”执行完毕!-----"<<endl;
cout<<"----------------------------------------------"<<endl;
r=NULL;}
else {cout<<"-----运行态中没有进程!-----"<<endl;
cout<<"----------------------------------------------"<<endl;
return 0;}
}
//-----------------------------------------------------------------
void RDY_RUN(LinkQueue &Q) //就绪=>运行
{cout<<"-----进程状态转换为::就绪=>运行-----"<<endl;
r=Q.front->data; //进程进入执行态
p=Q.front->next;
q=Q.front;
while(p!=NULL){ //就绪队列元素前移一个位置
q->data=p->data;
Q.rear=q;
p=p->next;
q=q->next;
}
Q.rear->next->data=NULL;
cout<<"当前就绪队列中进程为:";
OUTPUT(Q); //将新就绪队列元素输出
}
//---------------------------------------------------------------------
void RUN_RDY(LinkQueue &Q) //运行=>就绪
{cout<<"-----进程状态转换为::运行=>就绪-----"<<endl;
p=Q.front;
while(p->data!=NULL)
{ p=p->next;}
p->data=r; //运行态中进程进入就绪队列尾部
Q.rear=Q.rear->next;
r=Q.front->data; //就绪队列头进程进入运行态
if( Q.front!=Q.rear){
p=Q.front->next;
q=Q.front;
while(p!=NULL){ //就绪队列元素前移一个位置
q->data=p->data;
Q.rear=q;
p=p->next;
q=q->next;
}
Q.rear->next->data=NULL;
cout<<"当前就绪队列中进程为:";
OUTPUT(Q); //将新就绪队列元素输出
}
}
//-----------------------------------------------------------------------
int BLK_RDY(LinkQueue &B,LinkQueue &R) //等待=>就绪
{cout<<"-----进程状态转换为::等待=>就绪-----"<<endl;
l=B.front;
if(B.front->data==NULL){
cout<<"等待队列中没有进程,无法完成操作!"<<endl;
cout<<"----------------------------------------------"<<endl;
return 0;
}
t=R.front;
while(t->data!=NULL){
t=t->next;
if(t==NULL){
cout<<"就绪队列为满,不能完成转换!"<<endl;
cout<<"----------------------------------------------"<<endl;
return 0;
}
}
t->data=l->data; //插入就绪队列尾部
R.rear=t;
cout<<"当前就绪队列中进程为:";
OUTPUT(R); //将新就绪队列元素输出
p=B.front->next;
q=B.front;
while(p!=NULL){ //等待队列元素前移一个位置
q->data=p->data;
B.rear=q;
p=p->next;
q=q->next;
}
B.rear->next->data=NULL;
cout<<"当前等待队列中进程为:";
OUTPUT(B); //将新等待队列元素输出
}
//-----------------------------------------------------------------------
int RUN_BLK(LinkQueue &B,LinkQueue &R) //运行=>等待
{cout<<"-----进程状态转换为::运行=>等待-----"<<endl;
l=B.front;
while(l->data!=NULL){
l=l->next;
if(l==NULL){
cout<<"等待队列为满,不能完成转换!"<<endl;
return 0;
}
}
l->data=r;
B.rear=l;
r=NULL;
cout<<"当前等待队列中进程为:";
OUTPUT(B); //将新等待队列元素输出
t=R.front;
if(t->data==NULL){
cout<<"当前就绪队列为空,无法完成操作!"<<endl;
cout<<"----------------------------------------------"<<endl;
return 0;
}
else {r=R.front->data;
p=R.front->next;
q=R.front;
while(p!=NULL){ //就绪队列元素前移一个位置
q->data=p->data;
R.rear=q;
p=p->next;
q=q->next;
}
R.rear->next->data=NULL;
cout<<"当前就绪队列中进程为:";
OUTPUT(R);
}
}
//-----------------------------------------------------------------------
void initiate() //队列初始化
{int i,n;
char data;
cout<<"请输入就绪队列元素个数:";
cin>>n;
cout<<"请输入该队列元素内容:";
cin>>data;
InitQueue(ready,data); //队列不存在空的头节点
for(i=2;i<=n;i++)
{cin>>data;
EnQueue(ready,data);
}
cout<<"就绪队列中进程输出为:";
OUTPUT(ready); //调用子函数输出队列元素
cout<<"请输入等待队列元素个数:";
cin>>n;
cout<<"请输入该队列元素内容:";
cin>>data;
InitQueue(block,data); //队列不存在空的头节点
for(i=2;i<=n;i++)
{cin>>data;
EnQueue(block,data);
}
cout<<"等待队列中进程输出为:";
OUTPUT(block); //调用子函数输出队列元素
}
//==================================================================
void main()
{char w;
cout<<endl;
cout<<" ********************"<<endl;
cout<<" *进程状态转换控制台*"<<endl;
cout<<" ********************"<<endl;
cout<<" ======计0306,20032969,曾庚卓"<<endl;
cout<<" ***********************************************************"<<endl;
cout<<" 1===>>队列初始化 2===>>执行运行态进程 3===>>就绪=>运行"<<endl;
cout<<" 4===>>运行=>就绪 5===>>等待=>就绪 6===>>运行=>等待 "<<endl;
cout<<" ***********************************************************"<<endl;
cout<<"Press enter to continue,if you want to exit please press Q"<<endl;
getchar();
do
{
cout<<"请按键选择:";
cin>>w;
switch(w)
{case '1':initiate();break;
case '2':runover(r);break;
case '3':RDY_RUN(ready);break;
case '4':RUN_RDY(ready);break;
case '5':BLK_RDY(block,ready);break;
case '6':RUN_BLK(block,ready);break;
}}
while(w!='Q');
cout<<" -----------结束任务!-------------"<<endl;
}
//==================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -