#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; }