#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
/*****************************************************************************************************************
Question:
设计一个按优先数调度算法实现处理器调度的程序。
输入 (程序名+总运行时间+优先级),输入为 0 结束
InPut: P1 2 1
P2 3 5
P3 1 3
P4 2 4
P5 4 2
0
*****************************************************************************************************************/
typedef struct Node
{
string name;
int leval; //优先数
int time; //总运行时间
int LeftTime; //剩余运行时间
char now; //状态 R表示就绪态,E表示结束态
Node *next;
}*LinkList;
LinkList creat() //创建链表
{
LinkList l;
l=new(Node); //当结构体里面有 string 字符串类型的数据时,必须用 new 来分配空间,不能用malloc.
l->next=NULL;
Node *r,*s;
int flag=1;
r=l;
while(flag)
{
string Name;
int Time,Leval;
cin>>Name;
if(Name != "0"){
cin>>Time>>Leval; //每次运行进程之前确定进程的 <优先级>和<运行时间>
s=new(Node);
s->name=Name;
s->time=Time;
s->leval=Leval;
s->LeftTime=Time; //剩余运行时间初始化为总运行时间
s->now='R'; //进程状态初始化为 R (就绪状态)
r->next=s;
r=s;
//cout<<"Name: "<<r->name<<" Time: "<<r->time<<" Leval: "<<r->leval<<endl;
}
else{
flag=0;
r->next=NULL;
}
}
return l;
}
void order(LinkList l) //根据优先级进行排序 思路:冒泡排序
{
int length=0;
Node *r,*L,*p;
p=l;
L=l;
r=l;
while(r->next != NULL){
r=r->next;
length++;
}
r=L->next;
for(int i = 1;i < length;i ++){
for(int j = 0;j <= length-i; j ++){
//cout<<"r->leval: "<<r->leval<<" L->next->leval: "<<L->next->leval<<endl;
if(r->leval > L->next->leval){
p->next=r->next;
r->next=L->next;
L->next=r;
r=p; //注意:找到符合条件的结点时。r-next 指向了 头结点->next。
//所以重新复制为: p结点(保存的r结点)
}
p=r;
r=r->next;
}
L=L->next; //这两个语句是核心!
r=L->next;
}
}
void Output(LinkList l)
{
Node *r;
r=l;
cout<<"****************************************"<<endl;
while(r->next != NULL){
r=r->next;
cout<<"Name:"<<r->name<<" LeftTime:"<<r->LeftTime<<" Leval:"<<r->leval<<" Now:"<<r->now<<" *"<<endl;
}
cout<<"****************************************"<<endl;
cout<<endl;
}
void Run(LinkList l)
{
Node *r;
r=l;
while(r->next != NULL && r->next->LeftTime != 0){ //好坑啊!这里!如果把两个判断语句调换顺序。程序就会崩。
//理由:程序会先判断 r->next->LeftTime != 0 这个语句。
//但是最后一个结点即 r->next->LeftTime 没有空间
//因此无法判断,程序崩溃。判断语句一定要可判断的语句才可以
cout<<"当前运行的程序名为:"<<r->next->name<<endl;
r->next->leval --;
r->next->LeftTime --;
if(r->next->LeftTime == 0){
cout<<"该程序运行结束,退出进程"<<endl;
r->next->now = 'E';
l->next=r->next->next;
}
cout<<"运行后的进程块为:"<<endl;
order(l); //先排序,后输出!
Output(l);
r=l;
}
}
int main()
{
LinkList L; //链表头指针,指向第一个结点
cout<<"创建链表"<<endl;
L=creat();
Output(L);
cout<<"排序后的链表"<<endl;
order(L);
Output(L);
cout<<"进程启动后的链表"<<endl;
cout<<endl;
Run(L);
cout<<"所有程序运行结束!"<<endl;
return 0;
}