山东科技大学学生课程设计
struct process* list();//
void insert(struct process *head,struct process *p);// void delete(struct process *q);
int getcount(struct process *head,int time); struct process* end(struct process *head); void move(struct process *headf,struct process *headt,int n);
//void runrr(struct process *head);
struct process* list()//按到达时间排成一个队列 {
struct process *head=(struct
process*)malloc(sizeof(struct process)); head->next=NULL; struct process *p; int i;
totaltime=0;
printf(\请输入时间片大小:\ scanf(\
printf(\请输入进程的个数:\ scanf(\ for(i=0; i p=(struct pro*)malloc(sizeof(struct process)); printf(\ printf(\进程编号:\ scanf(\ printf(\进程名:\ scanf(\ printf(\到达时间:\ - 23 - 山东科技大学学生课程设计 scanf(\ printf(\运行时间:\ scanf(\ totaltime=totaltime+p->runtime; p->rrtime = 1;////////////////////////////////// p->next=NULL; insert(head,p); } return head; } void insert(struct process *head,struct process *p)//插入节点 { struct process *t=search(head,p->arrivetime); p->next=t->next; t->next=p; } struct process* search(struct process *head,int atime)//查找第一个到达时间小于atime的节点,返回其前一个的指针 { struct process *p,*q;///////////////////////// p=head; q=head->next; while(q!=NULL&&p->arrivetime<=atime) { p=q; q=q->next; } return p; - 24 - 山东科技大学学生课程设计 } void delete(struct process *q)//删除节点 { struct process *t; t=q->next; q->next=t->next; free(t); } int getcount(struct process *head,int time) //查看当前就绪队列中的进程数 { int rcount=0; struct process *p,*q;///////// p=head; q=p->next; while(q!=NULL&&q->arrivetime<=time) { p=q; q=q->next; rcount++; } return rcount; } struct process* end(struct process *head)//查找并返回循环队列队尾节点的前一个节点 { - 25 - 山东科技大学学生课程设计 struct process *p,*q; q=head; p=head->next; while(p->next!=head) { q=p; p=p->next; } return q; }; void move(struct process *headf,struct process *headt,int n)//将headF后的n个节点移动到循环队列的headT中 { struct process *r,*s,*t; s=headf; t=s->next; r=t;//q记录要移动的第一个节点 while(n>1) { t=t->next; n--; } s->next=t->next; s=end(headt); t->next=s->next; s->next=r; } void runrr(struct process *head) - 26 - 山东科技大学学生课程设计 { int time=0; int newcount;//记录新到达的进程数 struct process* runhead=(struct process*)malloc(sizeof(struct process)); runhead->next=runhead;//创建新的循环链表,存放当前就绪队列中的进程 struct process *p,*q; p=runhead; q=p->next;//p记录当前应运行的进程 while(time<=totaltime) { newcount=getcount(head,time); if(newcount>0) move(head,runhead,newcount);//将head后的newarrive个节点移动到runhead队列中 if(runhead->next==runhead) time++; else if(q==runhead) { p=q; q=q->next; } else { printf(\ printf(\现在开始运行进程:%s\\n\ printf(\进程编号:?\\n\ printf(\进程名:s\\n\ - 27 -