解释这段代码void sort(){ p->link=NULL; if(ready==NULL) ready=p; else{ if(p->super>ready->super){ p->link=ready; ready=p; } else { PCB*f=ready; while(1){ if(f->link==NULL){ f->link=p; return; } else if(p->super>f->link->super){ PCB*s=f->link; f->link=p; p->link=s; return; } f=f->link; } } } }
时间: 2024-02-29 20:53:45 浏览: 18
这段代码是一个简单的进程调度算法,主要功能是将进程按照优先级从高到低排序,并加入就绪队列。具体地,它首先将当前进程的链接指向空,然后检查就绪队列是否为空。如果为空,则将当前进程设置为就绪队列的头结点。如果就绪队列不为空,则将当前进程与就绪队列中的进程按照优先级进行比较。如果当前进程的优先级高于就绪队列的头结点,则将当前进程插入到就绪队列的头部。否则,它将遍历就绪队列,找到一个位置将当前进程插入到就绪队列中。具体地,它将遍历就绪队列,找到第一个优先级低于当前进程的进程,然后将当前进程插入到该进程之前。如果找不到这样的进程,则将当前进程插入到就绪队列的末尾。
相关问题
void EnterQueueOfPriority(PCBQueue *ready_queue,PCB *program) { PCB *p,*q; p=ready_queue->firstProg->next; q=ready_queue->firstProg; while(p) { if(p->priority<program->priority) { program->next=p; q->next=program; break; } q=p; p=p->next; } if(!p) { ready_queue->LastProg->next=program; ready_queue->LastProg=program; program->next=NULL; } ready_queue->size++;}给这个程序增加一条if语句,当达到时间相同时,优先级高的插入到前面
可以在原程序的if语句之前增加以下代码:
if(p->priority == program->priority && p->time == program->time) {
if(program->priority > ready_queue->firstProg->priority) {
program->next = ready_queue->firstProg;
ready_queue->firstProg = program;
} else {
program->next = p;
q->next = program;
}
break;
}
这段代码会先判断当前进程的优先级和时间是否与已有进程相同,如果是,则再判断当前进程的优先级是否比已有进程的优先级高,如果是,则将当前进程插入到队列的最前面。如果当前进程的优先级不高于已有进程,则继续按照原有的规则进行插入操作。
找出这个代码的错误并进行纠正:#include<stdio.h> #include<malloc.h> #include<conio.h> typedef struct tree { int data; struct tree*lchild; struct tree*rchild; }TREE; typedef struct stack { TREE*t; int flag; struct stack*link; }STACK; int push(STACK**top,TREE*tree) { STACK*p; p=(STACK*)malloc(sizeof(STACK)); p->t=tree; p->link=*top; *top=p; } int pop(STACK**top,TREE**tree) { STACK*p; if(*top==NULL) *tree=NULL; else { *tree=(*top)->t; p=*top; *top=(*top)->link; free(p); } } int SearchNode(TREE*tree, int key, TREE**pkpt, TREE**kpt) { *pkpt=NULL; *kpt=tree; while(*kpt!=NULL) { if((*kpt)->data==key) return 0; *pkpt=*kpt; if(key<(*kpt)->data) *kpt=(*kpt)->lchild; else *kpt=(*kpt)->rchild; } } int InsertNode(TREE**tree,int key) { TREE*p,*q,*r; SearchNode(*tree,key,&p,&q); if(q!=NULL) return 1; if((r=(TREE*)malloc(sizeof(TREE)))==NULL) return-1; r->data=key; r->lchild=r->rchild=NULL; if(p==NULL) *tree=r; else if(p->data>key) p->lchild=r; else p->rchild=r; return 0; } int DeleteNode(TREE**tree,int key) { TREE*p,*q,*r; SearchNode(*tree,key,&p,&q); if(q==NULL) return 1; if(p==NULL) if(q->lchild==NULL) *tree=q->rchild; else { *tree=q->lchild; r=q->lchild; while(r->rchild!=NULL) r=r->rchild; r->rchild=q->rchild; } else if(q->lchild==NULL) if(q==p->lchild) p->lchild=q->rchild; else p->rchild=q->rchild; else { r=q->lchild; r->rchild=q->rchild; if(q==p->lchild) p->lchild=q->lchild; else p->rchild=q->lchild; } free(q); return 0; }
这段代码存在以下错误:
1. push函数和pop函数的返回类型应该为void,因为它们没有返回值。
2. 在SearchNode函数中,如果key小于等于当前节点的值,应该将kpt指向左子节点,不然应该将kpt指向右子节点。
3. 在DeleteNode函数中,当q为要删除的节点时,如果p为NULL,应该将q的左子节点连接到q的右子节点的最左边节点,而不是最右边节点。
下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct tree {
int data;
struct tree *lchild;
struct tree *rchild;
} TREE;
typedef struct stack {
TREE *t;
int flag;
struct stack *link;
} STACK;
void push(STACK **top, TREE *tree) {
STACK *p;
p = (STACK*)malloc(sizeof(STACK));
p->t = tree;
p->link = *top;
*top = p;
}
void pop(STACK **top, TREE **tree) {
STACK *p;
if(*top == NULL) {
*tree = NULL;
}
else {
*tree = (*top)->t;
p = *top;
*top = (*top)->link;
free(p);
}
}
void SearchNode(TREE *tree, int key, TREE **pkpt, TREE **kpt) {
*pkpt = NULL;
*kpt = tree;
while(*kpt != NULL) {
if((*kpt)->data == key) {
return;
}
*pkpt = *kpt;
if(key <= (*kpt)->data) {
*kpt = (*kpt)->lchild;
}
else {
*kpt = (*kpt)->rchild;
}
}
}
int InsertNode(TREE **tree, int key) {
TREE *p, *q, *r;
SearchNode(*tree, key, &p, &q);
if(q != NULL) {
return 1;
}
if((r = (TREE*)malloc(sizeof(TREE))) == NULL) {
return -1;
}
r->data = key;
r->lchild = r->rchild = NULL;
if(p == NULL) {
*tree = r;
}
else if(p->data > key) {
p->lchild = r;
}
else {
p->rchild = r;
}
return 0;
}
int DeleteNode(TREE **tree, int key) {
TREE *p, *q, *r;
SearchNode(*tree, key, &p, &q);
if(q == NULL) {
return 1;
}
if(p == NULL) {
if(q->lchild == NULL) {
*tree = q->rchild;
}
else {
*tree = q->lchild;
r = q->lchild;
while(r->rchild != NULL) {
r = r->rchild;
}
r->rchild = q->rchild;
}
}
else if(q->lchild == NULL) {
if(q == p->lchild) {
p->lchild = q->rchild;
}
else {
p->rchild = q->rchild;
}
}
else {
r = q->lchild;
r->rchild = q->rchild;
if(q == p->lchild) {
p->lchild = q->lchild;
}
else {
p->rchild = q->lchild;
}
}
free(q);
return 0;
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)