借用一下界面

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

posted on 2016-04-08 13:41  Jstyle  阅读(125)  评论(0编辑  收藏  举报

导航