#include#defineMAX100typedef struct PCB
{
charProName[10];
//作业ID
floatArriveTime;
//到达时刻
floatFun_time;
//运行时间
floatEndTime;
//完成时间
floatrevolveTime;
//周转时间
intOrder;
//优先标记
} list,*linklist;
void sjf(linklist p,int count)
{
list item;
//结构体变量
int i = 0;
int j = 0;
int k = 0;
//最短运行时间作业的下标
int flag = 0;
//优先级设置
float min = 0;
//最短运行时间
float temp;
//开始的时刻temp = p[0].ArriveTime;
//开始的时刻为第一个到达的时间//先求出最先到达作业的时刻
for(i = 0;
i < count;
i++)
{
if(temp > p[i].ArriveTime)
{
temp = p[i].ArriveTime;
//保存最先到达的作业的时刻
k = i;
//最先到达的作业的下标,默认为p[0]
}
}for(i = 0;
i < count;
i++)
{
p[k].Order = ++flag;
//设置优先级为1,最高优先级
p[k].EndTime= temp + p[k].Fun_time;
p[k].revolveTime= p[k].EndTime - p[k].ArriveTime;
min = 100;
temp = p[k].EndTime;
//后一个作业的开始时刻是前一个作业的完成时刻for(j = 0;
j < count;
j++)
{
if(p[j].Order != 0 || temp - p[j].ArriveTime <= 0)//跳过不满足条件的(已设置优先级的 和 到达时刻要晚于前一个作业的完成时刻的)
continue;
if(min > p[j].Fun_time)
{
min = p[j].Fun_time;
k = j;
//求出满足条件最短运行时间的作业的下标
}
}
}for(i = 1;
i < count;
i++)//按优先级排序
{
item = p[i];
j = i-1;
while(item.Order < p[j].Order && j >= 0)
{
p[j+1] = p[j];
//order越小优先级越高,小的往前移
--j;
}
p[j+1] = item;
}return;
}//输出各个作业的详细信息
void print(linklist p,int count)
{
int i;
printf("ID\t到达\t服务\t完成\t周转\n");
for(i = 0;
i < count;
i++)
{
printf("%s\t%.0f\t%.0f\t%.0f\t%.0f\n",
p[i].ProName,p[i].ArriveTime,p[i].Fun_time, p[i].EndTime,p[i].revolveTime);
}return;
}int main()
{
list st[MAX];
//最多可以一百个作业
int num = 0;
//作业数量int i = 0;
printf("请输入作业数量:");
scanf("%d",&num);
printf("请输入作业ID,到达时间,运行时间:\n");
for(i=0;
i
【SJF】
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔