优先队列(堆)

迷南。 2022-03-26 13:22 445阅读 0赞

设计一个程序模仿操作系统的进程管理问题,进 程服务按优先级高的先服务,同优先级的先到先服务的管理 原则。设文件task.txt中存放了仿真进程服务请求,其中第 一列是进程任务号,第二列是进程的优先级。

1 30

2 20

3 40

4 20

5 0

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX_LEN 10
  4. typedef struct
  5. {
  6. int pri[MAX_LEN]; //优先级
  7. int num[MAX_LEN]; //进程服务号
  8. int n;
  9. }Heap;
  10. /*向大根堆中插入一个元素*/
  11. void Insert(Heap *heap,int x,int y)
  12. {
  13. int i;
  14. if(heap->n!=MAX_LEN-1)
  15. {
  16. heap->n++;
  17. i=heap->n;
  18. //当插入的元素优先级更大,或者优先级相同服务号更小,循环
  19. while((i !=1)&&((x>heap->pri[i/2])||(x==heap->pri[i/2]&&y<heap->num[i/2])))
  20. {
  21. heap->pri[i]=heap->pri[i/2];
  22. heap->num[i]=heap->num[i/2];
  23. i=i/2;
  24. }
  25. heap->pri[i]=x;
  26. heap->num[i]=y;
  27. }
  28. }
  29. /*删除堆中最大元素*/
  30. void Delete(Heap *heap)
  31. {
  32. int parent=1,child=2,pri,num,tmp1,tmp2;
  33. if(heap->n==0)
  34. {
  35. printf("堆空!\n");
  36. return;
  37. }
  38. pri = heap->pri[1];
  39. num = heap->num[1];
  40. printf("进程优先级%d 服务号%d\n",pri,num);
  41. tmp1 = heap->pri[heap->n];
  42. tmp2 = heap->num[heap->n];
  43. heap->n--;
  44. while(child<=heap->n)
  45. {
  46. if((child<heap->n)&&((heap->pri[child]<heap->pri[child+1])\
  47. ||(heap->pri[child]==heap->pri[child+1]&&heap->num[child]>heap->num[child+1])))
  48. child++;
  49. if((tmp1>heap->pri[child])||(tmp1==heap->pri[child]&&tmp2<heap->num[child]))
  50. break;
  51. heap->pri[parent]=heap->pri[child];
  52. heap->num[parent]=heap->num[child];
  53. parent=child;
  54. child*=2;
  55. }
  56. heap->pri[parent]=tmp1;
  57. heap->num[parent]=tmp2;
  58. }
  59. /*输入进程*/
  60. void Readfile(Heap *heap)//从task.txt中读入数据
  61. {
  62. FILE *fp;
  63. int x,y,i;
  64. fp=fopen("task.txt","r");
  65. if(fp==NULL)
  66. {
  67. printf("读取文件task.txt失败!\n");
  68. exit(0);
  69. }
  70. printf("从文件中读取数据如下:\n");
  71. for(i=0;i<5;i++)
  72. {
  73. fscanf(fp," %d",&x);
  74. fscanf(fp," %d",&y);
  75. printf("进程服务号%d 优先级%d\n",x,y);
  76. Insert(heap,y,x);
  77. }
  78. fclose(fp);
  79. }
  80. int main()
  81. {
  82. Heap heap;
  83. heap.n=0; //创建一个空堆
  84. Readfile(&heap);
  85. printf("\n进程排序后:\n");
  86. while(heap.n!=0)
  87. {
  88. Delete(&heap);
  89. }
  90. return 0;
  91. }

测试截图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzgyMTg3NA_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,445人围观)

还没有评论,来说两句吧...

相关阅读

    相关 优先队列

    设计一个程序模仿操作系统的进程管理问题,进 程服务按优先级高的先服务,同优先级的先到先服务的管理 原则。设文件task.txt中存放了仿真进程服务请求,其中第 一列是进程任务号