永发信息网

请高手帮忙看下这段代码哪里不对

答案:1  悬赏:10  手机版
解决时间 2021-04-25 06:45
  • 提问者网友:聂風
  • 2021-04-24 10:17


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define N 6 //进程数
#define T 2 //时间片的时间


struct proj
{
int pnum; //进程号
int ctime; //需要运行的时间,每循环一次减少t
int level; //每循环一次增加1
int over; //标志是否完成
}project[N]={
{0,2,0,0},{1,12,0,0},{2,20,0,0},{3,1,0,0},{4,2,0,0},{5,5,0,0}
};

int flag=1;

struct form
{
int pnum; //唯一标识
form * next;
}*p1=NULL,*p2=NULL,*p3=NULL; //共三个队列
form *head1=NULL,*head2=NULL,*head3=NULL,*r1=NULL,*r2=NULL,*r3=NULL;

int setline()
{
int i;
for(i=0;i<N || project[i].over==false;i++)
{
switch(project[i].level)
{
case 0:
p1=(form *)malloc(sizeof(form));
p1->pnum=project[i].pnum;
if(head1==NULL) head1=p1;
else r1->next=p1;
r1=p1;break;
case 1:
p2=(form *)malloc(sizeof(form));
p2->pnum=project[i].pnum;
if(head2==NULL) head2=p2;
else r2->next=p2;
r2=p2;break;
default:
p3=(form *)malloc(sizeof(form));
p3->pnum=project[i].pnum;
if(head3==NULL) head3=p3;
else r3->next=p3;
r3=p3;break;
}
}
if(r1!=NULL) r1->next=NULL;//return head1;
if(r2!=NULL) r2->next=NULL;//return head2;
if(r3!=NULL) r3->next=NULL;//return head3;
if (head1!=NULL) return 1; //第一列还有进程则先执行第一列
else if(head2!=NULL) return 2; //第二列还有进程则先执行第二列
else if(head3!=NULL) return 3; //第三列还有进程则执行第三列
else return 0; //全部执行完
}

void printchat()
{
printf("进程\t剩余时间\t所在队列\t是否完成\n");
for(int i=0;i<N;i++)
{
printf("%d\t\t%d\t\t%d\t\t%d\n",project[i].pnum,project[i].ctime,project[i].level,project[i].over);
if(project[i].over=0) flag=1;
}
}

bool work(int n)
{
flag=0;
int i,t=4;
form *p;
switch(n)
{
case 1:p=head1;break;
case 2:p=head2;break;
case 3:p=head3;
}
for(i=0;i<n;i++)
t*=T;
for(;p->next!=NULL;p=p->next)
{
project[p->pnum].ctime -= t;
if(project[p->pnum].ctime<=0)
project[p->pnum].over=1;
else// if(project[p->pnum].level<2)
{
project[p->pnum].level++;
project[p->pnum].over=0;
}
}
return true;
}

void main()
{
int i;
setline();
printf("初始状态:\n");
printchat();
for (i=0;flag;i++)
{
work(setline());
printf("第%d次循环后:\n",i+1);
printchat();
}
printf("全部完成!\n\n");
}

要实现多级反馈队列进程调度模拟 但似乎是FLAG的控制不对或者是WORK函数哪里不对了 但我自己实在找不出 请高手帮忙看看 找出问题我还给加分

最佳答案
  • 五星知识达人网友:孤独的牧羊人
  • 2021-04-24 10:55

一,修改进队条件int setline()
//添加进程到执行队列
for(i=0;i<N;i++)
{
if(project[i].over==1)
continue;


已经运行完的就跳过不处理


二,修改运行条件


bool work(int n)
{
switch(n)
{
case 0:flag=0;break;


所有队列空的话结束运行


三,修改了运行时,时间负数显示和队列等级


bool work(int n)


for(;p!=NULL;p=p->next)
{
project[p->pnum].ctime -= t;
project[p->pnum].level++;
if(project[p->pnum].ctime<=0)
{
project[p->pnum].over=1;
project[p->pnum].ctime=0;
}

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯