模拟进程创建,终止,阻塞,唤醒原语  编译环境VC   编译语言C
编译的时候通过了.  但是执行的时候  除了创建其他功能出现错误提示.导致程序崩溃.
实在找不到错误在哪啊.这样的情况应该怎么找到错误?   程序应该怎么改.
求助各位高手啊...万分感激!!!
C语言学的有点不扎实.可能有很多不该犯的错误.见谅#include "stdio.h"
#include "string.h"
#define N 10
#define NULL 0
typedef struct PCB{
char name[20],state;
int level,time;
struct PCB *next;
}*PCB,PNode;
PCB creat(){
PCB L;
L=(PCB)malloc(sizeof(PNode));
printf("Input PCB name:");
scanf("%s",&L->name);
printf("Input PCB level:");
scanf("%d",&L->level);
printf("Input PCB running time:");
scanf("%d",&L->time);
L->next=NULL;
return L;
}
PCB ready(PCB r,int *p,PCB L){
PCB s;
int i;
if(*p==0){
strcpy(&L->state,"ready");
(*p)++;
}
else if(*p!=0&&*p<11){
for(i=1;i<*p;i++)
s=r->next;
s->next=L;
strcpy(&L->state,"ready");
(*p)++;
}
else printf("Ready list overload!");
return r;
}
PCB block(PCB b,int *q,PCB L){
PCB s;
int i;
if(*q==0){
strcpy(&L->state,"block");
(*q)++;
}
else if(*q!=0&&*q<11){
for(i=1;i<*q;i++)
s=b->next;
s->next=L;
strcpy(&L->state,"ready");
(*q)++;
}
else printf("Block list overload!");
return b;
}
PCB wakeup(PCB r,int *p,PCB L){
PCB s;
s=ready(r,p,L);
return s;
}
void end(PCB a,PCB b,int *p,int *q){
PCB s,i;
int m;
char c[20];
printf("Input the name of PCB you want to end:");
scanf("%s",&c[20]);
if(a!=NULL){
if(a->next!=NULL){
i=a;
s=a->next;
m=strcmp(s->name,c[20]);
while(s!=NULL&&m!=0){
s=s->next;
i=i->next;
m=strcmp(s->name,c[20]);
}
if(m==0){
i->next=s->next;
free(s);
(*p--);
}
}
else{
m=strcmp(a->name,c[20]);
if(m==0){
free(a);
(*p--);
}
}
}
else if(b!=NULL){
if(b->next!=NULL){
i=b;
s=b->next;
m=strcmp(s->name,c[20]);
while(s!=NULL&&m!=0){
s=s->next;
i=i->next;
m=strcmp(s->name,c[20]);
}
if(m==0){
i->next=s->next;
free(s);
(*q)--;
}
}
else{
m=strcmp(b->name,c[20]);
if(m==0){
free(b);
(*q)--;
}
}
}
else printf("Does not exist!");
}
void show(PCB r,PCB b){
PCB s,q;
s=r;
q=b;
printf("Ready List:");
while(s!=NULL){
printf("%s",s->name);
s=s->next;
}
printf("Block List:");
while(q!=NULL){
printf("%s",q->name);
q=q->next;
}
}
void main(){
int i,*p,*q,x=0,y=0,m;
PCB La,r,b,o;
char a[20];
p=&x;q=&y;
while(i!=0){
printf("选择功能:(1.创建  2.阻塞  3.唤醒  4.终止  5.显示  0.退出)\n");
scanf("%d",&i);
switch(i){
case 1:La=creat();r=ready(r,p,La);break;
case 2:
printf("Input the name:");
scanf("%s",&a[20]);
if(r!=NULL){
o=r;
m=strcmp(o->name,a[20]);
while(o->next!=NULL&&m!=0){
o=o->next;
m=strcmp(o->name,a[20]);
}
if(m==0)
b=block(b,q,o);
else printf("Does not exist!");
}
else printf("Does not exist!");
break;
case 3:
printf("Input the name:");
scanf("%s",&a[20]);
if(b!=NULL){
o=b;
m=strcmp(o->name,a[20]);
while(o!=NULL&&m!=0)
o=o->next;
m=strcmp(o->name,a[20]);
if(m==0)
r=wakeup(r,p,o);
else printf("Does not exist!");
}
else printf("Does not exist!");
break;
case 4:end(r,b,p,q);break;
case 5:show(r,b);break;
case 0:break;                       
default:printf("Error!");break;
}
}
}