struct poly {char name[2];//进程名称 int time;//完成进程所需的时间
struct poly *next; };
struct poly *newlink(void) //建立反馈队列,使用尾插法 {
struct poly *p1, *head, *p2;
p1 = ( struct poly* )malloc( sizeof(struct poly ) ); p1->name[0]=0;p1->time=0; head = p1;
while( p1->name[0]!='#') {
p2 = ( struct poly* )malloc( sizeof(struct poly) );
printf( \"请输入进程名称和完成该进程所需的时间(以#结
束):\" );
scanf(\"%s%d\ p1->next=p2; p1=p2; }
p1->next = NULL; p1=head->next;
printf(\"队列进入第一级链栈,初始情况为:\\n\");
printf(\"name\\time\"); printf(\"\\n\");
while(p1->name[0]!='#') {
printf(\"%s\\ %d\\n\ p1=p1->next; }
return head; }
//-------------------------------------------------------void feedback3(struct poly *head3)
//进入第三级反馈队列,时间片长度为32.且第三级链表设为循环链表格式 {
struct poly *p1,*p2; int t=32; int n=0;
p1=head3->next;
printf(\"\\n\\n第二级队列运行完后,第三级队列的初始情况为:\\n\"); printf(\"name\\time\"); printf(\"\\n\");//right while(p1->next!=head3) {
printf(\"%s\\ %d\\n\ p1=p1->next; }
printf(\"%s\\ %d\\n\p1=head3->next;
while(head3->next!=head3) {
p1->time=p1->time-t; if(p1->time>0) {
printf(\"\\n%s经32个时间片后还余%d个时间片,进入三级队列
的队尾等待下次执行\
p1=p1->next; } else {
if(p1->next!=head3) {
printf(\"进程%s经32个时间片后结束,可以将其从内存中移
除!\
strcpy(p1->name,p1->next->name); p1->time=p1->next->time; p2=p1->next;
p1->next=p2->next; free(p2); } else {
printf(\"\\n进程%s经32个时间片后结束,可以将其从内存
中移除!\\n此时所有进程均已调试结束!\\n\
free(p1);free(head3);//所有进程都已经结束,将队列中
剩余的点删除.
break; } }
if(p1=head3) {
n++;
p1=head3->next;
printf(\"\\n经%d次工作后队列三中还有的队列为:\printf(\"\\nname\\time\\n\"); while(p1->next!=head3) {
printf(\"%s\\ %d\\n\ p1=p1->next;
}
printf(\"%s\\ %d\\n\ p1=head3->next; } } }
//------------------------------------------------------- void feedback2(struct poly *head2) //进入第二级反馈队列,时间片为16 {
struct poly *p1;
struct poly *head3,*p31,*p32; int t=16;
p1=head2->next;
printf(\"\\n\\n第一级队列运行完后,第二队列中的初始情况为:\\n\"); printf(\"name\\time\"); printf(\"\\n\");
while(p1->name[0]!='#') {
printf(\"%s\\ %d\\n\ p1=p1->next; }
p31=(struct poly*)malloc(sizeof(struct poly)); head3=p31;
p1=head2->next;
while(p1->name[0]!='#') {
p1->time=p1->time-t; if(p1->time>0) {
p32=(struct poly*)malloc(sizeof(struct poly)); strcpy(p32->name,p1->name); p32->time=p1->time; p31->next=p32; p31=p32;
printf(\"\\n进程%s,运行完16个时间片后还剩余%d个时间片,
进入三级反馈队列!\
} else {
printf(\"\\n进程%s经16个时间片后结束,可以将其从内存中移
除!\
}
head2=p1;
p1=p1->next;//每读取完一个数据并对它进行操作后就将该节点释
放
free(head2); }
free(p1);
p31->next=head3; feedback3(head3); }
//-------------------------------------------------------void feedback1(struct poly *head1) //第一级反馈队列,时间片为8 {
struct poly *p1;
struct poly *head2,*p21,*p22; int t=8; int i;
p1=head1->next;
p21=(struct poly*)malloc(sizeof(struct poly)); head2=p21;
while(p1->name[0]!='#') {
p1->time=p1->time-t; if(p1->time>0) {
p22=(struct poly*)malloc(sizeof(struct poly)); strcpy(p22->name,p1->name); p22->time=p1->time; p21->next=p22; p21=p22;
printf(\"\\n进程%s,运行完8个时间片后还剩余%d个时间片,进
入二级反馈队列!\
} else {
printf(\"\\n进程%s经8个时间片后结束,可以将其从内存中移
除!\
//队列一的话不需要将该节点从链表中删除,所以可以简单地表示
成这样。实际并没有释放该节点 }
head1=p1;
p1=p1->next;//每读取完一个数据并对它进行操作后就将该节点释
放
free(head1); }
free(p1);
p22=(struct poly*)malloc(sizeof(struct poly)); p22->name[0]='#'; p21->next=p22; feedback2(head2); }
//------------------------------------------------- void main() {
struct poly *head1; }
//printf(\"请输入进程名称及完成该进程所需的时间(以#号结束)\"); head1=newlink();
feedback1(head1);//进入第一级反馈队列