C语言编程实现时间片轮转算法,尽量写得简单易懂,谢谢

C语言编程实现时间片轮转算法,尽量写得简单易懂,谢谢,第1张

#include<stdlib.h>

#define MAX 5//进程数量

#define RR 2//判稿陵时间片大小

/*时间片轮转算法*/

struct pro

{

int num

int arriveTime

int burst

int rt //记录进程被运行的次数

struct pro *next

}

int TOTALTIME //记录所有进程的总时间

//函数声明

struct pro* creatList()

void insert(struct pro *head,struct pro *s)

struct pro* searchByAT(struct pro *head,int AT)

void del(struct pro* p)

int getCount(struct pro *head,int time)

struct pro* searchEnd(struct pro *head)

void move(struct pro *headF,struct pro *headT,int n)

struct pro* creatList()//创建链表,按照进程的到达时间排列,记录所有进程的信息

{

struct pro* head=(struct pro*)malloc(sizeof(struct pro))

head->next=NULL

struct pro* s

int i

TOTALTIME=0

for(i=0i<MAXi++)

{

s=(struct pro*)malloc(sizeof(struct pro))

printf("请输入进程名:\n")

scanf("%d",&(s->num))

printf("请输入到达时间:\n")

scanf("%d",&(s->arriveTime))

printf("请输入运行时间:\n")

scanf("%d",&(s->burst))

TOTALTIME+=s->burst //计算总时间

s->rt=1 //rt的初始值为1

s->next=NULL

insert(head,s)

}

return head //到达队列中的进程按照其到达时间的先后顺序排列

}

void insert(struct pro *head,struct pro *s)//插入节点

{

struct pro *p=searchByAT(head,s->arriveTime)

s->next=p->next

p->next=s

return

}

struct pro* searchByAT(struct pro *head,int AT)//查找第一个到达时间大于等于AT的节点,返回其前一个指针

{

struct pro *p,*q

p=head

q=head->next

while(q!=NULL&&q->arriveTime<=AT)

{

p=q

q=q->next

}

return p

}

void del(struct pro* p)//删除p的下一个节掘戚点

{

struct pro *tmp

tmp=p->next

p->next=tmp->next

free(tmp)

return

}

int getCount(struct pro *head,int time)//察看在time之前到达但未移动到运行队列的进程数量敬局

{

int count=0

struct pro *s,*t

s=head

t=s->next

while(t!=NULL&&t->arriveTime<=time)

{

s=t

t=t->next

count++ //count记录当前时刻到达的进程数

}

return count

}

struct pro* searchEnd(struct pro *head)//查找并返回循坏队列的尾节点的前一个节点

{

struct pro *p,*q

p=head

q=head->next

while(q->next!=head)

{

p=q

q=q->next

}

return p

}

void move(struct pro *headF,struct pro *headT,int n)//将headF后的n个节点移动到循环队列headT中

{

struct pro *r,*s,*t

s=headF

t=s->next

r=t //r记录要移动的第一个节点

while(n>1)

{

t=t->next

n--

}

s->next=t->next //以上完成从原队列中摘除相关节点,r,t分别为第一个和最后一个节点

s=searchEnd(headT)

t->next=s->next

s->next=r

}

void run(struct pro *head)

{

int time=0 //记录当前时间

int newarrive//新到达进程数

struct pro *runhead=(struct pro*)malloc(sizeof(struct pro))

runhead->next=runhead //创建新的循环链表,存放当前就绪队列中的进程

struct pro *p,*q

p=runhead

q=p->next //q记录当前应当运行的进程

while(time<=TOTALTIME)

{

newarrive=getCount(head,time)

if(newarrive>0)

move(head,runhead,newarrive) //将head后的newarrive个节点移动到runhead队列中

if(runhead->next==runhead)//就绪队列中没有进程

time++

else if(q==runhead)

{

p=q

q=q->next

}

else

{

printf("进程名:%d\n",q->num)

printf("到达时间:%d\n",q->arriveTime)

if(q->rt==1)

printf("响应时间:%d\n",time-q->arriveTime)

else

printf("第%d次运行开始时间:%d\n",q->rt,time)

if(q->burst<=RR)

{

time+=q->burst

printf("第%d次运行结束时间:%d\n",q->rt,time)

printf("周转时间:%d\n",time-q->arriveTime)

printf("************************************\n")

struct pro *tmp=q

q=q->next

p->next=q

free(tmp)

}

else//q->burst>RR

{

time+=RR

printf("第%d次运行结束时间:%d\n",q->rt,time)

printf("************************************\n")

q->burst-=RR

q->rt++

p=q

q=q->next

}

}

}

}

void main()

{

struct pro *head=creatList()

printf("当前时间片大小为:%d\n",RR)

run(head)

}

#include<stdio.h>

struct pcb

{

char name

int time

}

void main()

{

int n,i,j,flag=1

struct pcb a[100]

printf("输入程序个数:")

scanf("%d",&n)

getchar()/*接收回车*/

for(i=0i<ni++)

{

printf("老喊告输入程序的名字:如A B C...\n")

scanf("%c"渗困,&a[i].name)

getchar()/*接收回车*/

printf("输入占侍明用的时间片:")

scanf("%d",&a[i].time)

getchar()/*接收回车*/

}

i=0

while(flag &&n>0)

{

if(a[i].time!=0)

{

printf("%c",a[i].name)

a[i].time--

}

for(j=0j<nj++)

if(a[j].time)

{

flag=1

break

}

else

flag=0

i=(++i)%n

}

}

调试通过...


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12509898.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存