永远在努力 2022-05-05 11:02 采纳率: 33.3%
浏览 39
已结题

c++ 链表 指针移动问题 求接

问题遇到的现象和发生背景

在popready 从就绪队列出队的里边。next 不是按着12345的顺序走的
是按着1054321的顺序走的 导致我输出第二个内容的时候是乱码
这怎么把它变过来呀

问题相关代码,请勿粘贴截图
运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果
#include"string.h"
#define _CRT_SECURE_NO_WARNINGS
#include<cstring>
#include<string>
#include<iostream>
#define SLOT 5   //时间片大小

using namespace std;
#define  n   10           //假定系统允许进程个数为10
//进程控制块结构定义
typedef struct pcb
{
    int name; //进程标识符 采用编号的方式 标识信息
    int srt;  //服务时间
    string status;              //进程状态ready running 说明信息
    int ax, bx, cx, dx;         //进程现场信息,通用寄存器内容
    int pc;                 //进程现场信息,程序计数器内容
    int psw;               //进程现场信息,程序状态字寄存器内容
    int next;               //下一个进程控制块的位置
}pcb;
typedef struct
{
    int  head;
    int  tail;
}Ready;           //定义指向就绪队列的头指针head和尾指针tail

int psw, ax,bx,cx,dx,pc;
pcb  pcbarea[n];    //模拟进程控制块区域的数组//定义了typedef的枚举类型了以后就可以直接写
int  run=-1;            //定义指向正在运行进程的进程控制块的指针//初始化为-1代表运行队列为空
int head;//定义头指针
Ready ready;//就绪队列指针
int  pfree; //定义指向空闲进程控制块队列的指针
int o;//记录pcbarea的第几个

int popready()//就绪队列出队
{
    int name;
    if (ready.head == -1)//就是判断一下队列是不是空的
    {
        cout << "就绪队列为空。不能出队。\n" << endl;
        return 0;
    }
    name = ready.head;//让name代表队列的头一个数
    ready.head = pcbarea[name-1].next;//头指针后移
    //是这里的问题!!!上一行next没有按着12345的顺序走,
    //是按着1054321的顺序走的。
    //导致第二次输入的数据是空的,输出的乱码
    if (ready.head == -1)//如果后移一位发现等于-1了,说明队列里就只有一个,移出来了以后就是空的
    {//说名头尾指针指在了同一个数上//头指针后移了 尾指针也要后移。如下
        ready.tail = -1;
    }
    
    cout << "ceshiyixia " << pcbarea[ready.head].name << endl;
    return name;
}

void pushready(int x)//就绪队列入队 x是标识号
{
    int temp;
    cout << ready.head << endl;
    if (ready.head == -1)
    {//如果是空的的就入队的是第一个,就让头和尾都指向他
        ready.head = x;
        ready.tail = x;
    }
    else
    {
        temp = ready.tail;//为什么要给temp? 有什么用
        ready.tail = x;//入队从后边开始入
    }
    pcbarea[ready.tail].next = -1;//因为入队是从尾巴开始入的,所以尾巴后边必为-1
}
//创建PCB进程控制块
void createpcb(int x,pcb pcb1)//x为要创建PCB在PCB区域数组的编号
{

    pcbarea[x].ax = pcb1.ax;
    pcbarea[x].bx = pcb1.bx;
    pcbarea[x].cx = pcb1.cx;
    pcbarea[x].dx = pcb1.dx;
    pcbarea[x].name = pcb1.name;
    pcbarea[x].next = -1;
    pcbarea[x].pc = pcb1.pc;
    pcbarea[x].psw = pcb1.psw;
    pcbarea[x].status = pcb1.status;
}
void createprocess(int name,pcb pcb2)
{
     
    pcb2.status="ready";
    createpcb(name, pcb2);
    pushready(name);//就绪队列入队
}
int TIME;
void schedule()
{
    int srt;
    int name;//进程编号
    if (ready.head == -1)
    {
        cout << "没有进程可以调度" << endl;
        return;
    }
    name = popready();//就绪队列出队
    srt = pcbarea[name].srt;
    pcbarea[name].status = "running";
    TIME = SLOT;//这是什么意思??//单处理系统是一次只能执行一个程序,所以时间片就是如果一个程序没有执行完就切换到就绪队列的尾部
    //恢复cpu现场
    if (srt > TIME)//如果服务时间大于时间片大小  再次转入就绪队列尾部
    {    //就算是要传回也要在运行过程中显示执行了
        //恢复cpu现场
        ax = pcbarea[name].ax;
        bx = pcbarea[name].bx;
        cx = pcbarea[name].cx;
        dx = pcbarea[name].dx;
        pc = pcbarea[name].pc;
        psw = pcbarea[name].psw;
        run = name; //将选中的进程赋给运行指针//为了输出的时候写的方便
        cout << "输出调度结果(要求时间太长无法满足服务时间将传回)\n" << endl;
        cout << "进程号是" << pcbarea[run].name << endl;
        cout << "进程状态" << pcbarea[run].status << endl;
        cout << "寄存器内容" << pcbarea[run].ax << pcbarea[run].bx << pcbarea[run].cx << pcbarea[run].dx << pcbarea[run].pc << pcbarea[run].psw;
        pcbarea[name].srt = srt - TIME;//写上剩下的
        //传回就绪队列尾部  等待再次运行完成
        pushready(name);
    }
    else
    {   //恢复cpu现场
        ax = pcbarea[name-1].ax;
        bx = pcbarea[name-1].bx;
        cx = pcbarea[name-1].cx;
        dx = pcbarea[name-1].dx;
        pc = pcbarea[name-1].pc;
        psw = pcbarea[name-1].psw;
        run = name-1; //将选中的进程赋给运行指针//为了输出的时候写的方便
        cout << "输出调度结果\n" << endl;
        cout << "进程号是" << pcbarea[run].name << endl;
        cout << "进程状态" << pcbarea[run].status << endl;
        cout << "寄存器内容" << pcbarea[run].ax << pcbarea[run].bx << pcbarea[run].cx << pcbarea[run].dx << pcbarea[run].pc << pcbarea[run].psw;
    }

}
int main()
{
    int name;
    int srt;
    string status="ready";
    int ax, bx, cx, dx, pc, psw;
    //初始化指针  让在一开始的时候就绪队列为零
    ready.head = -1;
    ready.tail = -1;
    
    while (status=="ready")
    { //输入进程控制块
        cout << "请输入你的进程控制块信息(当status为ready时继续进行下一个):" << endl;
        cout << "标识符 服务时间 进程状态 通用寄存器中间结果缓存 通用寄存器的指针 通用寄存器串操作循环控制计数器 通用寄存器的间接的输入输出  " << endl;
        cin >>name>>srt>> status >> ax >> bx >> cx >> dx >> pc >> psw;//还用不用输入寄存器的内容???
        if (status != "ready")
            break;
        pcbarea[o].name = name;
        pcbarea[o].srt = srt;
        pcbarea[o].status = status;
        pcbarea[o].ax = ax;
        pcbarea[o].bx = bx;
        pcbarea[o].cx = cx;
        pcbarea[o].dx = dx;
        pcbarea[o].pc = pc;
        pcbarea[o].psw = psw;
        cout << "name" << name << "放入了数组的第" << o << "个空位" << endl;
        createprocess(name,pcbarea[o]);//这里的name是进程编号
        o++;
        cout <<"输入了" <<o<<"个" << endl;
    }

    cout << "进程输入已中止" << endl;
    int shu;
    shu = ready.head;
    while (shu!=-1)
    {
        schedule();
        
    }
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 5月13日
    • 创建了问题 5月5日

    悬赏问题

    • ¥30 模拟电路 logisim
    • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
    • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
    • ¥15 安装quartus II18.1时弹出此error,怎么解决?
    • ¥15 keil官网下载psn序列号在哪
    • ¥15 想用adb命令做一个通话软件,播放录音
    • ¥30 Pytorch深度学习服务器跑不通问题解决?
    • ¥15 部分客户订单定位有误的问题
    • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
    • ¥15 Bug traq 数据包 大概什么价