数据结构学习笔记(9)顺序优先级队列

完整代码+模拟进程管理

目录

PriorSeqQueue.h

SimulateManger.c


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++;
		}
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值