——————————————————————————————————头文件———————————————————————————————————
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _SCHEDULING_H__
#define _SCHEDULIHG_H__
#define N 5
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
typedef struct PCB //封装进程结构体
{
char name[2];
int time;
int prior_num;
char state;
struct PCB *next;
}PCB, *pPCB; //结构体名为PCB,pPCB是指向结构体的指针
pPCB CreateLink(PCB *arr); //创建链表把5个进程链起来
void InitPCB(PCB *arr,int *a); //初始化进程
pPCB runPCB(PCB *arr, pPCB pcb); //进程运行
void printPCB(PCB *arr); //输出进程的初始状态
void random(int a[], int n); //将数组内容打乱顺序
void PrintRun(pPCB head); //输出运行后的进程
#endif
——————————————————————————————————函数实现—————————————————————————————————
#include"head.h"
void random(int a[], int n)
{
int index, tmp, i;
srand((unsigned int)time(NULL));
for (i = 0; i <n; i++)
{
index = rand() % (n - i) + i;
if (index != i)
{
tmp = a[i];
a[i] = a[index];
a[index] = tmp;
}
}
}
pPCB CreateLink(PCB *arr)
{
int i = 0;
int j = 0;
int pos = 0;
int pos1 = 0;
pPCB head = NULL;
for (i = 0; i < N; i++) //先找出优先级最高的进程,赋给头结点
{
if (arr[i].prior_num == N)
{
pos = i;
break;
}
}
head = &arr[pos];
for (i = N - 1; i > 0; i--) //按优先级大小依次找到其他进程,链起来
{
for (j = 0; j < N; j++)
{
if (arr[j].prior_num == i)
{
pos1 = j;
break;
}
}
arr[pos].next = &arr[pos1];
pos = pos1;
}
return head; //返回头结点
}
void InitPCB(PCB *arr,int *a)
{
int i = 0;
char *str[] = { "p1", "p2", "p3", "p4", "p5" };
for (i = 0; i < N; i++) //将5个进程初始化
{
strcpy(arr[i].name, str[i]);
arr[i].prior_num = a[i];
arr[i].state = 'R';
arr[i].next = NULL;
arr[i].time = (rand() % 4) + 1; //这里将所需运行时间控制在4以内
}
}
void printPCB(PCB *arr) //打印进程最初状态
{
int i = 0;
for (i = 0; i < N; i++)
{
printf("进程名称:%s\n", arr[i].name);
printf("进程优先级:%d\n", arr[i].prior_num);
printf("进程所需运行时间:%d\n", arr[i].time);
printf("进程当前状态:%c\n", arr[i].state);
printf("\n");
}
}
pPCB runPCB(pPCB head, pPCB pcb) //进程执行函数
{
int i = 0;
pPCB cur=head;
pPCB prev = NULL;
while (cur)
{
cur->time--; //先让进程的时间和优先级减一
cur->prior_num--;
if (cur->time == 0) //判断所需运行时间是否为0
{
if (cur == head) //判断是否是头结点
{
cur->state = 'E';
head = head->next;
cur = head;
}
else
{
cur->state = 'E';
prev->next = cur->next;
cur = cur->next;
}
}
else //若时间不为0,指针向后移动
{
prev = cur;
cur = cur->next;
}
}
return head;
}
void PrintRun(pPCB head)
{
pPCB cur = head;
printf("进程运行:\n");
while (cur)
{
printf("进程名称:%s\n", cur->name);
printf("进程优先级:%d\n", cur->prior_num);
printf("所需运行时间:%d\n", cur->time);
printf("当前状态:%c\n", cur->state);
printf("\n");
cur = cur->next;
}
}
——————————————————————————————————主函数—————————————————————————————————
#include"head.h"
int main()
{
PCB pcb;
pPCB head;
int a[] = { 1, 2, 3, 4, 5 };
random(a, N);
PCB arr[N];
InitPCB(arr,a);
printPCB(arr);
head = CreateLink(arr);
printf("运行一次:\n");
head = runPCB(head, &pcb);
PrintRun(head);
printf("运行二次:\n");
head = runPCB(head, &pcb);
PrintRun(head);
printf("运行三次:\n");
head = runPCB(head, &pcb);
PrintRun(head);
getchar();
return 0;
}