题目
① 任务由任务号、任务产生时间、任务时长、任务开始处理和任务处理完成时间等信息组成;
② 任务由系统随机产生;任务产生后按产生的顺序排队等候处理。可设*平均*每5分钟(并非每隔5分名钟)产生一个新任务,任务时长为1~10分钟范围内。
③ 系统将依次处理排队等候的任务。
④ 系统运行超过一定时间后将停止产生新任务;
⑤ 按任务处理顺序,输出处理后的任务信息。
解答
实现链式队列 < LinkQueue.h>
#include<malloc.h> #include<stdio.h> //元素 typedef struct { int Num; double GenTime;//产生时间 double DurTime;//时长 double StaTime;//开始时间 double EndTime;//结束时间 }Task; typedef Task ElemType; //链队结点的类型定义 typedef struct node { ElemType data; //存放元素 struct node* next; //下一个结点指针 }DataNode; //链队的类型定义 typedef struct { DataNode* front; //指向队首结点 DataNode* rear; //指向队尾结点 }LinkQueue; //初始化队列 void InitQueue(LinkQueue*& q) { q = (LinkQueue*)malloc(sizeof(DataNode)); //为队列申请了一个结点大小的地址空间 q->front = q->rear = NULL; } //销毁队列 void DestroyQueue(LinkQueue*& q) { DataNode* pre = q->front, * p; //pre指向队首结点 if (pre != NULL) { p = pre->next; //首结点后移 while (p != NULL) //删除结点 { free(pre); //原来的首结点删除 pre = p; p = pre->next;//pre、p同步后移 } free(pre); //释放最后一个数据结点 } free(q); //释放链队结点 } //判断队列是否为空 bool QueueEmpty(LinkQueue* q) { return(q->rear == NULL); } //进队列 void enQueue(LinkQueue*& q, ElemType e) { DataNode* p = NULL;//建好结点 p = (DataNode*)malloc(sizeof(DataNode));//为其分配地址空间 p->data = e;//存好数据 p->next = NULL; if (q->rear == NULL) //若链队为空,置为队首和队尾 q->front = q->rear = p; else //若链队不空 置为队尾 { q->rear->next = p; q->rear = p; } } //出队列 bool deQueue(LinkQueue*& q, ElemType e) { DataNode* t; if (q->rear == NULL) //原来队列为空 return false; //有,则先处理(工作对接) t = q->front; //t指向首结点 if (q->front == q->rear) //原来队列中只有一个数据结点时 q->front = q->rear = NULL; else //原来队列中有两个或两个以上结点时 q->front = q->front->next;//队首出列 //再释放(辞职) e = t->data; free(t); return true; }
随机任务排队
#include "LinkQueue.h" #include <stdlib.h> #include <iostream> using namespace std; #define random(a,b) a+rand()/double(RAND_MAX/(b-a)) //产生任务 LinkQueue*& GenTask(LinkQueue*& q,double t) { double k=t; double i=12,j=1,s=k; for (i=0;i<k;i=i+random(4.5,5.5)) { ElemType e; e.Num=j++; e.GenTime=i; e.StaTime=s; e.DurTime=random(1,10); cout<<"时刻:"<<e.GenTime<<"分,系统产生任务"<<e.Num<<",该任务时长为"<<e.DurTime<<"分钟\n"; e.EndTime=s+e.DurTime; s=s+e.DurTime; enQueue(q, e); } return q; } //处理任务 LinkQueue*& ProTask(LinkQueue*& q) { while(!QueueEmpty(q)){ ElemType e=q->front->data; deQueue(q, e); cout<<"时刻:"<<e.StaTime<<"分,系统开始处理任务"<<e.Num<<",时刻"<<e.EndTime<<"处理完成\n"; cout<<"-------------------------------------------------------------\n"; cout<<"任务号:"<<e.Num<<endl <<"产生时间:"<<e.GenTime<<endl <<"任务时长:"<<e.DurTime<<endl <<"开始处理时间"<<e.StaTime<<endl <<"处理完成时间"<<e.EndTime<<endl; cout<<"-------------------------------------------------------------\n"; } }
测试
int main(){ LinkQueue* TaskQueue; InitQueue(TaskQueue); cout<<"随机任务排队问题\n"; double t; cout<<"请输入系统产生任务的时长:(单位:分钟)\n"; cin>>t; cout<<endl; cout<<"/**********系统产生任务**********/" <<endl<<endl; GenTask(TaskQueue,t); cout<<endl; cout<<"/**********系统处理任务**********/" <<endl<<endl; ProTask(TaskQueue); cout<<("系统已经处理完所有生成的任务!\n"); DestroyQueue(TaskQueue); return 0; }
运行截图