关于指针,p->next一直为null啊。。。
#include<stdio.h> #include<stdlib.h>
#include <string.h>
typedef struct PCB //定义进程控制块
{
char name[20]; //进程名
char state; //运行状态
int ArriveTime; //到达时间
int StartTime; //进程开始时间
int FinishTime; //进程结束时间
int ServiceTime; //服务时间
struct PCB *next; //指向下个进程
}PCB;
int time;
int n; //进程个数
PCB *head=NULL,*p,*q; //进程链表指针
void run_fcfs()
{
p=head;
q=p;
p->StartTime=p->ArriveTime;
p->FinishTime=p->StartTime+p->ServiceTime;
printf("作业名\t到达时间\t服务时间\t开始时间\t完成时间\n");
printf("%s\t%6d\t%10d\t%10d\t%8d\n",p->name,p->ArriveTime,p->ServiceTime,p->StartTime,p->FinishTime);
for(int i=1;i<n;i++)
{
q=p->next;
q->StartTime=p->FinishTime;
q->FinishTime=q->StartTime+q->ServiceTime;
printf("作业名\t到达时间\t服务时间\t开始时间\t完成时间\n");
printf("%s\t%6d\t%10d\t%10d\t%8d\n",q->name,q->ArriveTime,q->ServiceTime,q->StartTime,q->FinishTime);
}
}
void sort_fcfs()
{
p=head;
PCB *k;
for(int j=n-1;(j>=0);j--)
{
p=head;
q=p->next;
for(int i=0;i<n;i++)
{
if(p->state=='F')
{
if(p->ArriveTime >q->ArriveTime)
{
k->ArriveTime=p->ArriveTime;
k->ServiceTime=p->ServiceTime;
strcpy(k->name,p->name);
p->ArriveTime=q->ArriveTime;
p->ServiceTime=q->ServiceTime;
strcpy(p->name,q->name);
q->ArriveTime=k->ArriveTime;
q->ServiceTime=k->ServiceTime;
strcpy(q->name,k->name);
k=p;
p=q;
q=k;
}
q=q->next;
p=p->next;
}
}
}
run_fcfs();
}
void FCFS() //获得进程信息并创建进程
{
int num;
printf("\n进程个数:");
scanf("%d",&n);
for(num=0;num<n;num++)
{
p=(PCB *)malloc(sizeof(PCB));
printf("依次输入:\n进程名 到达时间 服务时间\n");
scanf("%s\t%d\t%d",&p->name,&p->ArriveTime,&p->ServiceTime);
if(head==NULL)
{
head=p;q=p;
}
q->next=p;
p->StartTime=0;
p->FinishTime=0;
p->next=NULL;
p->state='F';
q=p;
}
sort_fcfs();
}
void main()
{
int a=1;
while(a!=0)
{
printf("\n\n");
printf("\t\t/*************************/");
printf("\n\t\t/* 1、先到先服务 调 度 */");
printf("\n\t\t/* 2、短作业优先 调 度 */");
printf("\n\t\t/* 3、时间片轮转 调 度 */");
printf("\n\t\t/* 4、优 先 级 调 度 */");
printf("\n\t\t/* 5、多 级 队 列调 度 */");
printf("\n\t\t/* 0、 退 出 */\n");
printf("\t\t/*************************/");
printf("\n\n\t请选择菜单项:\t");
scanf("%d",&a);
printf("\n");
switch(a)
{
case 1: FCFS(); break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
default: break;
}
if(a<0&&a>4)
{
printf("输入不正确,请重新输入!");
break;
}
}
}
红色标出来的地方就是错误所在T T但是自己不知道怎么改。。。目测逻辑问题,求大神帮帮忙T T
做得是先来先服务的进程调度