⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adfa.cpp

📁 操作系统的进程管理模拟,可完成基本模拟,在visual c++下运行
💻 CPP
字号:
#include"stdio.h"
#include"stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2 
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

LinkList La,Lb,Lc;
Status i;
void menu();

Status InitList(LinkList *L)
 { 
   *L=(LinkList)malloc(sizeof(struct LNode)); 
   if(!*L) 
     exit(OVERFLOW);
   (*L)->next=NULL; 
   return OK;
 }

Status ListEmpty(LinkList L)
 { 
   if(L->next) 
     return FALSE;
   else
     return TRUE;
 }

int ListLength(LinkList L)
 { 
   int i=0;
   LinkList p=L->next; 
   while(p) 
   {
     i++;
     p=p->next;
   }
   return i;
 }

void CreateList_L(LinkList *L,int n)
 { 
   int i;
   LinkList p,q;
   *L=(LinkList)malloc(sizeof(struct LNode)); 
   (*L)->next=NULL;
   q=*L;
   printf("请输入%d个进程的名字:",n);
   for(i=1;i<=n;i++)
   {
     p=(LinkList)malloc(sizeof(struct LNode));
     scanf("%d",&p->data);
     q->next=p;
     q=q->next;
   }
   p->next=NULL;
 }

Status ListInsert_L(LinkList *L,int i,ElemType e)
{
	int j;
    LinkList s,p;
	p=*L;j=0;
	while(p&&j<i-1)
	{
		p=p->next;++j;
	}
	if(!p||j>i-1)return ERROR;
	s=(LinkList)malloc(sizeof(LNode));
	s->data=e;s->next=p->next;
	p->next=s;
	return OK;
}

Status ListDelete_L(LinkList *L,int i,ElemType *e) 
 { 
   int j=0;
   LinkList p=*L,q;
   while(p->next&&j<i-1) 
   {
     p=p->next;
     j++;
   }
   if(!p->next||j>i-1) 
     return ERROR;
   q=p->next; 
   p->next=q->next;
   *e=q->data;
   free(q);
   return *e;
 }

Status comp(ElemType c1,ElemType c2)
 { 
   if(c1==c2)
     return TRUE;
   else
     return FALSE;
 }

int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
 { 
   int i=0;
   LinkList p=L->next;
   while(p)
   {
     i++;
     if(compare(p->data,e)) 
       return i;
     p=p->next;
   }
   return 0;
 }

Status ListTraverse(LinkList L,void(*vi)(ElemType))
 { 
   LinkList p=L->next;
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   printf("NULL");
   printf("\n");
   return OK;
 }

void visit(ElemType c) 
 {
   printf("%d->",c);
 }

void out()
{
  printf("\n执行队列:");
  ListTraverse(Lb,visit);
  printf("\n");
  printf("就绪队列:");
  ListTraverse(La,visit);
  printf("\n");
  printf("等待队列:");
  ListTraverse(Lc,visit);
  printf("\n");
}

void build()
{
   int x;
   printf("\n需要运行进程的个数为:");
   scanf("%d",&x);
   CreateList_L(&La,x); 
   out();
}

void one()
{
  int j,x;
  if(ListEmpty(Lb)&&!ListEmpty(La))
  {j=ListDelete_L(&La,1,&x);
   i=ListInsert_L(&Lb,1,j);
   if(i==1)
   {
	 out();
	}
   else printf("操作失败!\n\n");
  }
  else
  {
    if(!ListEmpty(Lb))
	{
	  out();
      printf("已经有进程在执行了!\n\n");
	} 		
    if(ListEmpty(Lb)) 
	{
	  out();
      printf("就绪对列没有进程可执行了!\n\n");
	} 		
  }
  menu();
}

void two()
{
  int j,x,k;
  i=ListEmpty(Lc);
  if(!i)
  {j=ListDelete_L(&Lc,1,&x);
   k=ListLength(La);
   i=ListInsert_L(&La,k+1,j);
   if(i==1)
   {
	 out();
	}
   else printf("操作失败!\n\n");
  }
  else 
  {
	out();
    printf("等待队列中没有进程了!\n\n");
  }     
  menu();
}

void three()
{
  int j,x,k;
  i=ListEmpty(Lb);
  if(!i)
  {j=ListDelete_L(&Lb,1,&x);
   k=ListLength(Lc);
   i=ListInsert_L(&Lc,k+1,j);
   if(i==1)
   {
	 out();
	}
   else printf("操作失败!\n\n");
  }
  else 
  {
	out();
    printf("没有进程正在执行!\n\n");
  } 	  
  menu();
}

void four()
{
  int k,x;
  printf("请输入需要增加进程的名字:");
  scanf("%d",&x);
  k=ListLength(La);
  i=ListInsert_L(&La,k+1,x);
  if(i==1)
   {
	 out();
	}
   else printf("操作失败!\n\n");
  menu();
}

void five()
{
 int x,o,p,q;
 printf("请输入需要结束进程的名字:");
 scanf("%d",&x);
 o=LocateElem(La,x,comp);
 p=LocateElem(Lb,x,comp);
 q=LocateElem(Lc,x,comp);
 if((o||p||q)) 
 {
   if(o) ListDelete_L(&La,o,&x);
   if(p) ListDelete_L(&Lb,p,&x);
   if(q) ListDelete_L(&Lc,q,&x);
   out();
 }
 if(!(o||p||q)) 
 {
   out();
   printf("需要结束的进程不存在!\n\n");
  } 
 menu();
}

void menu()
{ 
  int n;
  printf("请选择操作:1.执行进程  ");
  printf("2.等待进程进入就绪进程  ");
  printf("3.封锁进程\n");
  printf("\t   4.新增进程  ");
  printf("5.结束进程  ");
  printf("6.退出操作\n\n");
  printf("请输入你要进行的操作:");
  do 
	{
	  scanf("%d",&n);
	  if(n<0||n>6)
		  printf("输入错误,重新输入:");
	 }while(n<1||n>6);
	 switch(n)
	 {
	  case 1:{one();break;}
	  case 2:{two();break;}
	  case 3:{three();break;}
	  case 4:{four();break;}
      case 5:{five();break;}
	 }
}

void main()
 {
	printf("\t\t\t进程管理(进程名用数字表示)");
	InitList(&Lb);
	InitList(&Lc);
	build();
	menu();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -