m0_58862445 2021-11-13 13:59 采纳率: 0%
浏览 19
已结题

关于指针冒泡排序的问题

模拟处理器调度
按优先级排序,每次处理一个进程后该进程优先级和时间都-1,并且进入队列重新排序,当时间为0时退出运行。
我想的是先给每次循环按优先级排序,然后给个固定的下标,下标为0的程序(也就是头程序)每次减之后再进入程序循环。
目前的主要问题是冒泡出错,不能按优先级来排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
 
#define MAXN 50
 
 
using namespace std;
 
struct PCB {
    int id;       //进程号
    int time;     //时间
    int level;     //优先级
    int v;//下标
    int er;//状态
                
}p[5];
 
int n=5, head_v, cnt=0;
 

 
void Init() {
    char stime[5]={2,3,1,2,4};
    char slevel[5]={1,20,3,4,2};
    for(int i = 0; i < n; i++) {
        p[i].time=stime[i];
        p[i].level=slevel[i];
        p[i].id = i+1;
        p[i].v  = i;
    }
}

void Insert() {
    for(int i = 0; i < n-1; i++) {
        if(p[p[i].v].time < p[p[i+1].v].time)
            swap(p[i].v, p[i+1].v);
        else
            break;
    }
}
void Judge() {
    for(int i = 0; i < n; i++) {
        if((p[p[i].v].time) > 0)
           (p[p[i].v].er)='R';
        else
           (p[p[i].v].er)='E';
          
         
    }
}


void Bubble() {
    for(int i = 0; i < n; i++) {
       if (p[p[i].v].level > p[p[i+1].v].level)
       {
           swap(p[p[i].v], p[p[i+1].v]);
       } 
    }
}



void test_out() {
    for(int i = 0; i < n; i++) {
        printf(" 进程号:%d  时间:%d  优先级:%d 下标: %d 状态: R\n", p[i].id, p[i].time, p[i].level,p[i].v);
    }
 
}
 
void sort_out() {
    for(int i = 0; i < n; i++) {
        printf(" 进程号:%d  时间:%d  优先级:%d 状态: %c 下标: %d\n", p[p[i].v].id, p[p[i].v].time, p[p[i].v].level ,p[p[i].v].er,p[i].v);
    }
    head_v = p[0].v;
    puts("/*-----------------------------------------------*/");
    if(cnt!=n) {
        printf("当前进程:%d  时间:%d  优先级:%d 状态: %c 下标: %d\n ", p[head_v].id, --p[head_v].time, --p[head_v].level ,p[head_v].er,p[head_v].v);
    puts("/*-----------------------------------------------*/");
    }
    
    else {
        printf(" 结束运行\n");
        
        
    }
}
 
int main() {
    
 
    Init();
    printf("\n 开始运行:\n\n");
    test_out();
 
    puts("/*-----------------------------------------------*/");
    Judge();
    Bubble();
    Insert();
    sort_out();
    
 
    while(cnt!= n) {
        if(p[head_v].time == 0) {
            cnt++;   //每有一个time为0,n就+1 
            Judge();
            Insert();
            sort_out();   
            
        }
        else {
            
            Insert();
            sort_out();
            
        }
    }
    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-11-13 14:05
    关注

    冒泡得是双循环啊

    void Bubble() {
        for(int i = 0; i < n-1; i++) 
            for(int j=0;j<n-i-1;j++)
            {
                 if (p[p[j].v].level > p[p[j+1].v].level)
                 {
                     swap(p[p[j].v], p[p[j+1].v]);
                 } 
          }
    }
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月16日
  • 创建了问题 11月13日

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突