#include<stdafx.h>
#include<stdio.h>
#include <malloc.h>
//#include <string>   //c里面没有string,因为string是一个类,而c没有类
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
//using namespace std;

struct PCB
{
    int ProcessReachTime;//标志进程到达时间
    char PID[10];//进程ID
    //int priority;//进程优先数,在这里的FCFS没有用
    //int chip;//时间片
    int needTime;
    int cputime;//进程已经占用CPU的时间
    int alltime;//进程还需要运行的时间(当进程运行完毕时,其值为0)
    char state;//进程的状态STATE(为简化起见。设每个进程处于运行E(excecuting)、就绪R(ready)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态R。)
    struct PCB* next;//进程队列指针NEXT(用来将PCB排成队列)等
};

int time;//用于进程到达时间和需要时间
char strPID[10];
int num;
struct PCB  *start,*startHead,*temp,*newNode;
int totalTime=0;
int main()
{
    printf("请输入进程数:");
    scanf_s("%d",&num);

    start=(PCB*)malloc(sizeof(PCB));
    startHead=(PCB*)malloc(sizeof(PCB));
    start=NULL;
    startHead=start;

    temp=(PCB*)malloc(sizeof(PCB));
    temp=startHead;

    for (int i=0;i<num;i++)
    {
        startHead=start;
        temp=startHead;
        newNode=(PCB*)malloc(sizeof(PCB));
        //--------------------------
        printf("请输入进程ID:");
        scanf_s("%s",strPID);
        strcpy_s(newNode->PID,strPID);//不能用newNode->PID=strPID;因为PID是一个字符数组newNode->PID是一个常量,不能复制
        //--------------------------
        printf("请输入进程到达时间:");
        scanf_s("%d",&time);
        newNode->ProcessReachTime=time;
        //--------------------------
        printf("请输入进程需要时间:");
        scanf_s("%d",&time);
        newNode->needTime=time;
        //--------------------------
        newNode->state='R';


        newNode->next=NULL;
        if(i==0)
        {
            start=newNode;
            startHead=start;
        }
        else if (i==1)
        {
            if(start->ProcessReachTime<=newNode->ProcessReachTime)
            {
                startHead->next=newNode;
            }
            else
            {
                newNode->next=startHead;
                start=newNode;
            }
        }
        else
        {
            for(startHead=start;startHead!=NULL;startHead=startHead->next)
            {
                temp=startHead;
                if(start->ProcessReachTime>newNode->ProcessReachTime)
                {
                    newNode->next=startHead;
                    start=newNode;
                    break;
                }
                
                else if(startHead->ProcessReachTime<=newNode->ProcessReachTime &&startHead->next!=NULL&& startHead->next->ProcessReachTime>newNode->ProcessReachTime)//注意后面两个的顺序,如果顺序调换会发生错误
                {
                    newNode->next=startHead->next;
                    temp->next=newNode;
                    break;
                }

                else if(startHead->next==NULL)
                {
                    temp->next=newNode;
                    break;
                }
            }
        }
        
    }

    int startTime=0;//用于记录一个进程开始运行的时间
    startHead=start;
    for(int i=0;startHead!=NULL;i++)
    {
        if (startHead->ProcessReachTime<=i&&startHead->state=='R')
        {
            startTime=i;//记录开始时间i为astartTime
            startHead->state='E';//进程为执行状态
            printf("在%d时刻:",i);
            printf("进程%s开始运行\n",startHead->PID);
        }
        else if (i-startTime<startHead->needTime&&i-startTime>0&&startHead->state=='E')
        {
            printf("在%d时刻:",i);
            printf("进程%s正在运行\n",startHead->PID);
        }
        else if (i-startTime==startHead->needTime&&startHead->state=='E')
        {
            startHead->state='F';
            printf("在%d时刻:",i);
            printf("进程%s结束运行\n",startHead->PID);
            startHead=startHead->next;
            i--;//这个很重要,主要在结束时刻是否有进程执行
        }

        if(startHead==NULL)
        {
            printf("进程调度结束");
        }
    }


    
    while(1);
}

心得体会:

     了解进程调度大概原理。