#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();
}
评论0