借用一下界面

来源:互联网 发布:思锐汽修软件 编辑:程序博客网 时间:2024/04/30 13:15
#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;}

0 0