有一个时间片轮转的进程切换算法,编译通过的,就是运行时候老出错,实在不知道什么问题了,请高手帮忙看一下,谢了。。。
Quote:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct node
{
char name[10]; /*进程标识符*/
int rtime; /*进程占用CPU时间*/
int ntime; /*进程到完成还要的时间*/
char state; /*进程的状态*/
struct node *next; /*链指针*/
}PCB;
struct node *ready,*run,*tail,*finish; /*队列指针*/
int N; /*进程数*/
int T=1;//时间片
/*轮转法创建N个进程PCB并放进ready队列*/
void create()
{
int i;
printf("请输入进程数:");
scanf("%d",&N); /*输入进程数*/
printf("\n***请输入进程名和进程所需运行的时间***\n");
for(i=1;i<=N;i++)
{
/*初始化进程信息*/
PCB *p;
p=(PCB *)malloc(sizeof(PCB));
printf("\n 进程名:");
scanf("%s",&p->name);
printf("\n 进程运行时间:");
scanf("%d",&p->ntime);
p->rtime=0;
p->state='R';
tail->next=p;//新进程插入ready队尾
tail=tail->next;
}
}
/*输出进程q的属性信息*/
void printq(PCB *q)
{
/*轮转法的输出*/
printf(" name rtime ntime state\n");
printf(" %-10s%-10d%-10d%-c\n",q->name,
q->rtime,q->ntime,q->state);
}
/*输出正在运行的进程的属性信息*/
void printrun()
{
printf("\n **** 当前正在运行的是进程:%s\n",run->name);
printq(run);
}
/*运行ready队列中的进程*/
void running()
{
if(ready->next!=NULL)
{
while(1)
{
run=ready->next;//取对头
ready->next=ready->next->next;
run->state='R';
run->rtime=run->rtime+T;
run->ntime=run->ntime-T;
printrun();
if(run->ntime==0)
{
run->next=finish;//将run进程放进finish队头
finish=run;
printf("\n\n 进程已经完成.\n");
run->state='F';
run=NULL;
}
else
{
tail->next=run;
tail=tail->next;//将run进程放进ready队尾
run=NULL;
}
}
}
else printf("ready队列为空");
}
/*主函数*/
main()
{
run=NULL;
ready=(PCB *)malloc(sizeof(PCB));//ready队列头结点
ready->next=NULL;
tail=ready;
create();
running();
}