• 借用一下界面


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

  • 相关阅读:
    使用SQL语句对表进行分页查询
    [转]Message Crack Wizard for Win32 SDK Developer
    笔记——《C语言也能干大事》之对话框程序代码
    如何通过C#调用CHM帮助文件,显示到指定页面
    winform 数字输入控件初稿
    用JAVA在读取EXCEL文件时如何判断列隐藏
    css中height:100%不起作用的解决方法 项目个案
    枚举(enum)的常用操作
    转 VirtualBox“please use a kernel appropriate for your cpu”
    Asp.NET导出Excel文件乱码 终极解决方法
  • 原文地址:https://www.cnblogs.com/Jstyle-continue/p/6352027.html
Copyright © 2020-2023  润新知