根据这个结构体struct pcb { /* 定义进程控制块PCB */ char name[10]; char state; //int super; int ntime; int rtime; struct pcb* link; }*ready1=NULL,*ready2=NULL,*ready3=NULL,*p,*last1,*last2,*last3;实现上述几个函数
时间: 2023-07-23 19:10:51 浏览: 156
好的,下面我将根据给出的 PCB 结构体定义来实现上述函数,供您参考。
1. input 函数:
```
void input(struct pcb *p) {
printf("请输入进程名:");
scanf("%s", p->name);
printf("请输入进程优先级:");
scanf("%d", &(p->super));
printf("请输入进程运行时间:");
scanf("%d", &(p->ntime));
p->rtime = 0; // 初始运行时间为0
p->state = 'W'; // 初始状态为等待状态
p->link = NULL; // 初始时没有下一个进程
}
```
2. check 函数:
```
void check(struct pcb *ready) {
struct pcb *p = (struct pcb *)malloc(sizeof(struct pcb)); // 新建一个 PCB
input(p); // 输入新进程的信息
if (p->super > ready->super) { // 如果新进程的优先级高于队列中第一个进程的优先级
p->link = ready; // 将新进程插入到队列头部
ready = p; // 更新队列头指针
} else { // 如果新进程的优先级低于等于队列中第一个进程的优先级
struct pcb *q = ready;
while (q->link != NULL && q->link->super >= p->super) {
q = q->link;
}
p->link = q->link;
q->link = p;
}
}
```
3. running 函数:
```
void running(struct pcb *p) {
p->rtime++; // 模拟进程运行
}
```
4. sort 函数:
```
void sort(struct pcb *ready) {
if (ready == NULL || ready->link == NULL) { // 如果队列为空或只有一个进程,则不需要排序
return;
}
struct pcb *p, *q, *tail = NULL;
int exchange = 1; // 标记是否需要继续排序
while (exchange) {
exchange = 0;
p = ready;
while (p->link != tail) {
q = p->link;
if (p->super < q->super) { // 如果前一个进程的优先级低于后一个进程的优先级
struct pcb *tmp = p;
p = q;
q = tmp;
exchange = 1;
}
p = p->link;
}
tail = p;
}
}
```
需要注意的是,在这里我将上述结构体中的 ntime 字段作为进程的总运行时间,而将 rtime 字段作为进程已经运行的时间。另外,这里的 sort 函数使用的是冒泡排序算法,你也可以根据实际情况使用其他排序算法。
阅读全文