钾钇 2021-07-07 10:08 采纳率: 100%
浏览 101
已采纳

数据结构(用无序顺序表实现优先队列)

需要用c语言编程,加点注释。

假设进入计算机系统的作业(job)被赋予一个作业号(job number)和一个从0~9之中的优先级(priority),0表示最大优先级,9表示最小优先级。等待被作业执行的作业的作业号被保存在一个优先级队列(priority queue)中。
编写一个程序,使用优先级队列来存放作业,并允许用户选择一下菜单操作:R(删除remove)、A(增加add)和L(列举list)。
对于R,读出当前优先级最高的作业号并把它从优先级队列中删除,如果当前优先级最高的作业有多个,则把作业号小的作业从优先队列中删除;对于A,读入作业号和优先级,然后按上述规则把它加入到优先级队列中;对于L,则列出队列中的所有作业号及其优先级。
作业号可用一个整数表示,可在作业进入系统时由系统赋予。
设计适当的数据元素类型,用无序顺序表实现优先队列并写出验证代码验证各个操作,完成上述计算机系统的作业调度的演示方案。新来的作业插入到表尾。假定作业号可以反映作业被加入的先后次序,因此和作业优先级一起可以唯一识别一个作业。

  • 写回答

4条回答 默认 最新

  • 正在学C++ 2021-07-07 12:49
    关注
    #include<stdio.h>
    struct job{
        int job_number;
        int priority;
    };
    job priority_queue[100];
    int length=0;   //队列中的作业个数 全局变量
    int allnumber=1;    //作业号,依次递增,赋给增加的作业
    
    int remove(){
        if(length==0){
            printf("There is no job!\n");
            return 0;
        }
        int maxpriority=9999;
        int number=9999;
        int sign=0;
        //遍历一次队列,找到最高优先级的作业
        for(int i=0;i<length;i++){
            if(priority_queue[i].priority<maxpriority){
                maxpriority = priority_queue[i].priority;
                number = priority_queue[i].job_number;
                sign = i;
            }
            else if(priority_queue[i].priority==maxpriority)
                if(priority_queue[i].job_number<number){
                    maxpriority = priority_queue[i].priority;
                    number = priority_queue[i].job_number;
                    sign = i;
                }
        }
        printf("%d %d\n",priority_queue[sign].job_number,priority_queue[sign].priority);
    
        //找到了作业,删除它
        //从后往前依次覆盖
        for(int i=sign;i<length-1;i++)
            priority_queue[i] = priority_queue[i+1];
        //作业个数减一
        length--;
        printf("Remove succeeds!\n");
        return 1;
    }
    int add(){ //控制台输入一个优先级,系统自动赋予作业号
        printf("Please input the priority: ");
        int p;  scanf("%d",&p);
        //构成一个作业:作业号,优先级  并且加在队列最后
        priority_queue[length] = {allnumber++,p};
        //作业个数加一
        length++;
        printf("%d %d\n",priority_queue[length-1].job_number,priority_queue[length-1].priority);
        printf("Add succeeds!\n");
        return 1;
    }
    int list(){
        printf("List:\n");
        //一个for循环遍历整个数组
        for(int i=0;i<length;i++)
            printf("%d %d\n",priority_queue[i].job_number,priority_queue[i].priority);
        printf("Over!\n");
        return 1;
    }
    
    int menu(){
        printf("Please input your operation:");
        char operation;
        scanf("%s",&operation);
        switch (operation) {
            case 'R':remove();break;
            case 'A':add();break;
            case 'L':list();break;
            case '0':return 0;
            default: printf("Illegal input.\n");
        }
        menu();
    }
    int main(){
        menu();
        return 1;
    }
    

    img

    img

    直接复制粘贴就能运行。

    使用数组存储作业。每次出队时,先找到优先级最高的作业,然后删除它。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于react-hook组件用函数控制是否渲染的及时性问题。
  • ¥50 Linux下的软件,要做模块化拆分。进程间通信是否有开源框架可以借用?
  • ¥100 修改原有的MYSQL存储代码,在最右边添加多列数据
  • ¥20 Open Interpreter 使用时报错: still has pending operation at deallocation, the process may crash
  • ¥15 qt中链接动态链接库,调用其中的函数,该函数的参数需要传入回调函数,自己创建的回调函数无法作为参数传递进去
  • ¥15 如何把api接口返回的json数据自动计算分页自动执行并写入mysql数据库。
  • ¥15 matlab svm二分类代码问题
  • ¥40 求一款能支持ios15以上的屏蔽越狱插件。比较好用的
  • ¥15 C++ QT对比内存字符(形式不定)
  • ¥30 C++第三方库libiconv 远程安装协助