题目
① 任务由任务号、任务产生时间、任务时长、任务开始处理和任务处理完成时间等信息组成;
② 任务由系统随机产生;任务产生后按产生的顺序排队等候处理。可设*平均*每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;
}
运行截图