1、链表操作:实现链表队列的初始化和输出。
//stu00.c 作业初始化及输出基本操作,程序模板,由学生完成缺失代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TASK_COUNT 5
int iArrivePoint[TASK_COUNT] = { 0,1,2,3,4 };
int iTaskLen[TASK_COUNT] = { 4,3,5,2,4 };
char cPname[TASK_COUNT] = { 'A','B','C','D','E' };
//PCB节点链的定义
typedef struct _Pcb {
int pid; //进程ID
int arriveP; //到达时间点
int taskLen; //任务总时长
int beginP; //任务开始时间点
int finishP; //任务完成时间点
int remains; //未执行的时长
char cPname;//进程名称
int priority; //优先级
struct _Pcb * next;
}PCB;
//初始化PCB队列
PCB* InitPcbQue()
{
PCB* headOfPcb = NULL;
PCB* curPcbNode;
int i, indexP;
//**************begin**********代码约十二行********/
//在循环结构中创建节点并加入到链表中
//最终链表中进程顺序为A、B、C、D、E
for (i = 0; i < TASK_COUNT; i++)
{
curPcbNode = (PCB*)malloc(sizeof(PCB));
indexP = TASK_COUNT - i - 1;
curPcbNode->pid = indexP;
curPcbNode->arriveP = iArrivePoint[indexP];
curPcbNode->taskLen = iTaskLen[indexP];
curPcbNode->remains = iTaskLen[indexP];
curPcbNode->cPname = cPname[indexP];
curPcbNode->finishP=0;
curPcbNode->next = headOfPcb;
headOfPcb = curPcbNode;
}
///***********************end*****************/
return headOfPcb;
}
//输出链表信息
void PrintPcbQue(PCB* headPcb)
{
PCB* curPcb;
curPcb = headPcb;
//不能直接使用headPcb节点输出,会改变链表结构
/**************begin**********代码约五行********/
//在循环结构中输出节点信息
//输出:A:4,B:3,C:5,D:2,E:4,
while(curPcb!=NULL)
{
printf("%C:%d,", curPcb->cPname, curPcb->taskLen);
curPcb = curPcb->next;
}
//***********************end*****************/
return;
}
//清空队列
void ClearPcbQue(PCB* headPcb)
{
PCB* onePcb;
//**************begin**********代码约五行********
//在循环结构中释放节点内存
while(headPcb!=NULL){
onePcb=headPcb;
headPcb=headPcb->next;
free((void*)onePcb);
}
//***********************end*****************/
}
int main()
{
PCB * pHead=NULL;
pHead=InitPcbQue();
PrintPcbQue(pHead);
ClearPcbQue(pHead);
return 0;
}
2、先来先服务:编写模拟进程调度的先来先服务程序
//stu01.c FCFS进程调度算法,程序模板,由学生完成缺失代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TASK_COUNT 5
int iArrivePoint[TASK_COUNT] = { 0,1,2,3,4 };
int iTaskLen[TASK_COUNT] = { 4,3,5,2,4 };
char cPname[TASK_COUNT] = { 'A','B','C','D','E' };
//PCB节点链的定义
typedef struct _Pcb {
int pid; //进程ID
int arriveP; //到达时间点
int taskLen; //任务总时长
int beginP; //任务开始时间点
int finishP; //任务完成时间点
int remains; //未执行的时长
char cPname;//进程名称
int priority; //优先级
struct _Pcb * next;
}PCB;
//初始化PCB队列
PCB* InitPcbQue()
{
PCB* headOfPcb = NULL;
PCB* curPcbNode;
int i, indexP;
for (i = 0; i < TASK_COUNT; i++)
{
curPcbNode = (PCB*)malloc(sizeof(PCB));
//注意链表操作时最先入链的会排在最后。
indexP = TASK_COUNT - i - 1;
curPcbNode->pid = indexP;
curPcbNode->arriveP = iArrivePoint[indexP];
curPcbNode->taskLen = iTaskLen[indexP];
curPcbNode->remains = iTaskLen[indexP];
curPcbNode->cPname = cPname[indexP];
curPcbNode->next = headOfPcb;
headOfPcb = curPcbNode;
}
//printf("InitPcbQue finished.\n");
return headOfPcb;
}
//输出链表信息
void PrintPcbQue(PCB* headPcb)
{
PCB* curPcb;
curPcb = headPcb;
//不能直接使用headPcb节点输出,会改变链表结构
while (curPcb != NULL)
{
printf("%C:%d,", curPcb->cPname, curPcb->finishP);
curPcb = curPcb->next;
};
return;
}
//清空队列
void ClearPcbQue(PCB* headPcb)
{
PCB* onePcb;
while (headPcb != NULL)
{
onePcb = headPcb;
headPcb = headPcb->next;
free((void *)onePcb);
}
}
PCB* headInitPcb;
int FCFS()
{ //先来先服务
//请在begin end语句间补全程序语句实现短作业优行算法调度进程
//* begin *******************程序代码约11行******************************* */
//对进程序列进行排序
int totalTaskLen = 0;
headInitPcb &