📄 jincheng.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NULL 0
typedef struct PolyNode{ //创建结构体
int id;
char *name;
int youxianji;
int state;
struct PolyNode *next;
}PolyNode;
void InitList(PolyNode *&sq,int s,int n,int *m){//初始化链表
sq=(PolyNode *)malloc(sizeof(PolyNode));
sq->next=NULL;
PolyNode *p,*q=sq;
for(int i=0;i<n;i++){
p=(PolyNode *)malloc(sizeof(PolyNode));
p->id=1+(*m);
p->state=s;
p->name="proc";
p->youxianji=i;
p->next=NULL;
q->next=p;
q=p;
(*m)++;
}
}
void InsertPloy(PolyNode *&sq1,PolyNode *&sq2,PolyNode *&sq3,int *m,int n,int o){//创建进程
PolyNode *p,*q,*s;
switch(n){
case 1: p=sq1->next;
q=(PolyNode *)malloc(sizeof(PolyNode));
q->id=1+(*m);
q->name="proc";
q->next=NULL;
q->state=1;
q->youxianji=o;
while(p->next) p=p->next;
p->next=q;
(*m)++;
break;
case 2: p=sq2->next;
q=(PolyNode *)malloc(sizeof(PolyNode));
q->id=1+(*m);
q->name="proc";
q->next=NULL;
q->state=2;
q->youxianji=o;
while(p->next) p=p->next;
p->next=q;
(*m)++;
break;
case 3: p=sq3->next;s=sq1->next;p->state=1;
q=(PolyNode *)malloc(sizeof(PolyNode));
q->id=1+(*m);
q->name="proc";
q->next=NULL;
q->state=3;
q->youxianji=o;
sq3->next=q;
while(s->next) s=s->next;
s->next=p;
(*m)++;
break;
}
}
void DelPloy(PolyNode *&sq1,PolyNode *&sq2,PolyNode *&sq3,int n){//撤销进程
PolyNode *p=sq1,*q=NULL,*s;
while(p->next) {
if(p->next->id==n){s=p;q=p->next;break;}
p=p->next;
}
p=sq2;
while(p->next) {
if(p->next->id==n){s=p;q=p->next;break;}
p=p->next;
}
p=sq3;
while(p->next) {
if(p->next->id==n){s=p;q=p->next;break;}
p=p->next;
}
if(q==NULL)printf("进程号输入错误!不能完成操作.\n");
else {s->next=q->next;free(q);}
}
void DispList(PolyNode *sq){ //显示链表
PolyNode *p=sq->next;
while(p)
{
char *c;
switch(p->state){
case 1:c="就绪"; break;
case 2:c="阻塞"; break;
case 3:c="运行";break;
}
printf("%d\t%s%d\t%d\t%s\n",p->id,p->name,p->id,p->youxianji,c);
p=p->next;
}
}
void ZusePloy(PolyNode *&sq1,PolyNode *&sq2,PolyNode *&sq3){//阻塞进程
printf("阻塞正在运行的进程!\n");
PolyNode *p=sq1->next,*q=sq2,*s=sq3->next,*m=p,*n;
while(p){
if(p->youxianji<m->youxianji) m=p;
p=p->next;
}
p=sq1;
while(p->next){
if(p->next==m){n=p;break;}
p=p->next;
}
n->next=m->next;m->next=NULL;
sq3->next=m;m->state=3;//运行就绪程序
while(q->next) q=q->next;
q->next=s;
s->state=2;//阻塞进程
}
void HuanxingPloy(PolyNode *&sq1,PolyNode *&sq3){//唤醒进程
printf("唤醒阻塞的进程!\n");
PolyNode *p=sq1->next,*s=sq3->next,*m=p,*n;
while(p){
if(p->youxianji<m->youxianji) m=p;
p=p->next;
}
p=sq1;
while(p->next){
if(p->next==m){n=p;break;}
p=p->next;
}
n->next=m->next;m->next=NULL;
sq3->next=m;m->state=3;//运行就绪程序
while(p->next) p=p->next;
p->next=s;
s->state=1;//就绪进程
}
void JiuxuPloy(PolyNode *&sq1,PolyNode *&sq2){//I/O完成,就绪进程
printf("就绪阻塞的进程!\n");
PolyNode *p=sq2->next,*s=sq1->next,*m=p,*n;
while(p){
if(p->youxianji<m->youxianji) m=p;
p=p->next;
}
p=sq2;
while(p->next){
if(p->next==m){n=p;break;}
p=p->next;
}
n->next=m->next;m->next=NULL;
m->state=1;//就绪进程
while(s->next) s=s->next;
s->next=m;
}
void print(PolyNode *sq1,PolyNode *sq2,PolyNode *sq3){
printf("进程号\t进程名\t先级别\t状态\n");
DispList(sq1);DispList(sq2);DispList(sq3);
printf("\n");
}
void main() //主函数
{
PolyNode *sq1,*sq2,*sq3;
int s=0,*m=&s;
InitList(sq1,1,3,m);//就绪
InitList(sq2,2,4,m);//阻塞
InitList(sq3,3,1,m);//运行
printf("初始化进程:\n");
print(sq1,sq2,sq3);
int d=1,g;
while(d){
printf("请选择操作:1为创建进程,2为阻塞并唤醒就绪进程,3为就绪\n正在运行的进程,4为就绪阻塞的进程,5位撤销进程,6位退出\n");
scanf("%d",&g);
switch(g){
case 1:
int h,j;printf("请输入进程的状态(1-就绪,2-阻塞,3-执行)和优先级,用逗号隔开:\n");
scanf("%d,%d",&h,&j);
InsertPloy(sq1,sq2,sq3,m,h,j);print(sq1,sq2,sq3);break;
case 2:
ZusePloy(sq1,sq2,sq3);//阻塞
print(sq1,sq2,sq3);break;
case 3:
HuanxingPloy(sq1,sq3);//唤醒
print(sq1,sq2,sq3);break;
case 4:
JiuxuPloy(sq1,sq2);//I/O完成
print(sq1,sq2,sq3);break;
case 5:
printf("请输入要撤销的进程号:");int x;
scanf("%d",&x);
DelPloy(sq1,sq2,sq3,x);
print(sq1,sq2,sq3);break;
case 6:d=0;break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -