完整代码+模拟进程管理
目录
PriorSeqQueue.h
#pragma once
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct
{
int prior;
ElemType elem;
}DataType;
typedef struct
{
DataType queue[MaxSize];
int size;
}PSQueue;
//初始化队列
void PriorSeqQueueInitiate(PSQueue* Q)
{
Q->size = 0;
}
//非空否
int PirorSeqQueueNotEmpty(PSQueue Q)
{
if (Q.size <= 0)
{
return 0;
}
else
{
return 1;
}
}
//入队列
int PriorSeqQueueAppend(PSQueue* Q,DataType x)
{
if (Q->size >= MaxSize)
{
printf("队列已满,无法插入");
return 0;
}
else
{
Q->queue[Q->size] = x;
Q->size++;
return 1;
}
}
//出队列,优先级高的先出,优先级相同时排在队伍前面的元素先出
int PriorSeqQueueDelete(PSQueue* Q, DataType* d)
{
DataType min;//存储优先级最高的元素
int minIndex; //优先级最高的元素的下标
int i;
if (Q->size <= 0)
{
printf("队列为空,无法出队列");
return 0;
}
else
{
min = Q->queue[0];//开始时选queue[0]作为优先级最高的元素
minIndex = 0;//优先级最高的元素下标先记为0
for (i = 1; i < Q->size; i++)
{
//如果遍历到的元素比min优先级高,则当前遍历元素作为新的min
if (Q->queue[i].prior < min.prior)
{
min = Q->queue[i];
minIndex = i;
}
}
*d = Q->queue[minIndex];
//元素依次前移
for (i = minIndex + 1; i < Q->size; i++)
{
Q->queue[i-1] = Q->queue[i];
}
Q->size--;
return 1;
}
}
//取元素,按优先级高的先出、优先级相同时排在队伍前面的元素先出的原则,取元素的值
int PriorSeqQueueGet(PSQueue* Q, DataType* d)
{
DataType min;
int minIndex, i;
//如果当前队列为空
if (Q->size <= 0)
{
printf("当前队列为空,无元素可取");
return 0;
}
//如果当前队列不为空
else
{
min = Q->queue[0];//开始时选queue[0]作为优先级最高的元素
minIndex = 0;//优先级最高的元素下标先记为0
for (i = 1; i < Q->size; i++)
//如果遍历到的元素比min优先级高,则当前遍历元素作为新的min
{
if (Q->queue[i].prior < min.prior)
{
min = Q->queue[i];
minIndex = i;
}
}
*d = Q->queue[minIndex];
return 1;
}
}
SimulateManger.c
/*设计一个程序模仿操作系统的进程管理问题。进程服务按优先级高的先服务,优先级相同先到先服务的原则管理
.设文件task.dat中存放了仿真进程服务请求数据,其中第一列表示进程的任务号,第二列表示任务的优先级
文件task.dat中的仿真进程服务请求数据如下:
1 30
2 20
3 40
4 20
5 0
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElemType;
#define MaxSize 100
#include"PriorSeqQueue.h"
void main()
{
PSQueue myQueue;
FILE* fp;//文件指针类型
DataType task;
int i;
if ((fp = fopen("task.dat", "r")) == NULL)
{
printf("文件不能打开");
exit(0);
}
else
{
PriorSeqQueueInitiate(&myQueue);
while (!feof(fp))
{
fscanf_s(fp, "%d %d", &task.elem, &task.prior);//读数据
PriorSeqQueueAppend(&myQueue, task);//把数据入队列
}
i = 1;
printf("序号 任务 优先级\n");
while (PirorSeqQueueNotEmpty(myQueue))
{
PriorSeqQueueDelete(&myQueue, &task);
printf("%d ", i);
printf("%d ", task.elem);
printf("%d ", task.prior);
i++;
}
}
}