#include<stdio.h>
#include<stdlib.h>
typedef struct p //PCB结构体
{
char name;
int reach_time; //到达时间
int run_time; //运行时间
int com_time; //完成时间
int zz_time; //周转时间
float dqzz_time;//带权周转时间
char state; //运行状态
struct p *next; //连接指针
int rt;
}PCB;
//定义存放nums个进程PCB的链表的头结点;
PCB* linkinit() //初始化链表的头结点;
{
PCB* head1;
head1=(PCB *)malloc(sizeof(PCB));
head1->next=NULL;
return head1;
}
//往链表中添加进程PCB节点;
void linkadd(PCB* head)
{
PCB* r,* q=head;
r=(PCB *)malloc(sizeof(PCB));
while(q->next)q=q->next;
void inputdata(PCB* r);
inputdata(r);
r->next=q->next;
q->next=r;
}
//向链表PCB节点内容中输入数据
void inputdata(PCB* r)
{
printf("进程名:");scanf("\n%c",&r->name);
printf("到达时间:");scanf("%d",& r->reach_time);
printf("运行时间:");scanf("%d",& r->run_time);
}
//以“到达时间”的从大到小的顺序对链表进行排序
void seq(PCB* head)
{
PCB* h=head;
while(h->next->next)
{
PCB* p=h->next,*q=h->next;
while(q->next)
{
q=q->next;
if(p->reach_time > q->reach_time)
p=q;
}
PCB* r=h;
while(r->next!=p)
r=r->next;
r->next=p->next;
p->next=h->next;
h->next=p;
h=h->next;
}
}
//求最大的到达时间
int mrtime(PCB* head)
{
PCB* p=head;
while(p->next)
p=p->next;
int maxreachtime=p->reach_time;
return maxreachtime;
}
//将各个进程运行时间的初始值赋给p->rt;在求"带权周转时间"的时候要用到
void runtort(PCB* head)
{
PCB* p=head;
do
{
p=p->next;
p->rt=p->run_time;
}while(p->next);
}
void output(PCB* head,int nums)
{
PCB* t=head;
int zzs_time=0;float dqzzs_time=0.00;
while(t->next!=NULL)
{
t=t->next;
printf("进程名:%c\n",t->name);
printf("\t周转时间:%d\n",t->zz_time);
printf("\t带权周转时间:%f\n",t->dqzz_time);
zzs_time=zzs_time+t->zz_time;
dqzzs_time=dqzzs_time+t->dqzz_time;
}
printf("\n平均周转时间:%f\n",(float)zzs_time/nums);
printf("平均带权周转时间:%f\n",(float)dqzzs_time/nums);
}
void main()
{
int nums;
printf("请输入要运行的进程个数:");
scanf("%d",&nums); //nums代表要运行的进程的个数;
PCB* head;
head=linkinit();
for(int i=1;i<=nums;i++)
linkadd(head);
seq(head); //对PCB链表中的节点进行“运行时间”的排序(小-->大)
int maxreachtime=mrtime(head);
runtort(head); //将运行时间的初值赋给p->rt
PCB* p=head->next;
int t=0;//时钟,用于记录进程运行的时间
while(p->run_time!=0||p->next!=NULL)
{
if(p->run_time)
{
p->run_time--;
printf("进程%c的剩余运行时间为:%d\n",p->name,p->run_time);
t++;
if(p->run_time==0)
{
p->state='C';
p->zz_time=maxreachtime+1-p->reach_time+t;
p->dqzz_time=(float)p->zz_time/p->rt;
}
PCB* q=p;
if(p->next!=NULL)
{
p=p->next;
//inserttoend(head);
PCB* t=head;
while(t->next!=NULL)t=t->next;
PCB* r=head;
while(r->next!=q)r=r->next;
r->next=q->next;
t->next=q;
q->next=NULL;
}
}
else p=p->next;
}
output(head,nums);
}
#include<stdlib.h>
typedef struct p //PCB结构体
{
char name;
int reach_time; //到达时间
int run_time; //运行时间
int com_time; //完成时间
int zz_time; //周转时间
float dqzz_time;//带权周转时间
char state; //运行状态
struct p *next; //连接指针
int rt;
}PCB;
//定义存放nums个进程PCB的链表的头结点;
PCB* linkinit() //初始化链表的头结点;
{
PCB* head1;
head1=(PCB *)malloc(sizeof(PCB));
head1->next=NULL;
return head1;
}
//往链表中添加进程PCB节点;
void linkadd(PCB* head)
{
PCB* r,* q=head;
r=(PCB *)malloc(sizeof(PCB));
while(q->next)q=q->next;
void inputdata(PCB* r);
inputdata(r);
r->next=q->next;
q->next=r;
}
//向链表PCB节点内容中输入数据
void inputdata(PCB* r)
{
printf("进程名:");scanf("\n%c",&r->name);
printf("到达时间:");scanf("%d",& r->reach_time);
printf("运行时间:");scanf("%d",& r->run_time);
}
//以“到达时间”的从大到小的顺序对链表进行排序
void seq(PCB* head)
{
PCB* h=head;
while(h->next->next)
{
PCB* p=h->next,*q=h->next;
while(q->next)
{
q=q->next;
if(p->reach_time > q->reach_time)
p=q;
}
PCB* r=h;
while(r->next!=p)
r=r->next;
r->next=p->next;
p->next=h->next;
h->next=p;
h=h->next;
}
}
//求最大的到达时间
int mrtime(PCB* head)
{
PCB* p=head;
while(p->next)
p=p->next;
int maxreachtime=p->reach_time;
return maxreachtime;
}
//将各个进程运行时间的初始值赋给p->rt;在求"带权周转时间"的时候要用到
void runtort(PCB* head)
{
PCB* p=head;
do
{
p=p->next;
p->rt=p->run_time;
}while(p->next);
}
void output(PCB* head,int nums)
{
PCB* t=head;
int zzs_time=0;float dqzzs_time=0.00;
while(t->next!=NULL)
{
t=t->next;
printf("进程名:%c\n",t->name);
printf("\t周转时间:%d\n",t->zz_time);
printf("\t带权周转时间:%f\n",t->dqzz_time);
zzs_time=zzs_time+t->zz_time;
dqzzs_time=dqzzs_time+t->dqzz_time;
}
printf("\n平均周转时间:%f\n",(float)zzs_time/nums);
printf("平均带权周转时间:%f\n",(float)dqzzs_time/nums);
}
void main()
{
int nums;
printf("请输入要运行的进程个数:");
scanf("%d",&nums); //nums代表要运行的进程的个数;
PCB* head;
head=linkinit();
for(int i=1;i<=nums;i++)
linkadd(head);
seq(head); //对PCB链表中的节点进行“运行时间”的排序(小-->大)
int maxreachtime=mrtime(head);
runtort(head); //将运行时间的初值赋给p->rt
PCB* p=head->next;
int t=0;//时钟,用于记录进程运行的时间
while(p->run_time!=0||p->next!=NULL)
{
if(p->run_time)
{
p->run_time--;
printf("进程%c的剩余运行时间为:%d\n",p->name,p->run_time);
t++;
if(p->run_time==0)
{
p->state='C';
p->zz_time=maxreachtime+1-p->reach_time+t;
p->dqzz_time=(float)p->zz_time/p->rt;
}
PCB* q=p;
if(p->next!=NULL)
{
p=p->next;
//inserttoend(head);
PCB* t=head;
while(t->next!=NULL)t=t->next;
PCB* r=head;
while(r->next!=q)r=r->next;
r->next=q->next;
t->next=q;
q->next=NULL;
}
}
else p=p->next;
}
output(head,nums);
}