优先数调度算法实现文库.doc_第1页
优先数调度算法实现文库.doc_第2页
优先数调度算法实现文库.doc_第3页
优先数调度算法实现文库.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include stdafx.h#include #include #include #include struct PCB/定义一个进程结点数据域char name3;/进程名int run_time;/运行时间int level;/优先数char state;/运行状态struct PCB *next;/指向下一个结点的指针;struct PCB *creat()/创建一个函数,用于返回一个链表int i = 1;int time, slevel;/用来存储用户输入struct PCB *head, *tail, *temp, *previous;/申明指针char PCB_name53 = P1, P2, P3, P4, P5;/初始化进程名数组temp = (struct PCB *)malloc(sizeof(struct PCB);/给temp指针分配内存printf(请输入第1个结点的优先数: );scanf(%d, &slevel);printf(请输入第1个结点的运行时间: );scanf(%d, &time);temp-level = slevel;/将输入的优先数赋值给temp结点的优先数strcpy(temp-name, PCB_name0);/将PCB_name0复制给temp结点temp-next = NULL;/temp结点的下一个为空temp-run_time = time;/获取输入的运行时间temp-state = R;/运行状态为就绪head = tail = temp;/指向当前第一个结点while (i != 5)/i的初值为1,这里不等于5,意思就是继续添加四个结点temp = (struct PCB *)malloc(sizeof(struct PCB);/分配一段新的内存给tempprintf(请输入第%d个结点的优先数: , i + 1);scanf(%d, &slevel);printf(请输入第%d个结点的运行时间: , i + 1);scanf(%d, &time);temp-level = slevel;/同上strcpy(temp-name, PCB_namei);temp-run_time = time;temp-state = R;if (temp-level head-level)/比较当前定义的结点的优先数与head的优先数,同时head指向的结点的优先数是最大的temp-next = head;/如果前定义的结点的优先数与head的优先数大,则head指向当前定义的结点head = temp;elseprevious = head;while (previous-next != NULL)/如果比优先数最大的结点小,则继续与后面的节点进行比较,知道找到一个合适的位置,即为比前面结点的优先数大,比后面的小if (temp-level level) & (temp-level = (previous-next)-level)temp-next = previous-next;/交换两个结点的位置previous-next = temp;break;elseprevious = previous-next;/实现往后移if (previous-next = NULL)/如果没有找到比当前结点小的,则将当前结点放在最后面tail-next = temp;temp-next = NULL;tail = temp;i+;return (head);/返回一个链表的头结点void display(struct PCB *p)/用于输出当前链表中各结点的状态while (p != NULL)printf(t%s, p-name); printf(t%d, p-run_time); printf(t%d, p-level); printf(t%c, p-state); printf(t%sn, p-next-name);p = p-next;/实现往后移void main( void )struct PCB *head, *tail, *p;head = creat();/调用函数creat,head指向头结点p = head;tail = p;printf(初始进程的情况: n); display(p);/显示当前结点的情况 while(head-next != NULL)/判断当前链表中的结点是否不止一个 struct PCB *q = head;struct PCB *previous;tail = head;while (tail-next != NULL)/将tail指针指向尾结点tail = tail-next;printf(最新进程调度的情况: n); printf(%s-,head-name);/输出最近调用的进程名display(q);/显示当前调用情况head-level-;/优先数减1 head-run_time-;/运行时间减1 if(head-run_time state = E; head = head-next; elseprevious = head;/判断其他情况p = previous-next;if (previous-level p-level)/如果当前运行过的结点的优先数仍然是最大的,跳出本次循环continue;elsewhile (p-next != NULL)/否则,在链表中重新找到当前运行结点的位置/这个用于判断,运行过的结点与后面的比较情况是否为比前一个结点的优先数大比后一个结点的优先数小,如果是,将该节点插入其中,否则,往后移,直到找到一个这样的位置,或者运行到链表结束if (previous-level level) & (previous-level = p-next-level)head = previous-next;previous-next = p-next;p-next = previous;break;elsep = p-next;/实现往后移if (p-next = NULL)/如果p-next为空的话,表示当前运行的结点的优先数最小,则将它放在链表的尾部head = previous-next;tail-next = previous;previous-next = NULL; if (head-next = NULL)/如果当前链表中只存在一个结点则进入判断内部while (head-run_time !=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论