最近碰到很多c的指针的问题,这个程序中的指针不知道哪里出问题了,希望大家能帮忙看下

#include "stdio.h"
#include
#include
struct custom {
int id;
int need;

int allocation;

int request;

struct custom *next;
}*L,*fir,*head;//结构体定义完毕
int input(int a,int b)//输入所有进程的所需资源数
{
custom *p;
head=(custom *)malloc(sizeof(custom));
int i;

L=head;
for(i=1;i<=a;i++)//建立单链表

{

p=(custom *)malloc(sizeof(custom));
printf("请输入第%d个函数的进程标识数",i);
scanf("%d",&p->id);
printf("请输入第%d个进程的所需资源:",i);
scanf("%d",&p->need);
printf("请输入第%d个进程的初始资源:",i);
scanf("%d",&p->allocation);
p->need=(p->need)-(p->allocation);
printf("当前进程还需资源数为%d\n",p->need);
b=b-(p->allocation);
printf("\n系统剩余资源数为:%d\n",b);
L->next=p;
L=p;
p->next=NULL;
}

 /*
 L=head->next;
 for(i=1;i<=a;i++)监测链表创立成功与否
 {
     printf("%d",L->id);
     L=L->next;

 }*/

 return b;

}
void find(int a,int b)//查询发出当前请求的函数
{

int i;

if(head==NULL)//链表头节点为空,即当前系统中无进程
{

printf("当前无进程!");
}
else
{
fir=head;
L=head->next;
for(i=0;i {
if(a==(int)L->id)
{
break;
}
else
{
fir=L;
L=L->next;
}
} //循环寻找匹配进程id号的进程
printf("已找到%d号进程!还需资源%d个。\n",L->id,L->need);
fir->next=L->next;//将该进程的前驱与后继相连 <-这里是出问题的地方,输入三个以上就会出现问题
L->next=NULL;//断开当前进程与链表直接按的链接,拿出进行单独操作
}
}
int commit(int a,custom *c)//进行资源分配函数
{

if(c->next==NULL)//是否为头节点的指针
{
fir=c;
c=c->next;//是的话,向后移一位,保留头节点位置
}
else
{
if(a>(int)c->need)//当前系统资源是否能满足节点所含进程的需求
{
a=a+(int)c->allocation;
if(c->next!=NULL)
{
fir->next=c->next;
c->next=NULL;
free(c);
commit(a,fir->next);
}
else
{
free(c);
}
}
}
return a;
}
int judge(int a,int b,int c)//判断分配后系统的安全性
{

custom *v,*r,*h;//虚拟链表所需指针
int s,f=0;
h=(custom *)malloc(sizeof(custom));
fir=head->next;
r=h;
for(int k=0;k {
v=(custom *)malloc(sizeof(custom));
v->need=fir->need;
v->allocation=fir->allocation;
fir=fir->next;
r->next=v;
r=v;
v->next=NULL;
}//虚拟链表建立完成
if(a>=(int)L->need)//判断当前进程请求是否能被满足
{
printf("剩余资源可供给使用。\n");
a=a+(L->allocation);
s=commit(b,h);//判断虚拟链表是否能找到一条安全序列,能的话进程全部运行完成后系统资源应重新归为最大资源量
if(s==c) f=1;//虚拟链表可以保证安全运行
}
return f;//返回判断值
}
int main()
{

int i,c,g,available,all,flag;
printf("系统所有剩余空闲资源数为:");
scanf("%d",&available);
all=available;
printf("请问共有几个进程存在:");
scanf("%d",&i);
printf("请输入各进程所需资源并分配初始资源:\n");
available=input(i,available);//输入所有进程,并返回剩余资源
printf("请输入允许发出请求的进程标识数:");
scanf("%d",&g);
find(g,i);//寻找请求资源的进程
i=i-1;
printf("%d号进程的请求资源数为:",g);
scanf("%d",&L->request);
c=available-(int)L->request;
printf("正在判断是否安全。。。");
flag=judge(available,i,all);//判断分配资源后系统是否安全,并返回是否安全
if(flag==1)//判断后flag=1,安全,分配资源
{
printf("请求安全,可以执行。");
available=commit(c,head);
if(available==all)
{
printf("分配资源完成!");
}
else
printf("未知的错误?");
}
else//flag=0,不安全,拒绝请求
{
printf("请求不安全,禁止执行!");
}
return 0;
}

2个回答

楼主在学习银行家算法?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问