/*
优先队列:有队列容量
但多了个优先权
**优先队列只需要在出队时有优先选择权就够了,入队时不需要**
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
/*数据由两部分组成:数据本身+权值(关键字)*/
struct data
{
int priority; //权值
int element; //数据本身
};
//对列
struct priQueue
{
int sizeQueue;//对列当前的元素
struct data queue[MAX];//队列的容量
};
//创建优先对列
struct priQueue*createQueue()
{
struct priQueue*lpQueue = (struct priQueue*)malloc(sizeof(struct priQueue));
lpQueue->sizeQueue = 0;
/*数组的初始化:memset。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。*/
memset(lpQueue->queue,0,sizeof(struct data)*MAX);
return lpQueue;
}
//万金油函数
int empty(struct priQueue*lpQueue)
{
return lpQueue->sizeQueue != 0;
}
int size(struct priQueue* lpQueue)
{
return lpQueue->sizeQueue;
}
//入队操作,从文件中读出来
void push(struct priQueue* lpQueue, struct data curData)
/*curData是结构体变量,即把struct data整个结构体拿过来*/
{
if(lpQueue->sizeQueue == MAX)
{
//安全性问题描述清楚
printf("队列满了!无法入队\n");
return ;
}
else
{
lpQueue->queue[lpQueue->sizeQueue]=curData;
/*用sizeQueue充当下标*/
lpQueue->sizeQueue++;
}
}
/*出队:我们运行数组中的某个数据,这个数据出队后,我们要把数据后面的元素连到前面去*/
void pop(struct priQueue*lpQueue, struct data *popData)
/*用指针把数据传进去,如果是指针或数组传值的话,这里是形参,形参和实参会共同改变,只有这两个可以做到*/
{
if(lpQueue->sizeQueue == 0)
{
printf("无法出队!,对列为NULL\n");
return;
}
else
{
struct data minData; /*去找权值最小的数据(在这里找最小的,具体问题具体分析)*/
/*假设第一个是最小的*/
minData = lpQueue->queue[0];
int minIndex = 0; /*记录下标*/
for(int i=1;i<lpQueue->sizeQueue; i++)
{
/*比较的是权值*/
if(lpQueue->queue[i].priority<minData.priority)
{
minData = lpQueue->queue[i];
minIndex = i;
/*queue[0]不是最小值,就往下找*/
}
/*popData是个指针*/
*popData = lpQueue->queue[minIndex];
/*queue[]是数组*/
/*调整队列,做一个伪删除*/
for(int i = minIndex;i<lpQueue->sizeQueue;i++)
{
/*把删除了的数据后面的元素往前挪*/
lpQueue->queue[i] = lpQueue->queue[i+1];
}
lpQueue->sizeQueue--;
}
}
}
int main()
{
struct priQueue* lpQueue = createQueue();
struct data readData;
FILE *fp = fopen("task.txt"."r"); /*读写文件*/
if(fp == NULL)
{
printf("文件打开失败!");
return 0;
}
while (fscanf(fp,"%d %d\n", &readData.element,&readData.priority)!=EOF)
{
prush(lpQueue, readData);
}
fclose(fp);
int workIndex = 1;
printf("\t序号\t编号\t工作量\n");
while(empty(lpQueue))
{
pop(lpQueue,&readData);
printf("\t%d\t%d\t%d\t%d\n",workIndex,readData.element,readData.priority);
workIndex++;
}
system("pause");
return 0;
}
/*自带排序功能*/
优先队列
最新推荐文章于 2024-11-25 15:14:27 发布