#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
#define MaxNum 100
int ArrivalTime[MaxNum]; //到达时间
int ServiceTime[MaxNum]; //服务时间
int FinishTime[MaxNum]; //完成时间
int WholeTime[MaxNum]; //周转时间
double WeightWholeTime[MaxNum]; //带权周转时间
double AverageWT_SJF; //SJF算法的平均周转时间
double AverageWWT_SJF; //SJF算法的平均带权周转时间
bool isFinished_SJF[MaxNum];
static int n;
struct RR{
// 进程名称
char name[10];
// 到达时间
int daodatime;
// 服务时间
int fuwutime;
// 剩余时间
int shengyutime;
// 所处状态
char *state;
struct RR *next;
};
// 根据到达时间从小到大排序
struct RR *input()
{
int N, i;
// 定义队首、队尾
struct RR *head, *rear;
// p是队尾指针,q是队首指针,t是执行时间
struct RR *p, *q, *t;
// 初始化队首和队尾为空
head = rear = NULL;
printf("请输入进程数目:");
scanf("%d", &N);
for(i = 0; i < N; i++)
{
// 初始化一个空间给进程
p = (struct RR *)malloc(sizeof(struct RR));
printf("请输入第%d个进程的名字、到达时间、服务时间(例如:1 2 1):\n", i+1);
scanf("%s%d%d", p->name, &p->daodatime, &p->fuwutime);
p->shengyutime = p->fuwutime;
p->state = "就绪";
p->next = NULL;
// 当输入结束时,把p的数据放到队首,以便下一步执行
if(rear == NULL)
{
head = p;
p->next = NULL;
rear = p;
}
// 否则执行时间为空,队首变成q
else
{
t = NULL;
q = head;
// 当q和q的到达时间小于p的到达时间时,把执行时间给q
while(q && q->daodatime < p->daodatime)
{
t = q;
q = q->next;
}
// 当q是队首时,则下一个队首变成p,以便每个进程都能够得到时间片
if(q == head)
{
p->next = head;
head = p;
}
// 当执行时间片到达队尾时(执行完成),返回给队首p
else if(t == rear)
{
rear->next = p;
p->next = NULL;
rear = p;
}
// 否则给队首p占用执行时间,p执行完后到q
else
{
t->next = p;
p->next = q;
}
}
#include <iomanip>
#include <vector>
using namespace std;
#define MaxNum 100
int ArrivalTime[MaxNum]; //到达时间
int ServiceTime[MaxNum]; //服务时间
int FinishTime[MaxNum]; //完成时间
int WholeTime[MaxNum]; //周转时间
double WeightWholeTime[MaxNum]; //带权周转时间
double AverageWT_SJF; //SJF算法的平均周转时间
double AverageWWT_SJF; //SJF算法的平均带权周转时间
bool isFinished_SJF[MaxNum];
static int n;
struct RR{
// 进程名称
char name[10];
// 到达时间
int daodatime;
// 服务时间
int fuwutime;
// 剩余时间
int shengyutime;
// 所处状态
char *state;
struct RR *next;
};
// 根据到达时间从小到大排序
struct RR *input()
{
int N, i;
// 定义队首、队尾
struct RR *head, *rear;
// p是队尾指针,q是队首指针,t是执行时间
struct RR *p, *q, *t;
// 初始化队首和队尾为空
head = rear = NULL;
printf("请输入进程数目:");
scanf("%d", &N);
for(i = 0; i < N; i++)
{
// 初始化一个空间给进程
p = (struct RR *)malloc(sizeof(struct RR));
printf("请输入第%d个进程的名字、到达时间、服务时间(例如:1 2 1):\n", i+1);
scanf("%s%d%d", p->name, &p->daodatime, &p->fuwutime);
p->shengyutime = p->fuwutime;
p->state = "就绪";
p->next = NULL;
// 当输入结束时,把p的数据放到队首,以便下一步执行
if(rear == NULL)
{
head = p;
p->next = NULL;
rear = p;
}
// 否则执行时间为空,队首变成q
else
{
t = NULL;
q = head;
// 当q和q的到达时间小于p的到达时间时,把执行时间给q
while(q && q->daodatime < p->daodatime)
{
t = q;
q = q->next;
}
// 当q是队首时,则下一个队首变成p,以便每个进程都能够得到时间片
if(q == head)
{
p->next = head;
head = p;
}
// 当执行时间片到达队尾时(执行完成),返回给队首p
else if(t == rear)
{
rear->next = p;
p->next = NULL;
rear = p;
}
// 否则给队首p占用执行时间,p执行完后到q
else
{
t->next = p;
p->next = q;
}
}