P71 例3-6 设计一个程序模仿操作系统的进程管理问题。进程服务按优先级高的先服务、优先级相同的先到先服务的原则管理。设文件task.dat中存放了仿真进程请求服务,其中第一列表示进程的任务号,第二列表示进程的优先级。
头文件:SeqPQueue.h
#include<stdio.h> #include<stdlib.h> #define MaxQueueSize 100 typedef int ElemType; typedef struct { int priority; ElemType elem; }DataType; typedef struct { DataType queue[MaxQueueSize]; int size; }SeqPQueue; void QueueInitiate(SeqPQueue *Q) { Q->size=0; } int QueueNotEmpty(SeqPQueue Q) { if(Q.size<=0) return 0; else return 1; } int QueueAppend(SeqPQueue *Q,DataType x) { if(Q->size>=MaxQueueSize) { printf("队列已满无法插入!\n"); return 0; } else { Q->queue[Q->size]=x; Q->size++; return 1; } } int QueueDelete(SeqPQueue *Q,DataType *d) { DataType min; int minIndex,i; if(Q->size<=0) { printf("队列已空无数据元素出队列!\n"); return 0; } else { min=Q->queue[0]; minIndex=0; for(i=1;i<Q->size;i++) { if(Q->queue[i].priority<min.priority) { 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 QueueGet(SeqPQueue *Q,DataType *d) { DataType min; int minIndex,i; if(Q->size<=0) { printf("队列已空无数据元素可取!\n"); return 0; } else { min=Q->queue[0]; minIndex=0; for(i=1;i<Q->size;i++) { if(Q->queue[i].priority<min.priority) { min=Q->queue[i]; minIndex=i; } } *d=Q->queue[minIndex]; return 1; } }源文件:例3-6.c
#include"SeqPQueue.h" int main() { SeqPQueue myPQueue; FILE *fp; DataType task; int i; if((fp=fopen("task.dat","r"))==NULL) { printf("不能打开文件task.dat!"); exit(0); } QueueInitiate(&myPQueue); while(!feof(fp)) { fscanf(fp,"%d %d",&task.elem,&task.priority); QueueAppend(&myPQueue,task); } i=1; printf("序号 任务号 优先级\n"); while(QueueNotEmpty(myPQueue)) { QueueDelete(&myPQueue,&task); printf("%d\t",i); printf("%d\t",task.elem); printf("%d\n",task.priority); i++; } return 0; }.dat文件为:task.dat
1 30 2 20 3 40 4 20 5 0在VS2019下,需将源文件3-6.c的fopen和fscanf做一些修改,所以源文件3-6.c为:
#include"SeqPQueue.h" int main() { SeqPQueue myPQueue; FILE *fp; DataType task; int i; fopen_s(&fp,"task.dat","r"); if(fp==NULL) { printf("不能打开文件task.dat!"); exit(0); } QueueInitiate(&myPQueue); while(!feof(fp)) { fscanf_s(fp,"%d %d",&task.elem,&task.priority); QueueAppend(&myPQueue,task); } i=1; printf("序号 任务号 优先级\n"); while(QueueNotEmpty(myPQueue)) { QueueDelete(&myPQueue,&task); printf("%d\t",i); printf("%d\t",task.elem); printf("%d\n",task.priority); i++; } return 0; }