c++-时间片轮转调度算法中C++结构体指针空值问题

问题描述

时间片轮转调度算法中C++结构体指针空值问题

// 时间片轮转调度算法.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include
#include
#include
#include
using namespace std;

int ArrivalTime[100]; //进程到达时间
int ServiceTime[100]; //进程服务时间
int PServiceTime[100]; //剩余服务时间
int FinishTime[100]; //进程完成时间
int WholeTime[100]; //周转时间
double WeightWholeTime[100]; //带权周转时间
double AverageWT; //平均周转时间
double AverageWWT; //平均带权周转时间
bool Finished[100]; //标记进程是否完成
int n,i,j; //n为进程数量,i和j为循环变量
int q; //q为时间片大小
int NowTime=0; //当前时刻

//定义一个"进程"结构体,包含进程Id,进程所需内容可根据Id号得到
typedef struct Process{
int ProcessID; //进程ID
struct Process *next;
}Process,*ProcessPtr;

//定义一个队列CpuQueue,模仿CPU
typedef struct CpuQueue{
int count;
ProcessPtr beginzz; //队头指针
ProcessPtr endzz; //队尾指针
}CpuQueue;

//初始化队列函数
void InitQueue(CpuQueue &c){
c.count=0;
c.beginzz=c.endzz=(ProcessPtr)malloc(sizeof(Process));
c.beginzz->next=NULL;
}

//判断队列是否为空,如果为空返回true
bool IsEmpty(CpuQueue c){
/* if(Q.count==0){
return true;
}
return false;*/
return c.beginzz==c.endzz?true:false;
}

//进队函数,将进程号为id的进程进队
void EnQueue (CpuQueue &c,int id){
ProcessPtr p;
p=(ProcessPtr)malloc(sizeof(Process));
p->ProcessID=id;
p->next = NULL;
c.endzz->next=p;;
c.endzz = p;
c.count++;
cout<<"进队1次使用:"<<" 个数:"<<c.count<<endl;
}

//出队函数,返回队首指针的进程ID号
int DeQueue (CpuQueue &c)
{
int id;
ProcessPtr p;
if(c.beginzz->next==NULL){cout<<"yes!"<
p=c.beginzz->next;
id=p->ProcessID;
c.beginzz->next = p->next;
c.count--;
free(p);
cout<<"出队1次使用:"<<" 个数:"<<c.count<<endl;
return id;
}

//将进程号在num数组中按规定顺序排列好
//返回num[]为按时间到达先后顺序排列的进程号
int* order(int ArrivalTime[]){
int *num=new int[100];
for(i=0;i<n;i++){
num[i]=i; //初始化num数组
}

for(i=0;i<n;i++){
    for(j=0;j<n;j++){
        if(ArrivalTime[num[i]]<ArrivalTime[num[j]]){
            int temp=num[i];
            num[i]=num[j];
            num[j]=temp;
        }
    }
}
return num;

}
//时间片轮转调度算法
void RR(){
CpuQueue c;
InitQueue(c);
int *num=new int[100];

num=order(ArrivalTime); //返回按到达时间先后顺序排列好的数组num

if(ArrivalTime[0]>NowTime)
{
    NowTime=ArrivalTime[0];
}
EnQueue(c,0);  //先把第一个进程进队
bool isFirst=true;
i=1;
while(!IsEmpty(c)||isFirst){
    isFirst=false;
    int proId=DeQueue(c);
    if(PServiceTime[proId]<=q){      //当剩余服务时间比时间片q小的情况
        NowTime+=PServiceTime[proId];
        PServiceTime[proId]=0;     //对该进程剩余时间归0
        //如果进程在上一个进程完成之前到达,则进队
        while(i<n&&ArrivalTime[i]<=NowTime)
        {
            EnQueue(c,i);
            i++;
        }

        //对进程数据进行赋值操作
        FinishTime[proId]=NowTime;
        WholeTime[proId]=FinishTime[proId]-ArrivalTime[proId];       //周转时间=完成时间-到达时间
        WeightWholeTime[proId]=WholeTime[proId]/ServiceTime[proId];  //带权周转时间=周转时间/服务时间
    }
    else{   //当剩余服务时间比时间片大的情况
        PServiceTime[proId]=PServiceTime[proId]-q;   //剩余服务时间处理
        NowTime=NowTime+q;
         //如果进程在上一个进程时间片用完之前到达,则进队
        while(i<n&&ArrivalTime[i]<=NowTime)
        {
            EnQueue(c,i);
            i++;
        }
        EnQueue(c,proId);
    }

}

}

//输入函数,用于接收数据
void input(){
cout<<"请输入进程数量n: ";
cin>>n;
while(n100){
cout<<"n为1~100之间的整数,请重新输入。n=";
cin>>n;
}
cout<<"-------------------------------------------"<
for(i=0;i
cout
cin>>ArrivalTime[i];
}

cout<<"-------------------------------------------"<<endl;
for(i=0;i<n;i++){
    cout<<"请输入第"<<i+1<<"进程的服务时间:";
    cin>>ServiceTime[i];
}
//初始化PServiceTime[]
for(i=0;i<n;i++){
    PServiceTime[i]=ServiceTime[i];
}
cout<<"-------------------------------------------"<<endl;
cout<<"请输入时间片大小q:  ";
cin>>q;

}

//打印输出函数
//将进程进展情况以表格的形式打印
void print()
{
cout<<"-------------------------------------------"<<endl;
cout<<"进程名tt";
for(i=0;i<n;i++)
{
char c=i+65;
cout<<c<<"t";
}
cout<<"n到达时间t";
for(i=0;i<n;i++)
{
cout<<ArrivalTime[i]<<"t";
}
cout<<"n服务时间t";
for(i=0;i<n;i++)
{
cout<<ServiceTime[i]<<"t";
}
cout<<"n完成时间t";
for(i=0;i<n;i++)
{
cout<<FinishTime[i]<<"t";
}
cout<<"n周转时间t";
for(i=0;i<n;i++)
{
cout<<setprecision(3)<<WholeTime[i]<<"t";
}
cout<<"n带权周转时间t";
for(i=0;i<n;i++)
{
cout<<setprecision(3)<<WeightWholeTime[i]<<"t";
}
cout<<"n剩余服务时间t";
for(i=0;i<n;i++)
{
cout<<setprecision(3)<<PServiceTime[i]<<"t";
}
cout<<endl;
for(int i=0;i<n;i++) //计算平均周转时间和平均带权周转时间
{
AverageWT+=(double)WholeTime[i]/n;
AverageWWT+=(double)WeightWholeTime[i]/n;
}
cout<<endl;
cout<<setprecision(3)<<"平均周转时间: "<<AverageWT<<endl;
cout<<setprecision(3)<<"平均带权周转时间: "<<AverageWWT<<endl;
}

int main(int argc, char* argv[])
{
input();
RR();
print();

return 0;

}

在进队函数中 c.beginzz->next 轮转几次就变为空

我用的输入 进程数:1
到达时间:2
服务时间:3
q=1 测试的

时间: 2024-09-14 05:21:48

c++-时间片轮转调度算法中C++结构体指针空值问题的相关文章

c-C 语言中返回结构体指针,结果出来了,但是还是出现错误,不知道为什么

问题描述 C 语言中返回结构体指针,结果出来了,但是还是出现错误,不知道为什么 解决方案 p 没有初始化,也就是没有分配空间.典型的指针错误,不初始化,指针指向哪里呢? 解决方案二: array *p = new array(); 解决方案三: array p;test(&p); 解决方案四: 当然,使用指针应该首先初始化一个空地址的,否则,很容易发生指针地址错误其次,看了一下你的程序设计,程序本身是定义了一个array的结构体变量,在主函数中却要申请一个指针变量p(它的类型是结构体),一系列操

C语言中的结构体指针在c#中怎么表示

问题描述 大家好,现在需要将C的一部分函数实现转换到c#中来,请问如下该怎么表示啊:#defineBB_MAX_SIZEtypedefstruct{intbuffer[RB_MAX_SIZE];int*buffer_end;int*data_start;int*data_end;intcount;intsize;};back_buffer..intBB_pop(backbuffer*rb){if(rb==NULL||rb->buffer==NULL)returnfalse;int8_tdata=

关于c语言结构体指针数组的问题

问题描述 关于c语言结构体指针数组的问题 我有一个数组,里面每个成员都是结构体指针,我应该怎么给这个数组分配空间? 解决方案 指针变量的长度都是固定的,与你指向什么东西没关系的. 解决方案二: #include #define N 3 struct student { long int num; char name[20]; float score[3]; float aver; }; int main() { void Input(struct student stu[]); struct s

OC中的结构体变量和结构体指针变量的区别

问题描述 OC中的结构体变量和结构体指针变量的区别 OC中的结构体变量和结构体指针变量的区别?,请写出相同点和不同点 解决方案 指向结构体变量的指针指向结构体变量的指针引用结构体变量中的成员结构体中的指针变量输出 解决方案二: 一般来说结构变量定义的时候就分配了内存空间;但结构体指针,和其它指针一样,只有4个字节的指针大小,在使用时需要先动态的分配内存.

c程序设计-C语言截结构体指针中的变量又是另一个结构体指针,怎么用,代码运行不了

问题描述 C语言截结构体指针中的变量又是另一个结构体指针,怎么用,代码运行不了 #include #include #include #include #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 #define LISTINCREMENT 10//线性表存储空间的分配增量 typedef struct { int No; char name[10]; }Student; typedef struct { Student *elem;//存储空间基址 int

编译出错-用push_back函数将数存入结构体指针向量中编译不出错,运行的时候出不来!

问题描述 用push_back函数将数存入结构体指针向量中编译不出错,运行的时候出不来! #include #include #include using namespace std; typedef struct person { string name; vector length; }person,*person_List; int main() { int number; person_List p; person p1; p = (person_List)malloc(sizeof(p

深入分析C语言中结构体指针的定义与引用详解_C 语言

指向结构体类型变量的使用首先让我们定义结构体:struct stu{char name[20];long number;float score[4];} ;再定义指向结构体类型变量的指针变量:struct stu *p1, *p2 ;定义指针变量p 1.p 2,分别指向结构体类型变量.引用形式为:指针变量→成员:[例7-2] 对指向结构体类型变量的正确使用.输入一个结构体类型变量的成员,并输出. 复制代码 代码如下: #include <stdlib.h> /*使用m a l l o c (

C/C++中的结构体

什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 定义结构体使用struct修饰符,例如: struct test

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+   指针数组: 在一个数组中,如果它的元素全部都是指针